1.基本思路
首先講一下這種算法的大概思路:
利用HashMap中key與value的對(duì)應(yīng)關(guān)系树叽。我們可以設(shè)置一個(gè)權(quán)值表载矿。
weightMap.put("00", 0);
weightMap.put("0", 0);
//定義活一連
weightMap.put("010", 1);
weightMap.put("0-10", 1);
//定義活二連
weightMap.put("0110", 4);
weightMap.put("0-1-10", 4);
就設(shè)置成這樣,給不同的情況設(shè)置一個(gè)value值蛮穿,即權(quán)值,來(lái)表示危險(xiǎn)程度。
當(dāng)人下棋時(shí)垒手,電腦下棋子在最大的地方阻止人贏。
當(dāng)電腦下棋時(shí)倒信,也選擇權(quán)值最大的地方讓電腦自己贏科贬。
這樣就只用每下一顆棋子,判斷一遍整個(gè)棋盤空的部分的權(quán)值鳖悠。
然后存入數(shù)組之中榜掌。篩選出權(quán)值最大的地方下棋。
2.部分代碼
for(int i=0;i<chessExist.length;i++){
for(int j=0;j<chessExist[0].length;j++){
if(chessExist[i][j]==0){
String code="0";
int chess=0;//判斷棋子出現(xiàn)次數(shù)
//判斷是否為空位
//判斷縱向向下方向
for(int k=1;k<=j;k++){
//如果向上的棋子是空棋
if(chessExist[i][j-k]==0){
//0的第一次出現(xiàn),加上自身code=0,那么就有兩個(gè)0連在一起了
code=chessExist[i][j-k]+code;
break;
}
//出現(xiàn)的是棋子的情況
else{
if(chess==0){
chess=chessExist[i][j-k];
code=chessExist[i][j-k]+code;
}
else if(chess==chessExist[i][j-k]){
code=chessExist[i][j-k]+code;
}else if(chess!=chessExist[i][j-k]){
code=chessExist[i][j-k]+code;
break;
}
}
}
weightchess[i][j]=weightMap.get(code)+weightchess[i][j];
//重置這些參數(shù)
code="0";
chess=0;
和判斷輸贏相同乘综,這只是一個(gè)方向上的判斷憎账。重置參數(shù)后繼續(xù)判斷其他方向,因?yàn)榇a都差不多卡辰,這里就不多寫了胞皱,需要源碼的可以留言交流
3.好處與弊端
好處:
這種寫法是一個(gè)可以累加的寫法邪意,你可以不斷的給HashMap添加權(quán)值,來(lái)豐富棋子的下法反砌,比如雙三的權(quán)值設(shè)置得更大一點(diǎn)雾鬼。讓別人用你的程序和AI下棋,如果AI輸了宴树,那么你就添加這種情況的權(quán)值策菜,這樣的話,AI的算法會(huì)隨著添加的情況數(shù)的增加越來(lái)越厲害酒贬。
我的AI現(xiàn)在已經(jīng)連我自己都下不贏了.......
弊端:
從上面可以看出又憨,這個(gè)AI要變得比較聰明需要很多的情況考慮,一開(kāi)始很容易考慮不完基本情況锭吨,可能運(yùn)行著突然就會(huì)爆一個(gè)莫名其妙的錯(cuò)蠢莺,比如找不到對(duì)應(yīng)的權(quán)值,空指針異常耐齐。所以還是比較危險(xiǎn)的浪秘。
更好的方法推薦α-β剪枝算法。這個(gè)算法就不用這樣不斷的去添加情況埠况。
該方法將在后續(xù)分享給大家耸携。網(wǎng)上也有很多這樣的例子。
進(jìn)群:697699179可以獲取Java各類入門學(xué)習(xí)資料辕翰!
這是我的微信公眾號(hào)【編程study】各位大佬有空可以關(guān)注下夺衍,每天更新Java學(xué)習(xí)方法,感謝喜命!
學(xué)習(xí)中遇到問(wèn)題有不明白的地方沟沙,推薦加小編Java學(xué)習(xí)群:697699179內(nèi)有視頻教程 ,直播課程 壁榕,等學(xué)習(xí)資料矛紫,期待你的加入