Реверси java / отелло AI, измененная позиция AI не может быть сохранена в массиве
Ги дан, но не видно. Согласно порядку, я могу быть KIPlayer или человеком. Этот KIPlayer(AIPlayer) реализует интерфейс проигрывателя (). Внутри Player() есть два метода: init() и nextMove().
мой вопрос в nextMove().
мой логик nextMove ():
public Move nextMove (Move prevMove, long tOpponent, long t): else {
-save prevMove от конкурента в массиве
сохранить измененную позицию prevMove в массиве // это работает
-сохранить себя в массиве
-сохранить измененную позицию себя в массиве // здесь не работает, в коде это так: change(bestMove.x,bestMove.y, соперник);
без изменения (...) здесь, это работает, но каждый раз измененная позиция не будет сохранена, так что этот AIplayer потеряет. если код изменения (...) останется здесь, в консоли, до этого шага, это не работает ни на шаг. Как это исправить? Где я должен положить изменения (для KIPlayer) в моем коде?
} return bestMove;
package ki;
import szte.mi.Player;
import szte.mi.Move;
import szte.mi.*;
import java.util.ArrayList;
import java.util.List;
public class KIPlayer implements Player {
public int[][] array;
public int myself;
public int rival;
int sum=0;
int bestX=-1;
int bestY=-1;
Move bestMove;
public void init( int order, long t, java.util.Random rnd ) {
this.array=new int [8][8];
array[3][3]=2;
array[3][4]=1;
array[4][3]=1;
array[4][4]=2;
if(order==0){
myself=1;//black
rival=2;
}
else if(order==1){
myself=2;//white
rival=1;
}
System.out.println("Init called"+"myself is"+myself);
}
public Move nextMove(Move prevMove, long tOpponent, long t ) {
if(prevMove==null) {
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
if(array[3][3]==2 && array[3][4]==1 && array[4][3]==1 && array[4][4]==2 && array[i][j]==0) { //the first move
myself=1;
rival=2;
}
else {
switchPlayer(myself);
}
}
}
}
else {
// rival
array[prevMove.x][prevMove.y]=this.rival;
change(prevMove.x, prevMove.y, this.rival);
// KI / AI
bestMove= legalMove(rival,myself);
change(bestMove.x,bestMove.y,rival);// probelm here!--------it doens't work
//here is the question-----------------------------------
}
return bestMove;
//return legalMove(this.rival, this.myself);
}
public void switchPlayer(int myself) {
if(myself==1) {
myself=2;
rival=1;
}
else if(myself==2) {
myself=1;
rival=2;
}
}
public int getWeight(int x, int y) {
int weight[][]= new int[][]{{90,-60,10,10,10,10,-60,90},
{-60,-80,5,5,5,5,-80,-60},
{10,5,1,1,1,1,5,10},
{10,5,1,1,1,1,5,10},
{10,5,1,1,1,1,5,10},
{10,5,1,1,1,1,5,10},
{-60,-80,5,5,5,5,-80,-60},
{90,-60,10,10,10,10,-60,90}};
return weight[x][y];
}
public Move legalMove(int rival, int myself) {
int Max= -500;
for (int x=0;x<8;x++) {
for(int y=0;y<8;y++) {
if(this.array[x][y]==this.myself) {//position with same color of the player
System.out.println("myself in legalMove: "+ x+"+"+y);
int neighbour[][]= new int[3][3];
neighbour[1][1] = array[x][y]; // myself
neighbour[1][0] = array[x][y-1]; //up
neighbour[1][2] = array[x][y+1]; //down
neighbour[0][1] = array[x-1][y]; //left
neighbour[2][1] = array[x+1][y]; //right
neighbour[0][0] = array[x-1][y-1];//left upper
neighbour[2][0] = array[x+1][y-1];//right upper
neighbour[0][2] = array[x-1][y+1];//left down
neighbour[2][2] = array[x+1][y+1];//right down
//}
for(int j=0;j<3;j++) {
for(int i=0; i<3; i++) {
if(neighbour[i][j]!=-20 && neighbour[i][j]!= myself ){ //3x3
int NeighborX= x+(i-1);
int NeighborY= y+(j-1);
System.out.println("3x3 X:"+NeighborX+",Y: "+NeighborY);
if(array[NeighborX][NeighborY]==rival) {
while(array[NeighborX][NeighborY] == rival) { //neighbor extending --> edge
NeighborX=NeighborX+(i-1);
NeighborY=NeighborY+(j-1);
System.out.println("neighborX"+NeighborX+"neighborY"+NeighborY +"array[X][Y]"+array[NeighborX][NeighborY]);
if(array[NeighborX][NeighborY]==myself ||NeighborX>=7 || NeighborY>=7 || NeighborX<=0 || NeighborY<= 0) { //??????
break;
}
}
if(array[NeighborX][NeighborY]==0) { //whether the Extended neighbor is same as myself(m,n)
if(getWeight(NeighborX,NeighborY)>=Max ) {
Max=getWeight(NeighborX,NeighborY);
bestMove = new Move(NeighborX, NeighborY);
}
}
}
}
}
}
}
}
}
array[bestMove.x][bestMove.y]=this.myself;
return bestMove;
}
public void change(int x, int y, int rival) {
int neighborX=-10;
int neighborY=-10;
int extendedNeighborX=-10;
int extendedNeighborY=-10;
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
neighborX= x+(i-1);
neighborY= y+(j-1);
if(neighborX>=0 && neighborY>=0 && neighborX<8 && neighborY<8) {
if(array[neighborX][neighborY]==myself){
while(array[neighborX][neighborY]==myself) {
neighborX= neighborX+(i-1);
neighborY= neighborY+(j-1);
if(neighborX>7 || neighborY>7 || neighborX<0 || neighborY< 0) {
break;
}
}
extendedNeighborX= neighborX;
extendedNeighborY= neighborY;
while(extendedNeighborX<8 && extendedNeighborY<8 && extendedNeighborX>=0 && extendedNeighborY>=0 && array[extendedNeighborX][extendedNeighborY]==array[x][y] && !( extendedNeighborX==x && extendedNeighborY==y)) { // if a player enter() legally
extendedNeighborX=extendedNeighborX-(i-1);
extendedNeighborY=extendedNeighborY-(j-1);
this.array[extendedNeighborX][extendedNeighborY]=this.array[x][y];
}
}
}
}
}
}
}