當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
用javascript实现五子棋(二)
生活随笔
收集整理的這篇文章主要介紹了
用javascript实现五子棋(二)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前面已經(jīng)實現(xiàn)了整個游戲流程,現(xiàn)在講五子棋AI的實現(xiàn),五子棋AI的實現(xiàn)方法主要是以下幾種:
1.查表法,保存一些棋譜,電腦下棋的時候自動匹配
2.分值法:對棋盤上的每一個空位進(jìn)行檢索,假設(shè)這個空位放某種棋子,然后根據(jù)不同的情況給出不同的分值,在分值最高的地方下棋
3.博弈樹:列出所有情況,用極大極小值搜索選出最佳路徑
4.電腦每次輸?shù)羝寰趾?#xff0c;保存記錄,以后不再重復(fù)
這里只說分值法:我的想法是把棋子的狀態(tài)分出來:活1,死1,活2,死2,眠2,活3,死3,眠3,活4,死4,眠4,成5
這里有些情況的效果是一樣的比如,成5,活4,雙活3,雙眠4這些都是必贏的,好了不說了,上代碼最直觀
/**五子棋AI*思路:對棋盤上的每一個空格進(jìn)行估分,電腦優(yōu)先在分值高的點落子* 棋型:* 〖五連〗只有五枚同色棋子在一條陽線或陰線上相鄰成一排* 〖成五〗含有五枚同色棋子所形成的連,包括五連和長連。* 〖活四〗有兩個點可以成五的四。* 〖沖四〗只有一個點可以成五的四。* 〖死四〗不能成五的四。* 〖三〗在一條陽線或陰線上連續(xù)相鄰的5個點上只有三枚同色棋子的棋型。* 〖活三〗再走一著可以形成活四的三。* 〖連活三〗即:連的活三(同色棋子在一條陽線或陰線上相鄰成一排的活三)。簡稱“連三”。* 〖跳活三〗中間隔有一個空點的活三。簡稱“跳三”。* 〖眠三〗再走一著可以形成沖四的三。* 〖死三〗不能成五的三。* 〖二〗在一條陽線或陰線上連續(xù)相鄰的5個點上只有兩枚同色棋子的棋型。* 〖活二〗再走一著可以形成活三的二。* 〖連活二〗即:連的活二(同色棋子在一條陽線或陰線上相鄰成一排的活二)。簡稱“連二”。* 〖跳活二〗中間隔有一個空點的活二。簡稱“跳二”。* 〖大跳活二〗中間隔有兩個空點的活二。簡稱“大跳二”。* 〖眠二〗再走一著可以形成眠三的二。* 〖死二〗不能成五的二。* 〖先手〗對方必須應(yīng)答的著法,相對于先手而言,沖四稱為“絕對先手”。* 〖三三〗一子落下同時形成兩個活三。也稱“雙三”。* 〖四四〗一子落下同時形成兩個沖四。也稱“雙四”。* 〖四三〗一子落下同時形成一個沖四和一個活三。* 分值表* 成5:100000分* 活4:10000分* 活3+沖4:5000分* 眠3+活2:2000分* 眠2+眠1:1分* 死棋即不能成5的是0分* @return {[type]} [description]*/ function getPosition() {var a = new Array(2);var score = 0;for (var x = 0; x < 15; x++) {for (var y = 0; y < 15; y++) {if (chessData[x][y] == 0) {if (judge(x, y) > score) {score = judge(x, y);a[0] = x;a[1] = y;}}}}return a; }function AIplay() {var str = getPosition();// console.log("智能AI將在下面坐標(biāo)下棋:" + str[0] + "," + str[1]);doCheck(str[0], str[1]); }function judge(x, y) {var a = parseInt(leftRight(x, y, 1)) + parseInt(topBottom(x, y, 1)) + parseInt(rightBottom(x, y, 1)) + parseInt(rightTop(x, y, 1))+100; //判斷白棋走該位置的得分var b = parseInt(leftRight(x, y, 2)) + parseInt(topBottom(x, y, 2)) + parseInt(rightBottom(x, y, 2)) + parseInt(rightTop(x, y, 2)); //判斷黑棋走該位置的得分var result = a + b;// console.log("我計算出了" + x + "," + y + "這個位置的得分為" + result);return result; //返回黑白棋下該位置的總和 }function leftRight(x, y, num) {var death = 0; //0表示兩邊都沒堵住,且可以成5,1表示一邊堵住了,可以成5,2表示是死棋,不予考慮var live = 0;var count = 0;var arr = new Array(15);for (var i = 0; i< 15; i++) {arr[i] = new Array(15);for (var j = 0; j < 15; j++) {arr[i][j] = chessData[i][j];}}arr[x][y] = num;for (var i = x; i >= 0; i--) {if (arr[i][y] == num) {count++;} else if (arr[i][y] == 0) {live += 1; //空位標(biāo)記i = -1;} else {death += 1; //顏色不同是標(biāo)記一邊被堵住i = -1;}}for (var i = x; i <= 14; i++) {if (arr[i][y] == num) {count++;} else if (arr[i][y] == 0) {live += 1; //空位標(biāo)記i = 100;} else {death += 1;i = 100;}}count -= 1;// console.log(x + "," + y + "位置上的左右得分為" + model(count, death));return model(count, death); }function topBottom(x, y, num) {var death = 0; //0表示兩邊都沒堵住,且可以成5,1表示一邊堵住了,可以成5,2表示是死棋,不予考慮var live = 0;var count = 0;var arr = new Array(15);for (var i = 0; i< 15; i++) {arr[i] = new Array(15);for (var j = 0; j < 15; j++) {arr[i][j] = chessData[i][j];}}arr[x][y] = num;for (var i = y; i >= 0; i--) {if (arr[x][i] == num) {count++;} else if (arr[x][i] == 0) {live += 1; //空位標(biāo)記i = -1;} else {death += 1;i = -1;}}for (var i = y; i <= 14; i++) {if (arr[x][i] == num) {count++;} else if (arr[x][i] == 0) {live += 1; //空位標(biāo)記i = 100;} else {death += 1;i = 100;}}count -= 1;// console.log(x + "," + y + "位置上的上下斜得分為" + model(count, death));return model(count, death); }function rightBottom(x, y, num) {var death = 0; //0表示兩邊都沒堵住,且可以成5,1表示一邊堵住了,可以成5,2表示是死棋,不予考慮var live = 0;var count = 0;var arr = new Array(15);for (var i = 0; i< 15; i++) {arr[i] = new Array(15);for (var j = 0; j < 15; j++) {arr[i][j] = chessData[i][j];}}arr[x][y] = num;for (var i = x, j = y; i >= 0 && j >= 0;) {if (arr[i][j] == num) {count++;} else if (arr[i][j] == 0) {live += 1; //空位標(biāo)記i = -1;} else {death += 1;i = -1;}i--;j--;}for (var i = x, j = y; i <= 14 && j <= 14;) {if (arr[i][j] == num) {count++;} else if (arr[i][j] == 0) {live += 1; //空位標(biāo)記i = 100;} else {death += 1;i = 100;}i++;j++;}count -= 1;// console.log(x + "," + y + "位置上的右下斜得分為" + model(count, death));return model(count, death); }function rightTop(x, y, num) {var death = 0; //0表示兩邊都沒堵住,且可以成5,1表示一邊堵住了,可以成5,2表示是死棋,不予考慮var live = 0;var count = 0;var arr = new Array(15);for (var i = 0; i< 15; i++) {arr[i] = new Array(15);for (var j = 0; j < 15; j++) {arr[i][j] = chessData[i][j];}}arr[x][y] = num;for (var i = x, j = y; i >= 0 && j <= 14;) {if (arr[i][j] == num) {count++;} else if (arr[i][j] == 0) {live += 1; //空位標(biāo)記i = -1;} else {death += 1;i = -1;}i--;j++;}for (var i = x, j = y; i <= 14 && j >= 0;) {if (arr[i][j] == num) {count++;} else if (arr[i][j] == 0) {live += 1; //空位標(biāo)記i = 100;} else {death += 1;i = 100;}i++;j--;}count -= 1;// console.log(x + "," + y + "位置上的右上斜得分為" + model(count, death));return model(count, death); } /**羅列相等效果的棋型(此處只考慮常見的情況,雙成五,雙活四等少概率事件不考慮)* 必勝棋:成五=活四==雙活三=沖四+活三=雙沖四* * * */ function model(count, death) {// console.log("count" + count + "death" + death);var LEVEL_ONE = 0;//單子var LEVEL_TWO = 1;//眠2,眠1var LEVEL_THREE = 1500;//眠3,活2var LEVEL_FOER = 4000;//沖4,活3var LEVEL_FIVE = 10000;//活4var LEVEL_SIX = 100000;//成5if (count == 1 && death == 1) {return LEVEL_TWO; //眠1} else if (count == 2) {if (death == 0) {return LEVEL_THREE; //活2} else if (death == 1) {return LEVEL_TWO; //眠2} else {return LEVEL_ONE; //死棋}} else if (count == 3) {if (death == 0) {return LEVEL_FOER; //活3} else if (death == 1) {return LEVEL_THREE; //眠3} else {return LEVEL_ONE; //死棋}} else if (count == 4) {if (death == 0) {return LEVEL_FIVE; //活4} else if (death == 1) {return LEVEL_FOER; //沖4} else {return LEVEL_ONE; //死棋}} else if (count == 5) {return LEVEL_SIX; //成5}return LEVEL_ONE; } </script> </html>源碼http://pan.baidu.com/s/1sjONm01總結(jié)
以上是生活随笔為你收集整理的用javascript实现五子棋(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【考研笔记】数学一 · 高等数学笔记
- 下一篇: JSP+ssm计算机毕业设计宠物狗网店管