diff --git a/src/utils/index.js b/src/utils/index.js index 02f29dea0e9e9b5f6f34ea4a93cbd11a8a5fdb4b..932f77fbd959c2cd2711132bf8ebf6264942dff6 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -68,30 +68,25 @@ export function checkWin({ row, col, board, player, win_size }) { export function robotPlay(board, win_size) { let maxScorePos = []; let maxScore = -1; - // 空位 - const empty_points = board.map((item, row) => { - return item.flatMap((_item, col) => _item === is_empty ? [[row, col]] : []) - }).flat(1) - - // 对每个空位进行评分 - for (let e_i = 0; e_i < empty_points.length; e_i++) { - const point = empty_points[e_i] - - let score = 0; - const [row, col] = point; - - // 评估每个空位置的价值,从八个方向去计算 - score = directions.reduce((r, [y, x]) => { - const square = getDirectionScore(board, row, col, [y, x], win_size) + getDirectionScore(board, row, col, [y * -1, x * -1], win_size) - return r + (10 ** square) - }, 0) - - // 选取分数最高的空位 - if (score >= maxScore) { - maxScorePos = [row, col]; - maxScore = score; - } - }; + // 空位 对每个空位进行评分 + board.map((item, row) => { + return item.map((_item, col) => { + if (_item === is_empty) { + let score = 0; + // 评估每个空位置的价值,从八个方向去计算 + score = directions.reduce((r, [y, x]) => { + const square = getDirectionScore(board, row, col, [y, x], win_size) + return r + (10 ** square) + }, 0) + + // 选取分数最高的空位 + if (score >= maxScore) { + maxScorePos = [row, col]; + maxScore = score; + } + } + }) + }) return maxScorePos; } @@ -120,13 +115,13 @@ export function robotPlay(board, win_size) { * @param {number} num */ function getBoundary(size, num) { - const HALF = size / 2 - + const HALF = Math.floor(size / 2) // 先下取整 return (num > HALF ? size - num : num) + 1 // 当前位置算进去 } /** - * 获取一个一个方向上的棋子数 + * 获取一个方向上的棋子数,八个方向 + * @param {(is_empty|is_white|is_black)[]} board 棋盘 * @param {number} row 行 y * @param {number} col 列 x * @param {(is_empty|is_white|is_black)[]} board 棋盘 @@ -134,11 +129,12 @@ function getBoundary(size, num) { * @returns */ function getDirectionScore(board, row, col, [y, x], win_size) { - const ROW = board.length - const COL = board[0].length let res = 0 + let _res = 0 let _row = row + y let _col = col + x + const ROW = board.length + const COL = board[0].length while (true) { if (_row < 0 || _col < 0 || !board[_row] || board[_row][_col] !== is_black) { break; @@ -147,7 +143,20 @@ function getDirectionScore(board, row, col, [y, x], win_size) { _row += y _col += x } + + _row = row - y + _col = col - x + while (true) { + if (_row < 0 || _col < 0 || !board[_row] || board[_row][_col] !== is_black) { + break; + } + _res += 1 + _row -= y + _col -= x + } + // 横线判断 + const distance = getBoundary(COL, col) // 判断边距 - return res + return res + _res }