此游戏的界面分为3种,即游戏前界面、游戏时界面和游戏后界面
1、游戏前界面:即在游戏开始之前为用户呈现的界面,其中包括1张背景图和3个按钮,3个按钮分别为“开始”、“设置”和“退出”。当选择“开始”时,即进入游戏时界面并开始游戏;“设置”按钮可以先不实现,以便以后扩展扩程序;当选择“退出”时,即关闭程序。
2、游戏时界面:即在游戏进行时的界面,其实就一张背景图就行了。不过我将整个界面分划成3个逻辑区,游戏的图案,游戏的分数等这些东西只需在游戏过程中往相对应的逻辑区画或写进去就行了。这3个逻辑区分别为:游戏区、信息区和预览区。游戏区只有一个“容器”,积累俄罗斯方块用的;信息区包括分数和关数两个字段的显示;而预览区则向用户提示下一个俄罗斯方块的样子。
3、游戏后界面:即在游戏结束时所弹出的界面,它并不占满整个窗口,而只是窗口中间的一部分。它包括1张背景图和2个按钮,这两个按钮分别为“Y”和“N”,分别代表“继续挑战”和“结束游戏”。这里也跟游戏时界面一样分3个逻辑区:分数区,结果区和选择区。分数区显示最高分数和当前分数,结果区显示“挑战成功,恭喜你!”或“挑战失败,再接再厉!”,而选择区即一个字段——“是否继续挑战?”和两个按钮。
二、流程图设计
流程图设计分为4阶段:
1、初始化阶段:初始化一些东西,如:SDL的初始化,一些数据结构以及变量的初始化等;
2、游戏前阶段:对应于前面的游戏前界面,主要是背景图的载入,以及对那三个按键的响应;
3、游戏时阶段:整个游戏的核心部分,以下有三个比较重要的设计:
(1)在整个阶段,我设立3个俄罗斯方块结构体,一个为了在预览区显示用,称之为“过去时方块”,一个在容器中显示用,称之为“进行时方块”,还有一个用于预先判断用,即它是“进行时方块”移动或换方向之后的状态,程序使用它来判断移动或换方向是否合法,但它是至始至终都不显示的,其实就是为“进行时方块”探路用的,称之为“将来时方块”。
(2)只有在“将来时方块”探路表示合法时,方可将方块移动或换方向,并刷新显示之,但怎么样才算合法呢?如何去判断它呢?这是整个程序最关键的一步。
方块的下一步有下移(下键)、左移(左键)、右移(右键)、改变方向(上键)和自然下落(无按键)5种情况,这5种情况是互斥的,即同一时刻只能执行一种动作。
左移、右移时,只需要根据关键点以及数据仓1修改“将来时方块”,并判断“将来时方块”所在位置是否完全空闲,是则探路成功返回0,否则返回1继续运行程序。
下移、自然下落时,只需要根据关键点以及数据仓1修改“将来时方块”,并判断“将来时方块”所在位置是否完全空闲,是则探路成功返回0,否则返回2。(方块已放置好,下一个方块继续)
改变方向时,只需要根据关键点、数据仓1和数据仓2修改“将来时方块”,并判断“将来时方块”所在位置是否完全空闲,是则探路成功返回0,否则返回1继续运行程序。
凡是探路成功返回0的,都会将”进行时方块“刷掉,然后”将来时方块“变成”进行时方块“,最后再将”进行时方块“重新画上去。
(3)俄罗斯方块属于视频游戏,即在不需要用户输入时,画面是一帧一帧的动画,所以整个程序得同时响应方块的移动和用户的输入。方块移动之后总会停顿一会,然后再移动,如果在方块停顿的那会,有一个用户输入,那得咋办呢?因为停顿的那会是进程被挂起了,这时候来用户输入,程序根本不会响应它,所以只能使用进程挂起pause()和信号唤醒(设置计时器定时发送信号)这种方法来实现之,没按键设置的计时器时间长点(计算机中的长点也是毫秒级的,嘻嘻!!),方块会根据这”长点“的时间定时移动着,一旦有按键,就马上修改计时器的时间短点(如果是0最好,可要是0就代表着把计时器关了,木有办法),等计时器发送信号后从中断处理函数中返回来后,再将计时器的调成原来长点的时间,就这样循环执行着。
4、游戏后阶段:对应于前面的游戏后界面,主要是背景图的载入,信息的显示,以及对那两个按键的响应;