diff --git a/src/utils/index.js b/src/utils/index.js index 932f77fbd959c2cd2711132bf8ebf6264942dff6..5565d8be1b86ed59dfaa4e47881d035d37097fe4 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -14,6 +14,43 @@ export const directions = [ [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 @@ -102,11 +139,17 @@ export function robotPlay(board, win_size) { * * 是以一条线的记录积分,一个位置上正负方向为一条线 * 当一个位置上 横 竖 斜 反斜 位置上都有棋子 - * 积分最多为 4 * (10**8) = 400000000 + * 积分最大为 4 * (10**8) = 400000000 * 积分最小为 4 * (10**0) = 4 * * 边界判断 * 如果在棋盘边缘,需要判断连子最多有几颗,小于 win_size 颗,可以直接放弃当前位置 + * + * 黑白棋棋盘积分判断 + * 比较黑白棋的棋盘最高积分,积分大的位置优先下,避免总是在防守 + * + * 随机下棋 + * 如果一个判定回合,棋盘积分中最高的积分有多个,则随机选择一个位置,避免有规律 */ /** @@ -119,6 +162,34 @@ function getBoundary(size, num) { 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 棋盘 @@ -133,8 +204,6 @@ function getDirectionScore(board, row, col, [y, x], win_size) { 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; @@ -154,9 +223,6 @@ function getDirectionScore(board, row, col, [y, x], win_size) { _row -= y _col -= x } - // 横线判断 - const distance = getBoundary(COL, col) - // 判断边距 return res + _res }