我正在制作BrickBreaker游戏,由于一个未知的原因,我陷入了一个令人讨厌的错误,无法追踪。到目前为止的游戏状态:
这是我要执行的操作:假设我单击上图中带圆圈的红色按钮。我希望红砖消失,而红色上方的砖则适当地占据其位置。
到目前为止的代码:
private void moveBrick(BrickHolder brickHolder) {
Point brickHolderLocation = brickHolder.getBrickHolderLocation();
Brick containedBrick = getBrickByXAndY(brickHolderLocation.x, brickHolderLocation.y); // getting the Brick at that location
if (containedBrick == null) {
// If in any case there should be no brick at that position, just go on with the Brick above
if (brickHolderLocation.y == 0) { // Should we be at the top row, there's no need to continue
return;
} else {
BrickHolder nextBrickHolder = getPanelByXAndY(brickHolderLocation.x, brickHolderLocation.y - 1);
moveBrick(nextBrickHolder);
}
}
if (brickHolderLocation.y == 0) { // Should we be at the top row, there's no need to continue
return;
}
// Removing the current Contained Brick
brickHolder.remove(containedBrick);
// Getting the Brick I want to move, normally hosted at the above Panel
Brick theOneToBeMoved = getBrickByXAndY(brickHolderLocation.x, brickHolderLocation.y - 1);
if (theOneToBeMoved == null) {
// If in any case the Panel above doesn't contain a Brick, then continue with the Panel above.
BrickHolder nextBrickHolder = getPanelByXAndY(brickHolderLocation.x, brickHolderLocation.y - 1);
moveBrick(nextBrickHolder);
}
// Getting the Panel above the current one, so that we may move the Brick hosted there,
// To the current Panel
BrickHolder toHoldTheNewBrick = getPanelByXAndY(brickHolderLocation.x, brickHolderLocation.y - 1);
brickHolder.add(theOneToBeMoved); // Moving the Brick at the current Panel
toHoldTheNewBrick.remove(theOneToBeMoved); // Removing that same brick from the Panel above
theOneToBeMoved.setBrickLocation(brickHolderLocation); // Setting the Brick's new location.
// Since we have gotten so far, we assume that everything worked perfectly and that it's time to continue
// with the Panel above
BrickHolder theNextOne = getPanelByXAndY(brickHolder.getBrickHolderLocation().x, brickHolder.getBrickHolderLocation().y - 1);
moveBrick(theNextOne);
}
从我进行的调试中,我相信问题出在这里:
if (brickHolderLocation.y == 0) { // Should we be at the top row, there's no need to continue
return;
}
一些兴趣点:
Brick-我创建的扩展JButton的类。而已。认为
它作为带有BackGround的普通JButton
BrickHolder-I类
创建以托管Bricks。此类扩展了JPanel。唯一的
另外是(点)位置变量,添加起来更容易
操纵。
编辑:谢谢大家!您的评论和/或答案为我指明了继续的正确道路!
最佳答案
我没有足够的意见要发表,所以这更像是一个建议,但是如果您位于第一行,那么您是否仍要删除积木?那将与您在调试中发现有问题的区域相同。
关于java - 递归方法行事怪异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11086635/