1. 程式人生 > >五子棋AI演算法簡易實現(一)

五子棋AI演算法簡易實現(一)

基礎篇

(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)