1. 程式人生 > >Java遞迴實現圍棋提子思想

Java遞迴實現圍棋提子思想

在製作圍棋遊戲的時候
一般來說會有兩個問題

  1. 圍棋提子的演算法思想
  2. Ai走子的演算法思想

由於ai走子的演算法思想確實太過於難了,牽扯到深度學習的東西
這裡就不進行闡述了
畢竟我也根本不會

我將闡述的是圍棋提子的思想
我是使用遞迴的思想來解決的

  1. 當一名玩家下了一步棋之後,首先看這步棋的四面八方有沒有不同顏色的棋子
  2. 如果有,則有這個棋子的物件作為形參,開始判斷他的四周為空、異色棋子或者同色棋子
  3. 如果是異色棋子,返回true
  4. 如果是同色棋子,將自己標記,並對那個同色棋子執行一下自己這個方法本體
  5. 如果是空,令氣加一,並放回false
  6. 如果與操作能順利進行,並且氣等於0,則依次吃掉所有棋子

其實說實話,只要理清楚了,其實並不難的

示例程式碼:
package cn.weiqi.function;

import cn.weiqi.qipan.QiPan;
import cn.weiqi.qizi.QiZiColor;

public class EatedQiZi {

private QiPan qiPan;
private QiZiColor qiZiColor;

public EatedQiZi(QiPan qiPan, QiZiColor qiZiColor) {
    this.qiPan = qiPan;
    this.qiZiColor = qiZiColor;
}


public boolean eatedQiZi(int X, int Y, int qi) {
    if(!isYueJie(X, Y) && !isBiaoJi(X, Y) && !isColorSame(X, Y)) {
        if(
                (isYueJie(X+1, Y) || isQiZiSave(X+1, Y)) && 
                (isYueJie(X-1, Y) || isQiZiSave(X-1, Y)) && 
                (isYueJie(X, Y+1) || isQiZiSave(X, Y+1)) && 
                (isYueJie(X, Y-1) || isQiZiSave(X, Y-1))
                ) {
            biaoji(X, Y);

            if(
                    (isYueJie(X+1, Y) || isColorSame(X+1, Y) || isBiaoJi(X+1, Y)) && 
                    (isYueJie(X-1, Y) || isColorSame(X-1, Y) || isBiaoJi(X-1, Y)) && 
                    (isYueJie(X, Y+1) || isColorSame(X, Y+1) || isBiaoJi(X, Y+1)) &&
                    (isYueJie(X, Y-1) || isColorSame(X, Y-1) || isBiaoJi(X, Y-1)) &&
                    qi == 0) {
                killQiZi(X, Y);
                return true;
            }else if(
                    eatedQiZi(X+1, Y, qi) && 
                    eatedQiZi(X-1, Y, qi) && 
                    eatedQiZi(X, Y+1, qi) &&
                    eatedQiZi(X, Y-1, qi) &&
                    qi == 0) {
                killQiZi(X, Y);
                return true;
            }else {
                rebiaoji(X, Y);
                return false;
            }
        }else {
            qi += 1;
            return false;
        }
    }else {
        return true;
    }
}

private void killQiZi(int X, int Y) {
    qiPan.getQiPan()[X][Y] = null;
}
private void biaoji(int X, int Y) {
    qiPan.getQiPan()[X][Y].biaoji = 1;
}
private void rebiaoji(int X, int Y) {
    qiPan.getQiPan()[X][Y].biaoji = 0;
}
private boolean isYueJie(int X, int Y) {
    if(X<0 || X>18 || Y<0 || Y>18) {
        return true;
    }else {
        return false;
    }
}
private boolean isQiZiSave(int X, int Y) {
    if(qiPan.getQiPan()[X][Y] != null) {
        return true;
    }else{
        return false;
    }
}
private boolean isBiaoJi(int X, int Y) {
    if(qiPan.getQiPan()[X][Y].biaoji == 1) {
        return true;
    }else{
        return false;
    }
}
private boolean isColorSame(int X, int Y) {
    if(qiPan.getQiPan()[X][Y].getQiZiColor() == this.qiZiColor) {
        return true;
    }else{
        return false;
    }
}

}