五子棋AI算法简易实现(一)
2018-03-05 22:33
756 查看
基础篇
(1)胜负判定
五子棋的胜负判定的条件是其中一方下棋以后,横线、竖线、右上斜线或者右下斜线任一方向出现五子相连,即可判定获胜。此处用递归方法即可实现。var is_win = false; var ModuleWinnerCheck = { checkWinner: function(color, num) { var col = num % 15; var row = (num-col) / 15; map[row][col] = color; var count = 1; is_win = this._checkControl(row, col, color); if(is_win) return -1; else return num; }, _checkControl: function(row, col, color) { //递归后当前位置的下子会重复计数,因此结果要减1 if(this._checkWinnerScan(row, col, color, 0) + this._checkWinnerScan(row, col, color, 4) - 1 < 5) if(this._checkWinnerScan(row, col, color, 1) + this._checkWinnerScan(row, col, color, 5) - 1 < 5) if(this._checkWinnerScan(row, col, color, 2) + this._checkWinnerScan(row, col, color, 6) - 1 < 5) if(this._checkWinnerScan(row, col, color, 3) + this._checkWinnerScan(row, col, color, 7) - 1 < 5) return false; return true; }, _checkWinnerScan: function(row, col, color, state) { //数组越界或者连子中断时,结束递归 if(row < 0 || row > 14 || col < 0 || col > 14 || map[row][col] != color){ return 0; } else if(!is_win && state == 0){ return 1 + this._checkWinnerScan(row-1, col, color, 0); } else if(!is_win && state == 1){ return 1 + this._checkWinnerScan(row-1, col+1, color, 1); } else if(!is_win && state == 2){ return 1 + this._checkWinnerScan(row, col+1, color, 2); } else if(!is_win && state == 3){ return 1 + this._checkWinnerScan(row+1, col+1, color, 3); } else if(!is_win && state == 4){ return 1 + this._checkWinnerScan(row+1, col, color, 4); } else if(!is_win && state == 5){ return 1 + this._checkWinnerScan(row+1, col-1, color, 5); } else if(!is_win && state == 6){ return 1 + this._checkWinnerScan(row, col-1, color, 6); } else if(!is_win && state == 7){ return 1 + this._checkWinnerScan(row-1, col-1, color, 7); } else{ return 0; } } };
用途解析
五子棋的棋盘大小为 15 * 15,因此我们使用一个 15 * 15 大小的二维数组即可将其表现出来以上这段代码就是利用递归的方式在记录下子位置的棋盘上进行胜负的判定
函数说明
checkWinner(color, num)传入的两个参数分别代表当前棋手所持的颜色(color)和当前下棋的位置的编号(num){范围是:0-255}
_checkControl(row, col, color)
传入的三个参数分别代表num经过处理后得到的在二维数组中的当前位置(row:行;col:列)以及当前棋手所持的颜色(color)
_checkWinnerScan(row, col, color, state)
前三个参数与上面的参数意义相同,最后一个参数是当前递归搜索的模式(state:0-7),表示从竖直往上开始顺时针旋转的八个方向,即 ↑(0),↗(1),→(2),↘(3),↓(4),↙(5),←(6),↖(7)
项目地址:https://github.com/huangzhutao/Gomoku.git
相关文章推荐
- 五子棋AI算法简易实现(三)
- 五子棋AI算法简易实现(七)
- 五子棋AI算法简易实现(五)
- 五子棋AI算法简易实现(六)
- 五子棋AI算法简易实现(二)
- 基于C++实现五子棋AI算法思想
- 人机ai五子棋 ——五子棋AI算法之Java实现
- 【五子棋AI】启发算法——PV与杀手启发
- 实现简易字符串压缩算法:由字母a-z或者A-Z组成,将其中连续出现2次以上(含2次)的字母转换为字母和出现次数,
- AI——Lisp语言实现 合一算法
- 算法----约瑟夫环的简易实现
- 五子棋AI图形界面人机对战(JAVA实现)
- 五子棋AI算法第五篇-算杀
- 简易 bokeh 图像散景效果算法实现
- AI实现五子棋机器人(一)
- 五子棋AI循序渐进【1】实现界面和位棋盘
- [深度学习]实现一个博弈型的AI,从五子棋开始
- Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
- Cocos2d-x制作跳棋第三步:棋子动作实现及AI算法思想
- 【五子棋AI】启发算法——VCF/VCT搜索