第一章俄罗斯方块游戏
俄罗斯方块游戏
本章的内容介绍了如何使用c语言开发简单的tertris游戏,并详细说明了其具体实现过程。
1.1第一个项目
1.1.1作业
2004年7月1日,晴天,我的作业
离开学校前10分钟,我们最尊敬的节目教师TC给我们布置了夏季作业。标题简单,——是c语言的tertris游戏(图形。使成h的提示),并提醒要做好电前分析工作。
1.1.2准备
2004年7月3日,刮了风
老师的建议:在进行项目之前,一定要好好构思和计划项目,根据需要计划开发过程。所以在计算机上绘制了简单的项目开发流程图,如图1-1所示。
图1-1开发流程图
q功能分析:分析整个系统所需的功能。
q模块结构计划:计划系统所需的功能模块。
q总体设计:分析系统处理过程,探索系统核心模块的运行情况。
q数据结构:设计系统所需的数据结构;
q编程函数:预先计划系统需要的功能函数。
q特定代码:编写系统的特定实现代码。
1.2电源分析
2004年7月4日,阳光明媚
基本结构如图1-2所示。
图1-2 Tetris游戏的基本结构
以这种方式总结了tertris游戏的基本功能模块,制作了简单的项目计划书,整个计划书分为两部分:
q系统需求分析;
q结构计划。
1.2.1分析系统要求
1)游戏盒的预览功能
运行游戏后,如果底部出现游戏框,预览界面中将显示以下框,以便玩家进行预览控制:此游戏共有19个长方体,因此随机生成的游戏长方体显示在长方体预览区域中。
2)游戏盒的控制功能
游戏玩家可以移动为左移、右移、快速下移、自由落体和自动删除行而显示的框。
3)更新游戏显示器
在游戏中移动长方体时,必须移除旧的游戏长方体,然后在新的坐标位置重画新的长方体。
4)设定游戏速度和更新分数
可以用游戏分数除以行数。例如,可以设置10点删除整行。达到一定的量后,游戏选手需要进行等级升级。随着玩家水平的提高,箱子的下落速度加快,游戏的难度相应提高。
5)系统帮助
游戏玩家进入游戏系统后,通过帮助了解游戏的操作提示。
一个tertris游戏的基本功能也是以上5种,当然现实中的游戏产品更复杂,但其基本功能都大同小异。
1.2.2结构计划
从现在开始进入救援计划阶段。为了加深印象,我们创建了模块结构,如图1-3所示。
图1-3游戏的模块结构
1.2.3选择工具
2004年7月5日,晴天,工具混乱
建议选择Turbo C。因为在DEV-C中使用graphics.h更复杂!
两天内,确定了整个项目的功能模块,制定了总体计划,选择了开发工具。接下来,我们将进入总体设计阶段。
1.3总体计划
分析完整的配置功能后,可以根据每个配置功能模块进行完整的设计处理。主要包括两个方面:
运行q流程分析;
q核心处理模块分析。
1.3.1运行流程分析
2004年7月6日早晨,阳光明媚
整个游戏的特定操作流程图。
如图1-4所示,向左移动VK_LEFT,向右移动VK_RIGHT,向下移动VK_DOWN,旋转VK_UP,然后退出VK_Esc键以查看关键点值。以上几个键移动处理的具体说明如下。
调用Q VK_LEFT: MoveAble()函数以确定是否可以向左移动,如果可以,请调用EraseBox函数以清除当前游戏框。下一步将调用show_box()函数,在向左移动的位置显示当前游戏的框。
Q VK_RIGHT:右移处理,类似于上述VK_LEFT处理。
Q VK_DOWN:下移处理,如果不能再移动,则必须将flag_newbox标志设置为1。
Q VK_UP:旋转处理,首先确定是否执行旋转动作,其中必须满足多个条件,如果不符合条件,则不执行。
Q VK_Esc:按Esc键结束游戏。
图1-4游戏运行过程
1.3.2核心处理模块分析
2004年7月6日下午,多云,还有很长的路要走
1.预览方块
新游戏的矩形可以在44个小矩形框中预览,可以使用rand()随机函数生成1到19之间的游戏长方体编号作为预览的长方体编号。其中,pinnik high square小矩形的大小由BSIZEBSIZE计算。
2.游戏盒控制处理
长方体的移动控制是整个游戏的重点和难点,具体内容如下:
1)向左处理
处理过程如下:
(1)判断能否向左移动有两个条件。向左移动一个位置不能超出后板的左侧线,否则超出边界。而且,在游戏框中有值(值为1)的位置,游戏背板不能被占用(占用值为1)。
(2)向左移动之前,先清除游戏盒。
向左移动一个位置,重新显示这个游戏的方块。
2)向右移动处理
处理过程如下:
(1)有两个条件判断能否向右移动。向右移动一格不能超过游戏底部的右侧线,否则超过边界。游戏盒有值位置,游戏背板不能占用。
(2)向右移动之前,先清除游戏盒。
向右移动一个位置,重新显示这个游戏的方块。
3)下移处理
处理过程如下:
(1)有两个条件来判断能否向下移动。向下移动一格也不能越过游戏底部的底部,否则会超过限制。游戏框中有值位置,不能占用游戏底板。如果满足以上两个条件,则可以向下移动。否则,flag_newbox设置为1,此标志由主循环确定。
(2)向下移动之前,先清除游戏盒。
(3)向下移动一个位置,重新显示这个游戏的方块。
4)旋转处理
处理过程如下:
(1)有两个条件来判断旋转是否可能。也就是说,旋转后的箱子不能超出游戏背板的底部、左侧和右侧线,否则超出边界。游戏盒有值位置,游戏背板不能占用。
(2)旋转前清除游戏盒。
(3)在游戏框显示区域(44)的位置,使用当前游戏框数据结构中的next值作为旋转后形成的新游戏框的编号,并重新显示此编号的游戏框。
3.刷新显示
在游戏中移动框的同时清除旧游戏框,并用新坐标重画游戏框。删除整行后,重新绘制游戏底板的当前状态。清除游戏盒的方法是画出轮廓,填充小方块,填充背景色,然后使用前景色绘制游戏背板上的小方块。重复此过程,更改当前坐标,填充并绘制19个小方块,从游戏基板中清除此游戏框。
4.处理游戏速度和分数更新
如果行已满,积分变量score将增加固定值,然后将等级变量level与速度变量speed相关联,那么等级越高,结果越快。
2004年7月6日晚,整体设计的重要性
设计数据结构
1.4数字配置
2004年7月7日早晨,阳光充足
我设计了系统所需的数据结构。
1.游戏地板结构
这里的游戏基础结构是BOARD,具体代码如下:
Struct BOARD/*游戏底板结构,表示每个点具有的属性*/
Int var/*当前状态只有0和1,1表示此点已被占用*/
Int color/*颜色,游戏底部的每个点可以有不同的颜色,提高美感*/
} table _ board[vertical _ boxs][horizontal _ boxs];
其中,BOARD结构表示游戏底板中每个小矩形的属性,var表示当前状态,0表示未使用,1表示已占用。
2.游戏盒结构
这里的游戏盒结构是SHAPE,具体代码如下:
Structshape}
/*一个字节是8位,表示游戏框中的每4位一行(例如, box [0]='0x88 ',box [1]='0xc0 '表示:)
1000
1000
1100
0000*/
char box[2];
Int color/*每个方块的颜色*/
Int next/*下一个框中的编号*/
}
SHAPE结构表示小框的属性,char box[2]表示块形状(2字节),每个4位表示一行框。Color表示每个框的颜色,可以根据需要设置颜色值。
3.shape结构阵列
这里的游戏盒结构是SHAPE,具体代码如下:
/*初始化框内容。也就是说,定义MAX_BOX的SHAPE类型的结构数组和初始化*/
Struct SHAPE shapes[MAX_BOX]=
/*
*嘴,嘴,嘴,嘴
*嘴,嘴,嘴
*口
*/
{0x88,0xc0,CYAN,1},
{0xe8,0x0,CYAN,2},
{0xc4,0x40,CYAN,3},
{0xfe,0x0,cyan,0},
/*
*嘴,嘴,嘴
*嘴
*嘴,嘴,嘴
*/
{0x44,0xc0,MAGENTA,5},
{0x8e,0x0,MAGENTA,6},
{0xc8,0x80,MAGENTA,7},
{0xe12,0x0,magenta,4},
/*
*口
*口
*口
*/
{0x8c,0x40,YELLOW,9},
{0x6c,0x0,YELLOW,8},
/*
*口
*口
*口
*/
{0x4c,0x80,BROWN,11},
{0x6,0x0,brown,10},
/*
*口
*嘴,嘴,嘴,嘴,嘴
*口
*/
{0x4e,0x0,WHITE,13},
{0x8c,0x80,WHITE,14},
{0xe4,0x0,WHITE,15},
{0x4c,0x40,WHITE,12},
/*口
*口
*嘴,嘴,嘴
*口
*/
{0x88,0x88,RED,17},
{0x0,0x0,red,16},
/*
*口
*口
*/
{0xcc,0x0,BLUE,18}
}
在上面的代码中,定义了类型为MAX_BOX SHAPE的结构数组,并执行了初始化过程。MAX_BOX为19,因为总共有19个不同的长方体类型。
2004年7月7日晚,数据结构的重要性
1.5神秘的箱子
2004年7月8日晴朗的天空
武侠小说,成人童话。从少年开始,我就迷上了武侠小说,和我一起上了大学。我还记得我特别执着于神秘盒子的时候。
九龙武侠名作《英雄无泪》的对话中最强大的武器是一箱。在我读完完整的文章后,我意识到这不是一个简单的箱子,箱子里有很多零件,可以根据不同的对手迅速配置战胜对方的武器。
现在我发现这个盒子和程序的函数太相似了!要以编程方式解决问题并实现功能,可以编写函数并实现它。如果存在多个问题,可以编写多个函数来实现。函数是我们编程的那个神秘盒子。
书马上就传了,我预先安装并定义了整个项目需要的函数。
1.函数NewTimer
函数NewTimer用于实现具有以下结构的新时钟:
Void中断网路时间(void)
2.函数SetTimer
函数SetTimer用于设置新时钟的处理过程,如下所示:
Void settimer (void中断(* intproc) (void))。
3.函数KillTimer
KillTimer函数用于恢复原始时钟处理过程,如下所示:
Void KillTimer()
4.函数initialize
Initialize函数用于初始化接口,如下所示:
Void initialize (int x、int y、int m、int n)
5.函数DelFullRow
DelFullRow函数用于删除整行,y设置删除的行数,如下所示:
Int DelFullRow(int y)
6.函数setFullRow
SetFullRow函数查询整个行,并使用以下结构调用DelFullRow函数进行处理:
void setfull row(int _ boardy)
7.函数MkNextBox
函数MkNextBox用于生成以下游戏长方体,并根据以下结构返回长方体编号:
Int MkNextBox(int box_numb)
8.函数EraseBox
函数EraseBox用于清除从(x,y)位置开始的box_numb编号的游戏框,如下所示:
Void erase box (int x,int y,intbox _ numb)
9.函数show_box
函数show_box用于显示box_numb编号和颜色值为color的游戏框,以(x,y)位置开始,如下所示:
Void show _ box (int x,int y,intbox _ numb,int c
展开阅读全文