Wed Jul 5 07:39:00 UTC 2023 inscode

上级 52368d1f
...@@ -68,30 +68,25 @@ export function checkWin({ row, col, board, player, win_size }) { ...@@ -68,30 +68,25 @@ export function checkWin({ row, col, board, player, win_size }) {
export function robotPlay(board, win_size) { export function robotPlay(board, win_size) {
let maxScorePos = []; let maxScorePos = [];
let maxScore = -1; let maxScore = -1;
// 空位 // 空位 对每个空位进行评分
const empty_points = board.map((item, row) => { board.map((item, row) => {
return item.flatMap((_item, col) => _item === is_empty ? [[row, col]] : []) return item.map((_item, col) => {
}).flat(1) if (_item === is_empty) {
let score = 0;
// 对每个空位进行评分 // 评估每个空位置的价值,从八个方向去计算
for (let e_i = 0; e_i < empty_points.length; e_i++) { score = directions.reduce((r, [y, x]) => {
const point = empty_points[e_i] const square = getDirectionScore(board, row, col, [y, x], win_size)
return r + (10 ** square)
let score = 0; }, 0)
const [row, col] = point;
// 选取分数最高的空位
// 评估每个空位置的价值,从八个方向去计算 if (score >= maxScore) {
score = directions.reduce((r, [y, x]) => { maxScorePos = [row, col];
const square = getDirectionScore(board, row, col, [y, x], win_size) + getDirectionScore(board, row, col, [y * -1, x * -1], win_size) maxScore = score;
return r + (10 ** square) }
}, 0) }
})
// 选取分数最高的空位 })
if (score >= maxScore) {
maxScorePos = [row, col];
maxScore = score;
}
};
return maxScorePos; return maxScorePos;
} }
...@@ -120,13 +115,13 @@ export function robotPlay(board, win_size) { ...@@ -120,13 +115,13 @@ export function robotPlay(board, win_size) {
* @param {number} num * @param {number} num
*/ */
function getBoundary(size, num) { function getBoundary(size, num) {
const HALF = size / 2 const HALF = Math.floor(size / 2) // 先下取整
return (num > HALF ? size - num : num) + 1 // 当前位置算进去 return (num > HALF ? size - num : num) + 1 // 当前位置算进去
} }
/** /**
* 获取一个一个方向上的棋子数 * 获取一个方向上的棋子数,八个方向
* @param {(is_empty|is_white|is_black)[]} board 棋盘
* @param {number} row 行 y * @param {number} row 行 y
* @param {number} col 列 x * @param {number} col 列 x
* @param {(is_empty|is_white|is_black)[]} board 棋盘 * @param {(is_empty|is_white|is_black)[]} board 棋盘
...@@ -134,11 +129,12 @@ function getBoundary(size, num) { ...@@ -134,11 +129,12 @@ function getBoundary(size, num) {
* @returns * @returns
*/ */
function getDirectionScore(board, row, col, [y, x], win_size) { 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 _res = 0
let _row = row + y let _row = row + y
let _col = col + x let _col = col + x
const ROW = board.length
const COL = board[0].length
while (true) { while (true) {
if (_row < 0 || _col < 0 || !board[_row] || board[_row][_col] !== is_black) { if (_row < 0 || _col < 0 || !board[_row] || board[_row][_col] !== is_black) {
break; break;
...@@ -147,7 +143,20 @@ function getDirectionScore(board, row, col, [y, x], win_size) { ...@@ -147,7 +143,20 @@ function getDirectionScore(board, row, col, [y, x], win_size) {
_row += y _row += y
_col += x _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
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册