俄罗斯方块”程序设计---之文档设计

一、界面设计

此游戏的界面分为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、游戏后阶段:对应于前面的游戏后界面,主要是背景图的载入,信息的显示,以及对那两个按键的响应;


三、数据结构设计

数据结构设计主要是针对游戏时阶段数据存储结构的设计,它的好坏直接关系程序的核心算法,以致影响到整个程序的好坏;

总共分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个单元得来的。


其实我也考虑过不必设置那个数据仓,而是每个俄罗斯方块结构体都自带四个点的坐标,如果这样的话,在程序运行中,四个点的坐标变化既要约束于“左右下”的变化,也要约束于改方向的变化,如果在靠着容器壁变化时,还要约束于容器壁。向现在这样设计,有一个好处就是时刻只要控制好关键点的坐标就行,这样程序的设计也就没那么复杂。


四、文件模块设计

整个程序由6个文件组成:

Tetris.h文件:所包含的头文件,一些宏定义,数据结构的定义,外部函数和外部变量的声明等。

main.c文件:程序的主文件,整个程序的主干流程在此。

Start.c文件:包含了初始化阶段和游戏前阶段的源代码。

Progress.c文件:整个程序的核心,包含了游戏时阶段的源码,

Over.c文件:包含了游戏后阶段的源代码。

makefile文件:编译程序用的,因为是在linux下写的,用它真的超方便。


五、作品展现


六、体会

1、写程序前,特别是相对大一点的程序,一定要先设计,包括文档设计,数据结构设计和流程图设计等,这有很多的好处。

首先,事先设计,可以从大方面构思,避免主要构架上走错路,要不然等到写了大部分之后才发现关键问题,为时已晚咯,这种情况我也经历过不少次。

其次,查错修改的时候很方便,因为代码是一行一行的字母数字符号,而设计往往是一些图表,当然是图表比较容易看啦,在图表上比较容易理清思路,哪一步到哪一步?数据是在哪里出了问题?清晰了然,等到图表修改好之后,源码其实就是图表的一个翻译了。

最后,设计能让程序更好地结构化,在看着设计编程时,可以很安心地编写本模块,因为我已经充分地信任我之前的设计,要不然,你总会在编写本模块的时候,考虑到这个数据会不会被以后的代码修改?现在修改这个数据影不影响前面?等等这些问题。

2、以前写大一点的程序,需要多个文件,但每次编译都会出现什么重复定义之类的各种各样错误,虽然最后都解决了,但文件模块被搞得乱七八糟。我觉得只要弄懂extern、static和程序是如何编译链接才能真正地解决问题。extern定义在头文件H中就像个中转站一样,它代表着所对应的函数或变量可以在文件A中定义,而文件A,B,C和D都可以使用该函数或变量(其中ABCD都包含该头文件)。static定义一个函数,就像一把锁一样,表明这个函数只能在本文件模块中使用,其他的文件不可调用。

3、在linux下的完美组合:LibreOfficeWrite(文档设计),LibreOfficeCalc(数据结构设计),

LibreOfficeDraw(界面设计),Dia(流程图设计),Vim(源代码编辑)。


七、下载

源代码我已经上传了,可到此地址下载:http://download.csdn.net/detail/xuyuanfan77/4346111

此代码是基于SDL的,安装使用SDL:http://blog.csdn.net/xuyuanfan77/article/details/6627110
转载:http://blog.csdn.net/xuyuanfan77/article/details/7625242
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* *游戏说明:此为我边学边做的,但有很多的BUG,参照了我从网上下载的游戏方块设计 * 一、游戏的BUG * 1、提示分数那地方,玩过游戏后,长了分数后,再玩时,后面的数据没清掉 * 2、重级BUG:当在游戏过程中,切换了一个旁边的后,再切换回来后, * 刚才的方块不显了,而且游戏区的数据也不见了。 * 3、我在刚开始做时,没有要窗口上的关闭,现在想要,但不知道怎么加。 * 4、如果用鼠标点了菜单后,再回到游戏区,数据方块又不见了。 * * 二、此游戏没有版权,可以乱改,反正我也是在学习,谢谢那些无私的网友们,不过 * 请你们下次提交上来的源程序有个说明好不好,看得我头都大了,流程图也没得, * 设计说明也没有,完全看源代码,很费力的!谢谢对新人的支持。 * * 三、如果那位高手愿意,请收我为徒弟吧,我学过c/c++、数据结构、编译原理、操作系统等( * 计算机专业的),但对于VC这个大东西来说,,好像一点用也没有,现在在边学边做,门不好入呀! * * 四、请高手们帮帮我,请给分析一下问题在哪,谢谢,我对VC还不是很清楚,在文件目录下 * 有设计时的流程图。设计说明我没有写,我是针对每一个流程图模块来设计和编码的。 * * 五、在游戏中,我加了很多注释,以方便理解,主要的代码都在CChileView.h、CChileView.CPP中 * 我想的是,如果新人也想看看的话,可能理解起来快点。不过有点乱,编码中有些冗余。没来 * 得及改。如果你改好了,请给我一份,我想学学。谢谢! * *================================================================================================ * *编译环境: * 1、操作系统 :WindowsXP SP2 * 2、编译器 :Visual C++ 8.0 * *包含文件:所有源文件都在此。 * * *编译参考:此目录下有一个文件名为:Russia.sln的文件,用Visual C++ 8.0 打开,直接就可编译 * 此游戏是我编译通过后,才压缩的。如果编译不了,请联系我,下面有我的QQ和email。 * * *其它事宜:如果还有什么问题我没有提到的,请联系我,愿向你学习。 * *================================================================================================ * *Version :BUG Edtion * *Aauthor :lin_liu60 * *E-mail :lin_liu60@163.com * *QQ :994165 (网名:刘羽峰) * *Date :2006/9/27 * */
以前先后上传过俄罗斯方块1.0版和2.0版,1.0版只支持单机,2.0版在1.0版的基础上加了自己的socket类,实现了局域网联机对战功能,现在上传的是3.0版,又加了个录像功能。(右键打开快捷菜单) 先把2.0版的功能再复制过来一下: 1.服务器端与客户端对战,没有同时开始功能,速度也可以不一样,下落方块的种类也不是按同样的次序,没有道具功能,只是将自己的战况实时传输给对方; 2.由于我的socket类支持多个客户端连接,但是联机时只有两个视窗,一个自己的,一个对家的,所以当多个客户端接入服务器端时具体表现为:服务器端的战况都会广播给所有客户端,相当于大家观看服务器端演示,但是服务器端不显示任何一个客户端的战况;而当只有一个客户端连接服务器端时,才显示这个客户端的战况。 3.加入游戏,断开连接这两个功能在执行时,是另开线程的,我故意让关闭按钮和拖曳客户端区域移动窗口功能失效,看上去像是程序当住了,其实没当住,因为此时拖曳标题栏还是能移动窗口,右键菜单也可以弹出,这个“当住”过程会在3秒钟左右,当客户端比较多时,服务器端的这个时间会相对长一点。 现在简要说一下3.0版的录像文件格式: 录像文件是以32位的BITMAPINFOHEADER类型位图文件的形式保存的, 因为考虑到位图须4字节对齐,而32位的位图具有对齐方面的天然优势,处理方便, 真正的数据区从位图文件的图素区开始,忽略位图的文件头和信息头; 程序里附带有4个录像文件是我打的。 有问题联系:hastings1986@163.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值