From 3613db003f33c537c08518cd78d02dc4f6d9ee82 Mon Sep 17 00:00:00 2001 From: 63db3122f0950a2aef64df95 <63db3122f0950a2aef64df95@devide> Date: Wed, 26 Jul 2023 19:58:00 +0800 Subject: [PATCH] Wed Jul 26 19:58:00 CST 2023 inscode --- src/utils/index.js | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/utils/index.js b/src/utils/index.js index e9e1247..32a3e82 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -97,14 +97,29 @@ export function checkWin({ row, col, board, player, win_size }) { * @returns {number[]} */ export function robotPlay(board, win_size) { + const pan_info = { + ROW: board.length, + COL: board[0].length, + OBJ: board.reduce((r, r_item, r_index) => { + return { + ...r, + ...r_item.reduce((c, c_item, c_index) => { + return { + ...c, + [`${r_index}_${c_index}`]: c_item + } + }, {}) + } + }, {}) + } // 空位 对每个空位进行评分 const scores = board.map((item, row) => { return item.flatMap((_item, col) => { if (_item === is_empty) { // 评估每个空位置的价值,从八个方向去计算 const score = directions.reduce((r, [y, x]) => { - r[is_black] += getDirectionScore(board, row, col, [y, x], win_size, is_black) - r[is_white] += getDirectionScore(board, row, col, [y, x], win_size, is_white) + r[is_black] += getDirectionScore(pan_info, row, col, [y, x], win_size, is_black) + r[is_white] += getDirectionScore(pan_info, row, col, [y, x], win_size, is_white) return r }, { [is_black]: 0, @@ -174,13 +189,11 @@ export function robotPlay(board, win_size) { * @param {number} col 列 * @return {[number, number, number]} [空位数,棋子数,距离障碍物的距离] */ -function getDirectionsInfo(board, row, col, [y, x], player) { - const ROW = board.length - const COL = board[0].length +function getDirectionsInfo({ ROW, COL, OBJ }, row, col, [y, x], player) { // 连续棋子数 let piece_num = 0 // 棋子前面的空格数 - let first_empty_num = 0 + let empty_num = 0 // 距离障碍物的距离 let obstacle_num = 0 // 不包括当前位置 @@ -190,26 +203,29 @@ function getDirectionsInfo(board, row, col, [y, x], player) { const villain = player === is_black ? is_white : is_black; while (inRange(_row, ROW) && inRange(_col, COL)) { - const item = board[_row][_col] + const item = OBJ[`${_row}_${_col}`] + if (item === villain) { break; } // 连珠计数 - if (!first_empty_num && item === player) { + if (!empty_num && item === player) { piece_num += 1 } // 计算棋子前面的空格数 if (item === is_empty) { - first_empty_num += 1 + empty_num += 1 } // 计算棋子后面的空格数 _row += y _col += x + + obstacle_num += 1 } return [ + empty_num, piece_num, - first_empty_num, obstacle_num ] } @@ -222,9 +238,9 @@ function getDirectionsInfo(board, row, col, [y, x], player) { * @param {number} win_size 需要几个棋子才赢 * @returns {number} 分数 */ -function getDirectionScore(board, row, col, [y, x], win_size, player) { - const [r_empty_num, r_piece_num, r_obstacle_num] = getDirectionsInfo(board, row, col, [y, x], player) - const [l_empty_num, l_piece_num, l_obstacle_num] = getDirectionsInfo(board, row, col, [y * -1, x * -1], player) +function getDirectionScore(pan_info, row, col, [y, x], win_size, player) { + const [r_empty_num, r_piece_num, r_obstacle_num] = getDirectionsInfo(pan_info, row, col, [y, x], player) + const [l_empty_num, l_piece_num, l_obstacle_num] = getDirectionsInfo(pan_info, row, col, [y * -1, x * -1], player) const SIZE = r_piece_num + l_piece_num // 没有棋子 -- GitLab