gpt4 book ai didi

javascript - 在 JS Connect-Four 中返回获胜的单元格坐标

转载 作者:行者123 更新时间:2023-11-30 16:56:49 24 4
gpt4 key购买 nike

我正在开发一个 JS 连四游戏。我的“棋盘”是一个尺寸为 7 * 6 的数组(0 = 空,1 = 玩家 A 占据,-1 = 玩家 B 占据)。

var boardTwo = [[1,1,1,1,0,0],[-1,-1,-1,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]];

这是我的(冗长的)函数,用于检查获胜(任一玩家是否在棋盘上创建了一条完整的水平、垂直或对 Angular 线长度 4)。我如何修改它以便它返回一个包含获胜计数器坐标的数组而不是简单的警报消息?我很欣赏最好的解决方案可能包括放弃我原来的 checkWin 函数,用更简洁的函数代替。

checkWin = function(board){
checkVert(board);
checkHoriz(board);
checkDia(board);
}
winAlert = function(checkSum){
if(checkSum == 4){
status = "a"
alert("a wins");
}
else if(checkSum == -4){
status = 'b';
alert("b wins");
}
}
checkVert = function(board){
for(var i = 0; i < board.length; i++){
for(var j = 0; j < board[0].length - 3; j++){
var checkSum = board[i][j] + board[i][j+1] + board[i][j+2] + board[i][j+3];
winAlert(checkSum);
}
}
}

checkHoriz = function(board){
for(var i = 0; i < board.length-3; i++){
for(var j = 0; j < board[0].length; j++){
var checkSum = board[i][j] + board[i+1][j] + board[i+2][j] + board[i+3][j];
winAlert(checkSum);
}
}
}

checkDia = function(board){
for(var i = 0; i < board.length-3; i++){
for(var j = 0; j < board[0].length - 3; j++){
var checkSum = board[i][j] + board[i+1][j+1] + board[i+2][j+2] + board[i+3][j+3];
winAlert(checkSum);
}
}
}
checkWin(boardTwo) //alerts "player A wins"

我希望 checkWin(boardTwo) 返回 [[0,0],[0,1],[0,2],[0,3]];

最佳答案

这是一个简单的解决方案:

    如果有人赢了,
  • winAlert 应该返回一个数字,例如A 为 1,B 为 -1
  • 每个 check 函数都会检查这个结果,如果它是 -1 或 1,那么它将插入它检查的值
  • 如果 check 方法返回未定义的内容,即包含答案的数组,则不应进行其他检查
  • 最后 state 保存谁赢了(-1、1 或 undefined)并且 checkWin 的返回值将是一个数组,如果有人赢了

我还对 checkDiagonal 方法进行了额外检查,以检查矩阵中存在的其他对 Angular 线

function sgn(x) {
if (x < 0) return -1;
if (x > 0) return 1;
return 0;
}

function interpolate(from, to) {
var coordinates = [];
var startX = from[0];
var startY = from[1];
var limit = Math.max(
Math.abs(from[0] - to[0]),
Math.abs(from[1] - to[1])
) + 1;
for (i = 0; i < limit; i += 1) {
coordinates.push([
startX + i * sgn(to[0] - from[0]),
startY + i * sgn(to[1] - from[1])
]);
}
return coordinates;
}

var state;
function checkWin(board) {
var ans;
ans = ans || checkVert(board);
ans = ans || checkHoriz(board);
ans = ans || checkDia(board);
return ans;
}

function winAlert(checkSum) {
if (Math.abs(checkSum) === 4) {
state = sgn(checkSum);
return state;
}
}

checkVert = function(board) {
for (var i = 0; i < board.length; i++) {
for (var j = 0; j < board[0].length - 3; j++) {
var checkSum = board[i][j] + board[i][j + 1] + board[i][j + 2] + board[i][j + 3];
if (winAlert(checkSum)) {
return interpolate([i, j], [i, j + 3]);
}
}
}
}

checkHoriz = function(board) {
for (var i = 0; i < board.length - 3; i++) {
for (var j = 0; j < board[0].length; j++) {
var checkSum = board[i][j] + board[i + 1][j] + board[i + 2][j] + board[i + 3][j];
if (winAlert(checkSum)) {
return interpolate([i, j], [i + 3, j]);
}
}
}
}

checkDia = function(board) {
for (var i = 0; i < board.length - 3; i++) {
for (var j = 0; j < board[0].length - 3; j++) {
var checkSum = board[i][j] + board[i + 1][j + 1] + board[i + 2][j + 2] + board[i + 3][j + 3];
if (winAlert(checkSum)) {
return interpolate([i, j], [i + 3, j + 3]);
}
}
}

// missing diagonal
for (i = 3; i < board.length; i += 1) {
for (var j = 0; j < board[0].length - 3; j++) {
var checkSum = board[i][j] + board[i - 1][j + 1] + board[i - 2][j + 2] + board[i - 3][j + 3];
if (winAlert(checkSum)) {
return interpolate([i, j], [i - 3, j + 3]);
}
}
}
}

var board = [
[1, 1, 1, 0, 0, 0],
[-1, -1, -1, -1, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]
];

var ans = checkWin(board) || [];
document.write(state + '<pre>' + JSON.stringify(ans) + '</pre>');

关于javascript - 在 JS Connect-Four 中返回获胜的单元格坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29579289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com