【发布时间】:2013-03-07 14:16:14
【问题描述】:
我正在尝试用 Java 制作俄罗斯方块游戏作为一个有趣的项目。
我的游戏板是一个瓷砖网格:
grid = new Tile[height][width];
在网格中,我创建了一个新的 Tile 对象:activetile = new Tile(this,0, 0); //add new tile to "this" board
目前:
-
我可以控制一个单个图块-向下、向左和向右移动它
public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if(keyCode == KeyEvent.VK_DOWN) { checkBottomFull(0,4); collisionCheck(activetile.getX(),activetile.getY()); checkEndGame(activetile.getX(), activetile.getY()); activetile.setLocation(activetile.getX(), activetile.getY()+1); System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY()); repaint(); } ...right key and left key code omitted- 从 keyPressed 方法中可以看出,
checkBottomFull()将在底部行满时清除,collisionCheck()将在方块击中地板或下方的另一块时生成新棋子,checkEndGame()将在格子结束时结束游戏卡在顶部。
- 从 keyPressed 方法中可以看出,
我正在努力解决以下问题:
-
要创建一个实际的俄罗斯方块,我想我应该只生成 3 个其他 Tile 实例,并根据它是什么(L、O、Bar、Z 等),将它们的位置设置在适当的位置到 activetile(我可以控制的单个图块),如下所示:
if (piece == "Bar") { block2 = new Tile(this, activetile.getX(), activetile.getY()); block3 = new Tile(this, activetile.getX()+2, activetile.getY()); block4 = new Tile(this, activetile.getX()+3, activetile.getY()); }
这个问题是,我对activetile 的碰撞检测不允许它正确移动,因为它会碰到其他块。我试图在keyPressed() 中通过设置block2, block3, block4 的位置来解决这个问题,在设置了activetile 的新位置之后,就像这样:(所以一旦activetile 向下移动,所有其他人都可以向下移动,所以他们不会' t重叠)
activetile.setLocation(activetile.getX(), activetile.getY()+1);
block2.setLocation(activetile.getX(), activetile.getY()+1);
block3.setLocation(activetile.getX(), activetile.getY()+1);
block4.setLocation(activetile.getX(), activetile.getY()+1);
这可能适用于向下移动,但它不适用于向左或向右移动,因为瓷砖会重叠。
那么,我是否通过生成这样的新块正确地创建了 Bar 片段的新实例?我的想法对吗?
可执行文件
https://www.dropbox.com/s/oyh26dfbmsvt5c8/my_tetris_test.jar
源代码 zip 链接
https://www.dropbox.com/s/9kt3sl6qqo54amk/Tetris%20Two.rar
谢谢!
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
@AndrewThompson 我已经将一个可运行的 jar 以及作为 zip 的源代码上传到了 Dropbox。可以试试吗?
-
@AndrewThompson 我已经通读了它,我认为我的 exe 实现了所有这些事情。不想看也没关系。
-
“我认为我的 exe 实现了所有这些事情” SSCCE 不需要“可执行”,如果代码是 SSCCE,它可以作为编辑发布。跨度>
-
@AndrewThompson 好的,我不知道如何改写这个问题。我相信它很短,我已经清楚地确定了我的问题所在 - 我正在努力解决以下问题:基本上说我不确定如何让几块瓷砖一起移动,因为它们会相互碰撞。它是自包含的,因为我已经发布了问题所在的代码,以及下面的可编译/可运行代码......他们可以运行它并自己查看结果,这就是我包含它的原因。这是正确的,我已经发布了我尝试过的示例。我是不是误会了?