Реверси 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];  

                    }


                }

            }
        }
    }
}

}

0 ответов

Другие вопросы по тегам