Wed Jul 5 09:26:00 UTC 2023 inscode

上级 9092eba3
...@@ -14,6 +14,43 @@ export const directions = [ ...@@ -14,6 +14,43 @@ export const directions = [
[1, -1] // / 方向 [1, -1] // / 方向
] ]
/**
* 检查 n 是否在 start 与 end 之间,但不包括 end。
* 如果 end 没有指定,那么 start 设置为0。
* 如果 start 大于 end,那么参数会交换以便支持负范围。
* @param {number} n
* @param {number} start
* @param {number|undefined} end
*/
function inRange(n, start = 0, end) {
if (end === undefined) {
[start, end] = [0, start]
}
if (start > end) {
[start, end] = [end, start]
}
return n >= start && n < end
}
/**
* 产生一个包括 lower 与 upper 之间的数。
* 如果只提供一个参数返回一个0到提供数之间的数。
* @param {number} lower
* @param {number} upper
*/
function random(lower = 0, upper = 1) {
// 交换 lower 和 upper 的值(如果 lower 大于 upper)
if (lower > upper) {
[lower, upper] = [upper, lower];
}
// 计算范围内的整数数量
const range = upper - lower + 1;
// 生成随机整数
const randomInteger = Math.floor(Math.random() * range) + lower;
return randomInteger;
}
/** /**
* 检查四个方向连续的棋子数 * 检查四个方向连续的棋子数
* @param {object} param * @param {object} param
...@@ -102,11 +139,17 @@ export function robotPlay(board, win_size) { ...@@ -102,11 +139,17 @@ export function robotPlay(board, win_size) {
* *
* 是以一条线的记录积分,一个位置上正负方向为一条线 * 是以一条线的记录积分,一个位置上正负方向为一条线
* 当一个位置上 横 竖 斜 反斜 位置上都有棋子 * 当一个位置上 横 竖 斜 反斜 位置上都有棋子
* 积分最为 4 * (10**8) = 400000000 * 积分最为 4 * (10**8) = 400000000
* 积分最小为 4 * (10**0) = 4 * 积分最小为 4 * (10**0) = 4
* *
* 边界判断 * 边界判断
* 如果在棋盘边缘,需要判断连子最多有几颗,小于 win_size 颗,可以直接放弃当前位置 * 如果在棋盘边缘,需要判断连子最多有几颗,小于 win_size 颗,可以直接放弃当前位置
*
* 黑白棋棋盘积分判断
* 比较黑白棋的棋盘最高积分,积分大的位置优先下,避免总是在防守
*
* 随机下棋
* 如果一个判定回合,棋盘积分中最高的积分有多个,则随机选择一个位置,避免有规律
*/ */
/** /**
...@@ -119,6 +162,34 @@ function getBoundary(size, num) { ...@@ -119,6 +162,34 @@ function getBoundary(size, num) {
return (num > HALF ? size - num : num) + 1 // 当前位置算进去 return (num > HALF ? size - num : num) + 1 // 当前位置算进去
} }
/**
* 获取当前方向的
* @param {*} board
* @param {*} row
* @param {*} col
* @param {*} win_size
*/
function getScore(board, row, col, win_size) {
const ROW = board.length
const COL = board[0].length
let res = 0
let _row = row + y
let _col = col + x
while (true) {
if (inRange(_row, ROW) && inRange(_col, COL) && board[_row][_col]) {
res += 1
_row += y
_col += x
} else {
if (_row >= 0 && _col >= 0) {
}
}
}
}
/** /**
* 获取一个方向上的棋子数,八个方向 * 获取一个方向上的棋子数,八个方向
* @param {(is_empty|is_white|is_black)[]} board 棋盘 * @param {(is_empty|is_white|is_black)[]} board 棋盘
...@@ -133,8 +204,6 @@ function getDirectionScore(board, row, col, [y, x], win_size) { ...@@ -133,8 +204,6 @@ function getDirectionScore(board, row, col, [y, x], win_size) {
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;
...@@ -154,9 +223,6 @@ function getDirectionScore(board, row, col, [y, x], win_size) { ...@@ -154,9 +223,6 @@ function getDirectionScore(board, row, col, [y, x], win_size) {
_row -= y _row -= y
_col -= x _col -= x
} }
// 横线判断
const distance = getBoundary(COL, col)
// 判断边距
return res + _res return res + _res
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册