俄罗斯方块板是网格布局。一个非常简单的理解方式是,俄罗斯方块只是一组“填充”的正方形。在布尔意义上,一块可以被视为0
,或未填充,或1
,已填充。使用网格(或基于图块)的方法将防止您的块超出界限,并且作为额外的好处,当您到达底部碰撞时还可以简化碰撞代码。
伪代码:您可以检查您想要移动的空间if (!grid[x][y]) block.move(direction)
在哪里,并且是一个任意函数,可以在指定的任何方向上通过一个网格空间调整您的作品和地图。从这个意义上说,你的游戏循环也可以用来逐步丢弃一块并用于下一块。grid[x][y]
block.move(direction)
block.move('down')
else block.stop(), game.generateBlock()
使用网格方法,您可以轻松地检查旋转的部分是否会超出边界if(x < 0 || x > gridWidth) block.move(direction)
,因为direction
与移动超出边界的方向相反。
继续基于网格的示例,您的作品实际上也只是一种开/关模式,它们的旋转显示如下:
▇ ▇ ▇ ▇ ▇ ▇ ▇
▇ or ▇ ▇ ▇ or ▇ or ▇
▇ ▇ ▇
这幅基本的艺术品所说明的是,由于通常是矩形的碎片,碎片不会围绕中心点旋转。但是,这些模式可以很容易地以布尔状态存储,并且您可以跟踪它所在的“位置”并编写代码来测试它,而不管方向如何。
由于每件作品都有有限数量的模式(最多 4 个),因此简单地硬编码它们可能符合您的最大利益。这个答案提供了一些您可能会觉得鼓舞人心的代码:https ://stackoverflow.com /a/8131337/571506
我强烈建议您进行研究并使用这些简单的变量学习一点线性代数,如果您有一点机会进入 3D 游戏编程。由于每个片段都可以存储为矩阵,因此您可以对基本“片段矩阵”应用简单的变换以获得新模式。这很容易被伪造,或者你可以全力以赴。我强烈建议您进行研究并使用这些简单的变量学习一点线性代数,如果您有一点机会进入 3D 游戏编程。对于算法,请查看以下问题:如何旋转二维数组?
俄罗斯方块是一个非常有据可查的游戏,可以为你的“工具箱”添加很多技能。尝试使用提供的范例尽可能多地解决它,同时手动进行大部分编程,从长远来看,您会发现它会受益匪浅。