[Java] 将棋アルゴリズムを作る。~コンピュータと対戦~

Java

実行結果

続き

こんな感じになりました。

あとは対戦相手のコマを成るかどうかぐらいですかね。

まだ動かせるコマをランダムに選択して動かすプログラムだけなので、

戦略なんかも勉強してどんどんコンピュターのレベルを上げていきたいです。

今回は以上となります。

ではまた。

class TacticsThread extends Thread{
    public void run(){
        try{
            Thread.sleep(2000);
            ArrayList<Point> Setable=new ArrayList<Point>();
            Random r=new Random(System.currentTimeMillis());
            int rand=0;
            if(enemyKoma.size()>0){
                System.out.println("enemyKoma.size()="+enemyKoma.size());
                if(board.enemyKoma[rand].getObverse()!=Koma.none){
                    ArrayList<Integer> stack_j=new ArrayList<Integer>(); // 歩がある列のリスト
                    for(int i=0; i<9; i++){
                        if(enemyKoma.get(rand)==Koma.kei && (i==7 || i==8))
                            continue;
                        if((enemyKoma.get(rand)==Koma.fu || enemyKoma.get(rand)==Koma.kyo || enemyKoma.get(rand)==Koma.silver) && (i==8))
                            continue;
                        for(int j=0; j<9; j++){
                            if(board.koma[i][j].getObverse()==Koma.none){
                                board.move[i][j].setPlace(Move.can);
                                System.out.println("セットしました"+i+","+j);
                            }
                            if(board.koma[i][j].getObverse()==Koma.fu && board.teban[i][j].getKomaType()==Teban.enemy && enemyKoma.get(rand)==Koma.fu)
                                stack_j.add(j);
                            if(board.koma[i][j].getObverse()==Koma.king && enemyKoma.get(rand)==Koma.fu){
                                board.move[i-1][j].setPlace(Move.cannot);
                                System.out.println("歩で王手はセットできません"+i+","+j);
                            }
                        }
                    }
                    for(int i=0; i<stack_j.size(); i++){
                        for(int j=0; j<9; j++){
                            board.move[j][stack_j.get(i)].setPlace(Move.cannot);
                            System.out.println("セットできません"+i+","+j);
                        }
                    }
                }
                for(int i=0; i<9; i++){
                    for(int j=0; j<9; j++){
                        if(board.move[i][j].getPlace()==Move.can)
                            Setable.add(new Point(j,i));
                    }
                }
            }

            System.out.println("Setable: "+Setable);

            if(Setable.size()==0 || enemyKoma.size()==0){
                ArrayList<Point> cpList=new ArrayList<Point>();
                Point oldPoint=new Point();
                Point newPoint=new Point();
                int random=0;
                System.out.println("turn:"+turn);
                do{
                    oldPoint=player[turn-1].nextMove(board,new Point(-1,-1));
                    System.out.println(oldPoint);
                    cpList=board.canMoveList(oldPoint.x,oldPoint.y,board.direction);
                }while(cpList.size()<=0);
                System.out.println("oldPoint:"+oldPoint);
                System.out.println(cpList);
                r=new Random(System.currentTimeMillis());
                do{
                    random=r.nextInt(cpList.size());
                    System.out.println("random"+random);
                }while(random<0);
                newPoint=cpList.get(random);
                System.out.println("oldPoint:"+oldPoint);
                System.out.println("newPoint:"+newPoint);
                if(board.teban[newPoint.y][newPoint.x].getKomaType()==Teban.you){
                    if(board.koma[newPoint.y][newPoint.x].getObverse()>Koma.evolution)
                        enemyKoma.add(board.koma[newPoint.y][newPoint.x].getObverse()-Koma.evolution);
                    else
                        enemyKoma.add(board.koma[newPoint.y][newPoint.x].getObverse());
                }
                if(board.koma[newPoint.y][newPoint.x].getObverse()==Koma.king)
                    EndMessageDialog("対戦相手の勝ちです");
                board.setKomaAndTeban(oldPoint,newPoint,board.koma[oldPoint.y][oldPoint.x].getObverse(),Teban.enemy);
            }
            else{
                int random=r.nextInt(Setable.size());
                System.out.println("Setable.size()="+Setable.size());
                System.out.println("rand="+rand);
                System.out.println("x="+Setable.get(random).x+" y="+Setable.get(random).y+" enemyKoma.get(rand)="+enemyKoma.get(rand));
                board.setTeban(Setable.get(random).x,Setable.get(random).y,Teban.enemy);
                board.setKoma(Setable.get(random).x,Setable.get(random).y,enemyKoma.get(rand));
                enemyKoma.set(rand,Koma.none);
            }

            for(int i=0; i<9; i++){
                for(int j=0; j<9; j++){
                    if(board.move[i][j].getPlace()==Move.can)
                        board.move[i][j].setPlace(Move.cannot);
                }
            }
            Collections.sort(enemyKoma,Collections.reverseOrder());
            changeTurn();
            repaint();
            board.printBoard();
        } catch(InterruptedException ie){
            ie.printStackTrace();
        }
    }
}
Point Tactics(Board bd){ 
    int random=0;
    ArrayList<Point> point =new ArrayList<Point>();
    for(int i=0; i<9; i++){
        for(int j=0; j<9; j++){
            if(bd.teban[i][j].getKomaType()==Teban.enemy)
                point.add(new Point(j,i)); //対戦相手の全てのコマの場所を取得する
        }
    }
    System.out.println(point);
    do{
        Random r=new Random(System.currentTimeMillis());
        random=r.nextInt(point.size());
    }while(random<0);
    return point.get(random); //対戦相手の全てのコマの中からランダムに選択する
}

コメント

タイトルとURLをコピーしました