Wed Jul 26 19:58:00 CST 2023 inscode

上级 1f6e752b
...@@ -97,14 +97,29 @@ export function checkWin({ row, col, board, player, win_size }) { ...@@ -97,14 +97,29 @@ export function checkWin({ row, col, board, player, win_size }) {
* @returns {number[]} * @returns {number[]}
*/ */
export function robotPlay(board, win_size) { 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) => { const scores = board.map((item, row) => {
return item.flatMap((_item, col) => { return item.flatMap((_item, col) => {
if (_item === is_empty) { if (_item === is_empty) {
// 评估每个空位置的价值,从八个方向去计算 // 评估每个空位置的价值,从八个方向去计算
const score = directions.reduce((r, [y, x]) => { const score = directions.reduce((r, [y, x]) => {
r[is_black] += getDirectionScore(board, row, col, [y, x], win_size, is_black) r[is_black] += getDirectionScore(pan_info, row, col, [y, x], win_size, is_black)
r[is_white] += getDirectionScore(board, row, col, [y, x], win_size, is_white) r[is_white] += getDirectionScore(pan_info, row, col, [y, x], win_size, is_white)
return r return r
}, { }, {
[is_black]: 0, [is_black]: 0,
...@@ -174,13 +189,11 @@ export function robotPlay(board, win_size) { ...@@ -174,13 +189,11 @@ export function robotPlay(board, win_size) {
* @param {number} col 列 * @param {number} col 列
* @return {[number, number, number]} [空位数,棋子数,距离障碍物的距离] * @return {[number, number, number]} [空位数,棋子数,距离障碍物的距离]
*/ */
function getDirectionsInfo(board, row, col, [y, x], player) { function getDirectionsInfo({ ROW, COL, OBJ }, row, col, [y, x], player) {
const ROW = board.length
const COL = board[0].length
// 连续棋子数 // 连续棋子数
let piece_num = 0 let piece_num = 0
// 棋子前面的空格数 // 棋子前面的空格数
let first_empty_num = 0 let empty_num = 0
// 距离障碍物的距离 // 距离障碍物的距离
let obstacle_num = 0 let obstacle_num = 0
// 不包括当前位置 // 不包括当前位置
...@@ -190,26 +203,29 @@ function getDirectionsInfo(board, row, col, [y, x], player) { ...@@ -190,26 +203,29 @@ function getDirectionsInfo(board, row, col, [y, x], player) {
const villain = player === is_black ? is_white : is_black; const villain = player === is_black ? is_white : is_black;
while (inRange(_row, ROW) && inRange(_col, COL)) { while (inRange(_row, ROW) && inRange(_col, COL)) {
const item = board[_row][_col] const item = OBJ[`${_row}_${_col}`]
if (item === villain) { if (item === villain) {
break; break;
} }
// 连珠计数 // 连珠计数
if (!first_empty_num && item === player) { if (!empty_num && item === player) {
piece_num += 1 piece_num += 1
} }
// 计算棋子前面的空格数 // 计算棋子前面的空格数
if (item === is_empty) { if (item === is_empty) {
first_empty_num += 1 empty_num += 1
} }
// 计算棋子后面的空格数 // 计算棋子后面的空格数
_row += y _row += y
_col += x _col += x
obstacle_num += 1
} }
return [ return [
empty_num,
piece_num, piece_num,
first_empty_num,
obstacle_num obstacle_num
] ]
} }
...@@ -222,9 +238,9 @@ function getDirectionsInfo(board, row, col, [y, x], player) { ...@@ -222,9 +238,9 @@ function getDirectionsInfo(board, row, col, [y, x], player) {
* @param {number} win_size 需要几个棋子才赢 * @param {number} win_size 需要几个棋子才赢
* @returns {number} 分数 * @returns {number} 分数
*/ */
function getDirectionScore(board, row, col, [y, x], win_size, player) { function getDirectionScore(pan_info, 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 [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(board, row, col, [y * -1, x * -1], 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 const SIZE = r_piece_num + l_piece_num
// 没有棋子 // 没有棋子
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册