diff --git a/src/App.vue b/src/App.vue index 8bff5b644063939cac88a707d6543499e4d34683..408dd6f17c1b86f872525242fb395890ec6328be 100644 --- a/src/App.vue +++ b/src/App.vue @@ -35,7 +35,7 @@ function back() { const { location: [y, x], type } = records.value.pop() lattices.value[y][x] = is_empty // 如果是玩家赢了,只需要退回一步就行 - if(type === is_black){ + if (type === is_black) { break; } } diff --git a/src/utils/index.js b/src/utils/index.js index cb5c5d375aa457bd3625b3bffeaed84328db177c..98a19fb449d776b26b42092116e4dd631e1dee59 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -14,6 +14,18 @@ export const directions = [ [1, -1] // / 方向 ] +Array.prototype.group = function (fn) { + return this.reduce((r, item, index, arr) => { + const key = fn(item, index, arr) + if (r[key]?.length) { + r[key].push(item) + } else { + r[key] = [item] + } + return r + }, {}) +} + /** * 检查 n 是否在 start 与 end 之间,但不包括 end。 * 如果 end 没有指定,那么 start 设置为0。 @@ -31,25 +43,6 @@ function inRange(n, start = 0, end) { } 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; -} /** * 检查四个方向连续的棋子数 @@ -92,6 +85,7 @@ export function checkWin({ row, col, board, player, win_size }) { return res; } } + console.log(res) // 当前空位,可以结成多少颗连珠 return false; } @@ -116,26 +110,35 @@ export function robotPlay(board, win_size) { [is_black]: 0, [is_white]: 0 }) - if (score[is_black] == 0 && score[is_white] == 0) return [] + const _b_score = score[is_black] + const _w_score = score[is_white] + + if (_b_score == 0 && _w_score == 0) return [] return [{ - [`${row}_${col}`]: score + [`${row}_${col}`]: Math.max(_b_score, _w_score) }] } else { return [] } }) }).flat(1) - const _scores = scores.sort((black_score, white_score) => { - const [b_s1, b_w1] = Object.values(Object.values(black_score)[0]) - const [w_s1, w_w1] = Object.values(Object.values(white_score)[0]) - const score1 = Math.max(b_s1, b_w1) - const score2 = Math.max(w_s1, w_w1) - return score2 - score1 + // 按分数分组 + const scores_group_obj = scores.group((item) => { + return Object.values(item)[0] }) - console.log(_scores) + // 找到最高分数 + const max_key = Math.max(...Object.keys(scores_group_obj)) + const max_scores_arr = scores_group_obj[max_key] + let res_key = '' + if (max_scores_arr.length === 1) { + res_key = Object.keys(max_scores_arr[0])[0] + } else if (max_scores_arr.length > 1) { + const random_index = Math.floor(Math.random() * max_scores_arr.length) + res_key = Object.keys(max_scores_arr[random_index])[0] - return Object.keys(_scores[0])[0].split('_'); + } + return res_key.split('_').map(item => parseInt(item, 10)); } /** @@ -166,16 +169,6 @@ export function robotPlay(board, win_size) { * */ -/** - * 获取获取边界距离 - * @param {number} size - * @param {number} num - */ -function getBoundary(size, num) { - const HALF = Math.floor(size / 2) // 先下取整 - return (num > HALF ? size - num : num) + 1 // 当前位置算进去 -} - /** * 获取这一边方向的信息,连珠颗数,延伸出去的空位数 * @param {(is_empty|is_white|is_black)[][]} board 棋盘 @@ -194,9 +187,11 @@ function getJoinInfo(board, row, col, [y, x], player) { let _row = row + y let _col = col + x + const villain = player === is_black ? is_white : is_black; + while (inRange(_row, ROW) && inRange(_col, COL)) { const item = board[_row][_col] - if (item === is_white) { + if (item === villain) { break; } // 连珠计数 @@ -216,9 +211,6 @@ function getJoinInfo(board, row, col, [y, x], player) { empty_num } } -function pow(num = 0) { - return 10 ** num -} /** * 根据棋子位置信息,计算分数 * @param {(is_empty|is_white|is_black)[]} board 棋盘 diff --git a/vite.config.js b/vite.config.js index 5af2b46a9ea888a2b513bae39732202bba727423..3bd09f8e38e3c47fba70645548fb0f325db3a403 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,12 +4,9 @@ import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], - server: { - host: true, - }, define: { 'process.env': { INSCODE_API_KEY: process.env.INSCODE_API_KEY } - } + }, })