我正在制作我的第一个完整的程序,在我的训练下进行了两周的编程,并且遇到了一个我似乎无法弄清楚的障碍。我正在制作一个连接4游戏,并且在推送到DOM之前已经开始在JavaScript中构建逻辑。我已经开始使用构造函数创建的单元格对象,然后以2D数组的形式将其推入游戏对象。我已经设法创建了一个每次都进行播放的函数,并使用2天的数组更改该列最低点的单元格值。但是,我不知道如何检查wins函数来运行。
到目前为止,我的逻辑是,对于2D数组中的每个点,您可以按行,按列和对角线进行检查。我理解如何检查win的逻辑,但我不明白如何按行和列遍历数组。在下面的示例中,this.cellsArray是Board Constructor中的单元对象数组。该阵列有7个列阵列,每个阵列有6行,因为我翻转了典型的行列逻辑,以考虑Connect Four的基于列的性质。但是我不能像this.cellsArray [col] [row]那样访问数组,因为col和row没有定义,我不知道如何定义索引值?任何帮助将不胜感激!
示例:
//array location is equal to an instance of this.cellsArray[col][row]
Board.prototype.checkRowRight = function (arrayLocation) {
if ((arrayLocation[i+1][i].value === arrayLocation.value) && (arrayLocation[i+2][i]=== arrayLocation.value) && (arrayLocation[i+3][i].value === arraylocation.value)){
this.winner = this.currentPlayer;
this.winnerFound = true;
console.log('Winner has been found!')
}
};
答案 0 :(得分:2)
回到我的逻辑here并重构获胜的行检测代码,可以很容易地将其转换为Javascript,如下所示:
function chkLine(a,b,c,d) {
// Check first cell non-zero and all cells match
return ((a != 0) && (a ==b) && (a == c) && (a == d));
}
function chkWinner(bd) {
// Check down
for (r = 0; r < 3; r++)
for (c = 0; c < 7; c++)
if (chkLine(bd[r][c], bd[r+1][c], bd[r+2][c], bd[r+3][c]))
return bd[r][c];
// Check right
for (r = 0; r < 6; r++)
for (c = 0; c < 4; c++)
if (chkLine(bd[r][c], bd[r][c+1], bd[r][c+2], bd[r][c+3]))
return bd[r][c];
// Check down-right
for (r = 0; r < 3; r++)
for (c = 0; c < 4; c++)
if (chkLine(bd[r][c], bd[r+1][c+1], bd[r+2][c+2], bd[r+3][c+3]))
return bd[r][c];
// Check down-left
for (r = 3; r < 6; r++)
for (c = 0; c < 4; c++)
if (chkLine(bd[r][c], bd[r-1][c+1], bd[r-2][c+2], bd[r-3][c+3]))
return bd[r][c];
return 0;
}
测试电话:
x =[ [0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 1, 2, 2, 2, 0],
[0, 1, 2, 2, 1, 2, 0] ];
alert(chkWinner(x));
当使用棋盘调用时,chkWinner
函数将返回第一个(并且只有,假设每个移动仅更改一个单元格并且您在每次移动后都会检查)获胜玩家。
这个想法基本上是将检查限制在那些有意义的检查中。例如,当向右检查单元格时(参见第二个循环),您只需要检查从最左边的四列0-6
开始的每一行0-3
。
那是因为在找到可能的胜利之前,从其他任何地方开始都会从董事会的右侧开始。换句话说,列集{0,1,2,3}
,{1,2,3,4}
,{2,3,4,5}
和{3,4,5,6}
将有效,但{4,5,6,7}
不会(七个有效列为{{1} })。
答案 1 :(得分:0)
这是一个旧线程,但我将解决方案混为一谈,因为这显示为“如何计算connect4 win javascript”的顶部搜索结果
我通过矩阵加法解决了这个问题。
假设您的游戏板以2D数组的形式存储在内存中,如下所示:
[ [0, 0, 0, 0, 0, 0, 0],
[0, 0, Y, 0, 0, 0, 0],
[0, 0, Y, 0, 0, 0, 0],
[0, 0, R, 0, 0, 0, 0],
[0, 0, Y, 0, 0, 0, 0],
[0, 0, R, R, R, 0, 0] ];
在每个“投币器”上,您应该调用一个传递硬币x / y位置的函数。
这是您计算用户赢得比赛的天气的地方
let directionsMatrix = {
vertical: { south: [1, 0], north: [-1, 0] },
horizontal: { east: [0, 1], west: [0, -1] },
backward: { southEast: [1, 1], northWest: [-1, -1] },
forward: { southWest: [1, -1], northEast: [-1, 1] },
};
注意:矩阵表示法中的“ South”是[1,0]
,表示“向下1个单元格,向右0个单元格”
现在,我们可以遍历每个轴/方向以检查是否连续有4个。
const playerHasWon = (colnum, rowNum, playerColor, newGrid) => {
//For each [North/South, East/West, NorthEast/Northwest, SouthEast/Southwest]
for (let axis in directionsMatrix) {
// We difine this variable here so that "East" and "West" share the same count,
// This allows a coin to be dropped in a middle cell
let numMatches = 1;
// For each [North, South]
for (let direction in directionsMatrix[axis]) {
// Get X/Y co-ordinates of our dropped coin
let cellReference = [rowNum, colnum];
// Add co-ordinates of 1 cell in test direction (eg "North")
let testCell = newGrid[cellReference[0]][cellReference[1]];
// Count how many matching color cells are in that direction
while (testCell == playerColor) {
try {
// Add co-ordinates of 1 cell in test direction (eg "North")
cellReference[0] += directionsMatrix[axis][direction][0];
cellReference[1] += directionsMatrix[axis][direction][1];
testCell = newGrid[cellReference[0]][cellReference[1]];
// Test if cell is matching color
if (testCell == playerColor) {
numMatches += 1;
// If our count reaches 4, the player has won the game
if (numMatches >= 4) {
return true;
}
}
} catch (error) {
// Exceptions are to be expected here.
// We wrap this in a try/catch to ignore the array overflow exceptions
// console.error(error);
break;
}
}
// console.log(`direction: ${direction}, numMatches: ${numMatches}`);
// If our count reaches 4, the player has won the game
if (numMatches >= 4) {
return true;
}
}
}
// If we reach this statement: they have NOT won the game
return false;
};
如果您想查看完整的代码,请点击此处链接到github repo。
这是指向live demo
的链接