寒假在家闲来无事,想要自己搞一个2048的小游戏,就在网上搜了一下,搜到了大佬的程序,就自己一遍参考一遍自己摸索,将代码实现了起来,能够真正的运行出来游戏界面,并且游戏感觉良好。
但是玩了几次之后,发现代码有点小bug,即即使右下角有可以接着合并的情况时,也会提示游戏结束,可以接着操作,如果后续操作可以破局,就会是游戏结束提示消失,如下图所示。
分析可知是源代码中判断游戏结束出现了问题,定位到相应位置,代码如下 。
//是否全部格子占满,是则游戏结束
private boolean judgeGameOver() {
Score.setText(score + "");
if (!getEmptyGrids().isEmpty())
return false;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//判断有无可合并的方格
if (grids[i][j].value == grids[i][j + 1].value
|| grids[i][j].value == grids[i + 1][j].value)
return false;
}
}
return true;
}
源代码中只对前三行和前三列的方格进行判断,如果其下边或者右边的方格与其值相同,则返回false。这种判断却少了对第四行和第四列的判断,所以会导致即使有可以合并的情况也会提示游戏结束。重复几次之后,发现类似的bug出现总是在第四行或者第四列出现可合并的方格时,也验证了猜想的正确性。基于此想到了从解决办法,原代码从左上到右下开始判断,可以新增从右下到左上的判断,代码如下
//是否全部格子占满,是则游戏结束
private boolean judgeGameOver() {
Score.setText(score + "");
if (!getEmptyGrids().isEmpty())
return false;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (grids[i][j].value == grids[i][j + 1].value
|| grids[i][j].value == grids[i + 1][j].value)
return false;
}
}
//新增从右下到左上的判断
for (int i = 3; i > 0; i--) {
for (int j = 3; j > 0; j--) {
if (grids[i][j].value == grids[i][j - 1].value
|| grids[i][j].value == grids[i - 1][j].value)
return false;
}
}
return true;
}
最后,问题得以解决,不会出现上述提到的即使存在可合并方格也会提示游戏结束的bug,源代码来自:牛!阿里P8用java实现2048小游戏(附代码) - 知乎



