C. *_*rns 3 javascript arrays multidimensional-array
我正在编写我的第一个完整程序,并进行了两周的编程,但遇到了一个我似乎无法弄清楚的障碍。我正在制作一个连接 4 游戏,并且在推送到 DOM 之前通过在 JavaScript 中构建逻辑开始。我已经开始使用由构造函数创建的单元格对象来制作它,然后以 2D 数组的形式将这些单元格对象推送到游戏对象中。我设法创建了一个每次都进行播放的函数,并使用 2 天数组更改该列最低点的单元格值。但是,我不确定如何让我检查 wins 功能运行。
到目前为止,我的逻辑是,对于 2D 数组中的每个点,您可以按行、按列和按对角线检查。我了解如何检查获胜的逻辑,但我不明白如何按行和列遍历数组。在下面的示例中, 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!')
}
};
Run Code Online (Sandbox Code Playgroud)
参考我在这里找到的逻辑并重构出获胜线检测代码,这可以很容易地转换为 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;
}
Run Code Online (Sandbox Code Playgroud)
和一个测试电话:
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));
Run Code Online (Sandbox Code Playgroud)
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}不会(七有效列0-6)。
| 归档时间: |
|
| 查看次数: |
6500 次 |
| 最近记录: |