三、数据结构设计
数据结构设计主要是针对游戏时阶段数据存储结构的设计,它的好坏直接关系程序的核心算法,以致影响到整个程序的好坏;
总共分4部分数据结构的设计:
1、容器:对应于“游戏区“,可以用一个二维数组表示,它是游戏区的一个映射,其中值为-1的是容器壁的映射;值为0的容器肚的映射,当有俄罗斯方块进入时,会使用正整数来代替0,0代表”空位,正整数代表”非空位“,并且不同的正值代表不同的颜色;值为10的为行计数器,代表该行还有几个”空位“,值为16的为列计数器,代表该列还有几个”空位“。
2、用户:对应于”信息区“,用一个结构体表示一个用户,结构体里面只有两项——”当前分数“和”关数“,其实完全不需要设置一个这么简单的结构体,但当你以后想升级游戏时就有用了,也许以后还会添加”姓名“、”头像“、”等级“等等,反正先设置后也不亏,而且有利于程序的结构化。
3、俄罗斯方块:对应于”预览区“,同样使用一个结构体表示一个俄罗斯方块,结构体里面包含4项——”种类”、“方向”、“关键点”和“颜色”。我考虑的俄罗斯方块一共有6种,每种有4个方向和1种颜色,都是由4个点组成,其中最下最左那个点为关键点(注意:先下先后先左)。在程序执行过程中,会根据关键点以及数据仓1(下面会讲)可以确定一个俄罗斯方块的准确位置,其实这跟学汇编的相对寻址一个道理,关键点为“基地址”,数据仓得到的数据为“偏移量”。
4、数据仓:其实就是存储一些不变的数据,我设有2个数据仓。
数据仓1:它是一个数组的数组,首先是一个二维数组,“种类”为行下标,“方向”为列下标,即根据“种类”和“方向”可以唯一确定一个俄罗斯方块。每个存储单元又是一个4x2的二维数组,即存放俄罗斯方块4个点相对于关键点的行相对位置和列相对位置。但为了初始化方便,因为我不会数组的数组如何初始赋值,所以就不搞那么复杂了,直接一个24x8的二维数组就OK了。
数据仓2:是一个6x4的二维数组,“种类”为行下标,“方向”为列下标,每个存储单元中的数值表示该俄罗斯方块在变换方向时关键点的列坐标变化。比如数值为2,则表示变换方向后的关键点是变换前左移2个单元得来的。
其实我也考虑过不必设置那个数据仓,而是每个俄罗斯方块结构体都自带四个点的坐标,如果这样的话,在程序运行中,四个点的坐标变化既要约束于“左右下”的变化,也要约束于改方向的变化,如果在靠着容器壁变化时,还要约束于容器壁。向现在这样设计,有一个好处就是时刻只要控制好关键点的坐标就行,这样程序的设计也就没那么复杂。