public boolean checkWin() {
if(states[0][0][0] == 1 && states[0][0][1] == 1 && states[0][0][2] ==1 && states[0][0][3] ==1) { // Checks 0th layer, 0th row
return true;
}
else if (states[0][1][0] == 1 && states[0][1][1] == 1 && states[0][1][2] ==1 && states[0][1][3] ==1) { // Checks 0th layer, 1st row
return true;
}
else if (states[0][2][0] == 1 && states[0][2][1] == 1 && states[0][2][2] ==1 && states[0][2][3] ==1) { // Checks 0th layer, 2nd row
return true;
}
else if (states[0][3][0] == 1 && states[0][3][1] == 1 && states[0][3][2] ==1 && states[0][3][3] ==1) { // Checks 0th layer, 3rd row
return true;
}
}
此代码经过硬编码,用于检查第0层以及该层上的4行。我可以硬编码剩下的,但当然这将是非常耗时和糟糕的代码。当我尝试制作一个循环时,它会在三次点击后停止
public boolean checkWin() {
for (int i=0; i<=3; i++) {
if(states[0][0][i] == 1){ // Checks 0th layer, all rows
return true;
}
}
return false;
}
这就是我尝试制作循环的方式,但它不起作用。
答案 0 :(得分:1)
这个游戏是数据驱动方法如何简化代码的一个很好的例子。考虑:
有64个单元格,可以为空或包含令牌;令牌数量取决于玩家数量。这可以表示为64个元素的一维数组。
单元格为76行。这可以表示为76行4的数组,每个单元格包含第一个数组中元素的下标。 (在C或C ++中,您也可以存储指针,在Java中可以存储引用)。
要检查获胜的行,您可以只迭代76行,并检查第一个数组的一行中的每个单元格是否具有您分配给一个玩家或另一个玩家的值。
答案 1 :(得分:-1)
您当前的代码仅检查第三维中的行。您还应该检查其他尺寸:
for(int i = 0;i < 4;i++) {
for(int j = 0;j < 4;j++) {
if(
(states[i][j][0] == 1 && states[i][j][1] == 1 && states[i][j][2] == 1 && states[i][j][3] == 1) ||
(states[i][0][j] == 1 && states[i][1][j] == 1 && states[i][2][j] == 1 && states[i][3][j] == 1) ||
(states[0][i][j] == 1 && states[1][i][j] == 1 && states[2][i][j] == 1 && states[3][i][j] == 1)) {
return true;
}
}
}
你可以通过在最后一个维度上循环来使它比这更抽象,但是这需要布尔变量或者break / continue语句,所以我认为这与代码将要得到的一样清晰。< / p>
答案 2 :(得分:-1)
你需要像这样重写你的循环:
public boolean checkWin() {
for (int layer=0; layer<=3; layer++) {
for (int row=0; row<=3; row++) {
if(states[layer][row][0] == 1){
return true;
}
}
}
return false;
}
此逻辑仅检查基于行的胜利。但请注意,在TicTacToe中,您还需要检查基于列的胜利和对角线胜利。