基于SpringBoot的AI游戏对战平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

95 lines
2.7 KiB

package com.kob.botRunningSystem.utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Bot implements java.util.function.Supplier<Integer>{
@Override
public Integer get() {
File file = new File("input.txt");
try {
Scanner sc = new Scanner(file);
return nextMove(sc.next());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
static class Cell{
public int x,y;
public Cell(int x,int y) {
this.x = x;
this.y = y;
}
}
private boolean check_tail_increasing(int steps) {
if (steps <= 10) {
return true;
}
if (steps % 3 == 1) {
return true;
}
return false;
}
public List<Cell> getCells(int sx,int sy,String steps) {
steps = steps.substring(1,steps.length() - 1); // 去掉编码时加的'()'
List<Cell> res = new ArrayList<>();
int []dx = {-1,0,1,0}, dy = {0,1,0,-1};
int x = sx, y = sy;
int step = 0;
res.add(new Cell(x,y));
for (int i = 0; i < steps.length(); i++) {
int d = steps.charAt(i) - '0';
x += dx[d];
y += dy[d];
res.add(new Cell(x,y));
step++;
if (!check_tail_increasing(step)) {
res.remove(0);
}
}
return res;
}
public Integer nextMove(String input) {
String[] strs = input.split("#");
int [][] g = new int[13][14];
for (int i = 0,k = 0; i < 13; i++) {
for (int j = 0; j < 14; j++,k++) {
if (strs[0].charAt(k) == '1')
g[i][j] = 1;
}
}
int aSx = Integer.parseInt(strs[1]), aSy = Integer.parseInt(strs[2]);
int bSx = Integer.parseInt(strs[4]), bSy = Integer.parseInt(strs[5]);
// 蛇的身体标记为1
List<Cell> cellsA = getCells(aSx,aSy,strs[3]);
List<Cell> cellsB = getCells(bSx,bSy,strs[6]);
for (Cell c: cellsA) g[c.x][c.y] = 1;
for (Cell c: cellsB) g[c.x][c.y] = 1;
int[] dx = {-1,0,1,0};
int[] dy = {0,1,0,-1};
for (int i = 0; i < 4; i++) {
// 蛇尾坐标,cellsA表示自己的那条蛇
int x = cellsA.get(cellsA.size() - 1).x + dx[i];
int y = cellsA.get(cellsA.size() - 1).y + dy[i];
if (x >= 0 && x < 13 && y >= 0 && y < 14 && g[x][y] == 0) {
return i; // 可以走的位置
}
}
return 0; // 向上走
}
}