背景
2015 年 C 程序设计专题课程第三次 Project,基于 bhh 老师移植加改写的 watcom c + graphics.h 实现。
除了 dosbox 效率比较坑,也没有什么太多的问题吧(其实是已经记不清了
v20150614 版俄罗斯方块(其实只是修改日期……)实现了基本的功能 + 排行榜,但是具体的设置界面当时为了赶 DDL 就没有去写,时间都基本耗在 bgm 的实现上去了……(找了各种 dos 下 wav 的播放实现,翻遍了各种“远古”的论坛,最后却发现库函数里提供了相应的函数 T_T
v20150628 版是为了课上展示准备的版本,当时用了一上午?把界面改的舒服了一些,同时增加了方块在底部的投影以及方块的暂存功能。
打字游戏
俄罗斯方块v20150614
俄罗斯方块v20150628
报告及源码
一、问题说明
在Dosbox环境下,自行设计相关的算法与数据结构,实现图形化的俄罗斯方块与文本形式的打字游戏。
二、算法设计与说明
俄罗斯方块的算法主要涉及到对应图形的绘制以及对应储存矩阵(数组)的操作。我们采用了通过显示器频率中断控制扫描状态池矩阵的数据进行全屏输出与脏矩形绘制相结合的方法进行了图形的绘制,然而由于平台的限制,画面仍有一定可能出现抖动或卡滞的情况。在对方块的操作中,我们则每次获取按键后,扫描矩阵以获得当前活动的方块区域,在对其进行对应的移位或伪转置操作(实现旋转)。(By LLonely)
打字游戏的设计则是随机获取单词,并依次在随机位置输出,判断按键与屏幕上活动单词的匹配情况,再依次循环判断,若不匹配,则重置标记,再次重新开始匹配。如果有活动单词被匹配完毕,则激活动画,并清除该单词。通过循环与延迟函数更新屏幕的状态,控制活动单词的产生、移动与消失,同时刷新得分与统计数据。(By MagicPants)
三、数据结构设计与说明
在俄罗斯方块中:
- 采用了一个状态池(pool结构的二维数组)来储存所有池内位置的状态与颜色,也就是此前所提到的矩阵。结构定义如下:
12345struct pool{int state;int color;}tetris[FIX_Y+20][10];//FIX_Y=4为不可见区域
- 采用了一个brick_default结构来储存不同种类方块(I、O、L、J、S、Z、T形方块)的颜色、规模与形状。结构定义如下:
123456struct brick_default{long color;int scale;int pattern[4][4];}brick[7];
- 采用SCORE结构储存得分与对应信息。结构定义如下:
123456typedef struct{unsigned long score;time_t _time;int total;} SCORE;
- 采用了一个menu_entry结构进行菜单的储存,同时开发了framework模块对该结构进行操作(未完成)。结构定义如下:
12345678910struct menu_entry{char name[51];int is_active;int is_available;struct menu_entry *previous;struct menu_entry *next;int is_with_radio;radio * option;};
- 采用了一个position结构的一维数组来储存变更的状态以实现脏矩形绘制。
在打字游戏中:
- 采用了白老师所提供示例中的一系列针对字典操作的数据结构。
- 定义了一个WORD结构来储存对应的单词。结构定义如下
12345typedef struct{char word[20];int x,y,flag,is_null;}WORD;
四、系统设计难点与解决方案
打字游戏除字典读取外无难点(有示例可解决)。以下难点针对于俄罗斯方块。
1、难点:
①俄罗斯方块的旋转操作。
②绘图效果的优化。
③动态效果与时间控制。
2、解决方案(与难点对应):
①确定当前活动方块的范围后,截取该区域的活动方块状态,进行矩阵的旋转操作,适当调整形状后,与状态池进行比对,判断能否放入状态池,若能则在状态池中清除原有的活动方块,更新为新的活动方块;若不能则放弃此次旋转。
②采用脏矩形的方法绘制,明显降低了画面的抖动。
③采用通过读取屏幕的垂直回扫中断进行时间的控制。
五、人员分工说明
本小组依旧采用Git进行版本库控制。其中,俄罗斯方块主要由LLonely开发,MagicPants负责测试及细节的调整,打字游戏主要由MagicPants开发,LLonely负责测试以及对应的优化。
六、源码
我会在 GitHub 上建一个 Repo ,把那些代码 push 上去……(不过肯定不是原 Repo