收藏 分销(赏)

俄罗斯方块游戏(C语言).docx

上传人:二*** 文档编号:4522889 上传时间:2024-09-26 格式:DOCX 页数:48 大小:306.29KB
下载 相关 举报
俄罗斯方块游戏(C语言).docx_第1页
第1页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、俄罗斯方块游戏(C语言)摘要俄罗斯方块是一款风行全球的掌上游戏机和PC机游戏,它造成的轰动与 创造的经济价值可以说是游戏史上的一件大事。它由俄罗斯人阿列克谢帕基 特诺夫创造,故得此名。俄罗斯方块的基本规那么是移动、旋转和摆放游戏自动 输出的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却 变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技 巧,难度却不低。作为家喻户晓老少皆宜的群众游戏,其普及程度可以说是史 上任何一款游戏都无法相比的。相信大多数人都还记得为它痴迷得茶不思饭不 想的那个俄罗斯方块时代。由于俄罗斯方块具有的数学性、动态性与知名度, 也经常拿来作为游

2、戏程序设计的练习题材:关键词:俄罗斯方块开发游戏编程程序开发AbstractsTetris is a fashionable global handheld game and PC games,it caused stir and create the economic value of gaming history is a great event.lt is invented by the Russian Alexey Pazhitnov.The basic rule of tetris is moving,rotation and put the Game output squares,

3、It an,anged in a complete row or a complete multi row,eliminate and score.lt seems simple but Full of change.As household the mass games all ages,Its popularity is any games that cannot be compared.Tetris often used for game programming practice subject.3.1.5 游戏速度分数更新当判断出一行满时,score变量一固定值(如10),可以吧等级l

4、evel看作是速 度speed,因为速度speed是根据计分score值不断上升的,所以我们定义 Ievel=speed=score/speed_step,其中 speed_step 是每升一级所需要的分数。方 块下落速度加快,这是不断修改了定时计数器变量TimerCounter判断条件的 结果。速度越快,时间中断的间隔就越短。3.1.6 游戏帮助实现比拟简单,使用outtextxy。函数实现。3.2数据结构设计3.2.1 游戏底板BOARD结构体Struct BOARD(Int var;Int color;Table_boardVertical_boxsHorizontal_boxs;BOA

5、RD结构体表示游戏底板中每个小方块所具有的属性。其中var表示小 方块当前状态,只有0与1两个值,表示此小方块已被占用,0表示未被占 用。Color表示小方块的颜色,游戏底板的每个小方块可以拥有不同的颜色, 以增强美观。Vertical.boxs为游戏底板上垂直的方向上小方块的个数, Horizontal_boxs为游戏底板上水平的方向上小方块的个数。3.2.2 游戏方块SHAPE结构体struct SHAPEchar box2;int color;/*每个方块的颜色*/int next;/*下个方块的编号*/);SHAPE结构体表示某个游戏方块具有的属性。其中,char box2表示用2 个

6、字节来表示这个游戏方块的形状。每4位来表示一个游戏方块的一行。 Color表示每个游戏方块的颜色,颜色可设为BLACK、BLUE、GREEN、 CYAN、RE、MAGENTA、BROWN、LIGHTGRAY、DARKGRAY、 LIGHTBLUE LIGHTCYAN LIGHTRED. LIGHTMAGENTA YELLOW 和 WHITEonext表示下个游戏方块的编号,在旋转时需要用到此编号。如box0=0x88”,boxl=0xc0”,其中0x88和OxcO为十六进制表示形式,具 体表现的含义如图3.3所示。1000 口 口1000 口 口1100 口 口0000 口 口图3.3 SHA

7、PE结构示意图3.2.3 SHAPE结构数组初始化游戏方块内容,即定义MAX.BOX个SHAPE类型的结构数组,并 初始化。MAX_BOX为19。应为一共有19种不同形状的俄罗斯方块。struct SHAPE shapesMAX_BOX=*口 口口 口口* 口*口 口*/0x88,OxcO,CYAN,1,0xe8,0x0,CYAN,2,0xc4,0x40,CYAN,3,0x2e,0x(),CYAN,(),* 口 口*口 口口口* 口 口 口*/0x44,OxcO,MAGENTA, 5,Ox8e,0x0,MAGENTA, 6,Oxc8,0x80,MAGENTA, 7,0xe2,0x0,MAGEN

8、TA, 4,口口 口口 口口口 口0x8c,0x40,YELLOW, 9),0x6c,0x0,YELLOW, 8,* 口口口* 口*/k0x4c,0xc6,0x80,0x0,BROWN,BROWN,11,10),* 口口 口 口口 口*/0x4e,0x0,WHITE,13,0x8c,0x80,WHITE,14,0xe4,0x0,WHITE,15,0x4c,0x40,WHITE,12,k*口*口口口口*/0x88,0x88,RED,,kOxfO,0x0,RED,16),* 口*口 口*/Oxcc,0x0,BLUE,18)103.3函数功能描述(1) newtimer()函数原型:void int

9、errupt newtimer(void)Newtimer。函数用于为新的时钟中断处理函数。(2) SetTimer()函数原型:void SetTimer(void interrupt(*IntProc)(void)SetTimer。函数用于设置新的时钟中断处理过程。(3) KillTimer()函数原型:void KillTimer()KillTimer。函数用于恢复原有的时钟中断处理过程。(4) initialize()函数原型:void initialize( int x,int y,int m,int n)Initialize。函数用于初始化界面,具体为在传入参数x、y指明位置上画m

10、行 n列小方块,并显示积分、等级、帮助及预览游戏方块等。(5) DelFullRow()函数原型:int DelFullRow(int y)DelFullRow。函数用于处理删除一满行的情况。Y指明具体哪一行为满行。(6) setFullRow()函数原型:void setFullRow(int t_boardy)setFullRow()函数用于找到满行,并调用DelFullRow。函数来处理满行。 t_boardy为在游戏底板中的垂直方向的坐标值。(7) MkNextBox()函数原型:int MkNextBox(int box_numb)MkNextBox。函数用于生成下一个游戏方块,并返

11、回方块号。Box.numb表 示当前的游戏方块号。(8) EraseBox()函数原型:void EraseBox(int x,int y,int box_numb)iiEraseBox。函数用于清除(x,y)位置开始的编号为box_numb的游戏方块。(9) show_box()函数原型:void show_box(int x,int y,int box_numb,int color)show_box()函数用于显示(x,y)位置开始的编号为box_numb的、颜色值为 color的游戏方块。(10) MoveAble()函数原型:int MoveAble(int x,int y,int b

12、ox_numb,int direction)MoveAble。函数判断是否可以移动。(x,y)为当前方块位置,box_numb为方 块号,direction为方向标志,返回true和false。(11)主函数main。整个游戏的主控局部。4.程序实现4.1 源码分析4.1.1 程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。/*加载头文件*/#include #include #include #include /*图形函数库*/*定义按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d0012#define VK_DOWN

13、 0x5000 #define VK_UP 0x4800 #define VK_ESC 0x01 lb#define TIMER Oxlc/*设置中断号号/*定义常量*/#define MAX.BOX 19/*总共有19种各形态的方块*/#define BSIZE 20/*方块的边长是20个象素*/# define Sys_x 160/*显示方块界面的左上角x座标*/define Sys_y 25/*显示方块界面的左上角y座标列# define Horizontal_boxs 10 /*水平的方向以方块为单位的长度*/define Vertical_boxs 15/*垂直的方向以方块为单位的长

14、度*/# define Begin_boxs_x Horizontal_boxs/2 /*产生第一个方块时出现的起始位置*/define FgColor 3/*前景颜色,如文字.2-green*/# define BgColor 0/*背景颜色.0-blac*/define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的 x 座标*/# define false 0define true 1/*移动的方向刃define MoveLeft 1# define MoveRight 2define MoveDown 3# define MoveRo

15、ll 4/*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/*定义全局变量*/int current_box_numb; /*保存当前方块编号*/int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y; /*x,y 是保存方块 的当前坐标的*/int flag_newbox=false; /*是否要产生新方块的标记0*/13int speed=O;int speed=O;/*下落速度*/int score=0;/*总分*/int speed_step=3();/*每等级所需要分数*/void interrupt (*old

16、timer)(void); /*指向原来时钟中断处理过程入口的中断处 理函数指针*/struct BOARD/*游戏底板结构,表示每个点所具有的属性*/int var; /*当前状态只有。和1表示此点已被占用*/int color;/*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/Table_boardVertical_boxsHorizontal_boxs;/*方块结构*/struct SHAPEchar box2;行/*一个字节等于8位,每4位来表示一个方块的一如:box0=0x88”,boxl=0xc0” 表示的是:1000100011000000*/int color;/*每个

17、方块的颜色*/int next;/*下个方块的编号号);/*初始化方块内容.即定义MAX.BOX个SHAPE类型的结构数组,并初始化*/struct SHAPE shapesMAX_BOX= 口 口口14* 口*口 口*/0x88,OxcO,CYAN,“,0xe8,0x0,CYAN,2,0xc4,0x40,CYAN,3,0x2e,0x0,CYAN,0, 口 口口 口0x44, OxcO, Ox8e, 0x0, 0xc8, 0x80, 0xe2, 0x0,MAGENTA, 5,MAGENTA, 6,MAGENTA, 7,MAGENTA, 4,* 口* 口口口口* 口口口*/0x8c, 0x40,

18、YELLOW, 9),0x6c, 0x0,YELLOW, 8,* 口口口* 口口口口* */0x4c, 0x80, BROWN, 11,1515* 口Oxc6, 0x0, BROWN, 10),口 口0x4e,0x0,WHITE, 13,0x8c,0x80,WHITE, 14,0xe4,0x0,WHITE, 15,0x4c,0x40,WHITE, 12), 口*/口口口*/0x88,OxfO, /*0x88,OxfO, /*0x88,0x0,* 口口* 口口*/Oxcc, );0x0,RED,RED,16),BLUE,18)/*定时计数器变量*/unsigned int TimerCounte

19、r=0;4.1.2 主函数 main()Main。函数主要是实现了对整个程序的运行控制,以及相关功能模块的调fflo16Key: Tetris development , Game programming , program development目录1 .前言1.功能描述22 .总体设计32.1 功能模块设计3游戏执行主流程32.1.1 游戏方块预览3游戏方块控制52.1.2 游戏显示更新6游戏速度分数更新72.1.3 游戏帮助72.2 数据结构设计7游戏底板BOARD结构体72.2.1 游戏方块SHAPE结构体7SHAPE结构数组82.3 函数功能描述11.程序实现122.4 源码分析12

20、程序预处理122.4.1 主函数 main。16初始化界面212.4.2 时钟中断处理22void main()int GameOver=0;int key,nextbox;int Currentaction=0;/*标记当前动作状态*/int gd=VGA,gm=VGAHI,errorcode;initgraph(&gd,&gm;H,);errorcode = graphresult();if (errorcode != grOk)(printf(HnNotice:Graphics error: %snM, grapherrormsg(errorcode);printf(Press any

21、key to quit!);getch();exit(l);)setbkcolor(BgColor);setcolor(FgColor);randomize();SetTimer(newtimer);initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/* 初始化*/nextbox=MkNextBox(-1);show_box(Curbox_x,Curbox_y,current_box_numb,shapeslcurrent_box_numbJ.color );show_box(LeftWin_x,Curbox_y+200,nextbox

22、,shapeslnextboxj.color);show_intro(Sys_x,Curbox_y+320);getch();while(l)/* Currentaction=0;17flag_newbox=false; 检测是否有按键*/ if (bioskey(l)key=bioskey(0); else key=O; switch(key) (case VK_LEFT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-

23、=BSIZE;Currentaction=MoveLeft;break;case VK_RIGHT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentact ion=MoveRight;break; case VK_DOWN:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)EraseBox(Curbox_x,Curbox_y,curr

24、ent_box_numb);Curbox_y+=BSIZE;Currentact ion=MoveDown;)else flag_newbox=true; break;case VK_UP:/*旋转方块*/if(MoveAble(Curbox_x,Curbox_y,shapescurrent_box_numb.next,MoveRoll)18EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapescur rent_box_numbl.next;Currentaction=MoveRoll;) break;case

25、VK_ESC:GameOver= 1;break;default:break;)if(Currentaction)/*表示当前有动作,移动或转动*/show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color );Currentaction=0;)/*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox)(/*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ ErasePreBox(LeftWin_x,Sys_y+200,nextbox);nextbox=MkNextBox(next

26、box);show_box(LeftWin_x,Curbox_y+200,nextbox,shapeslnextbox.color);if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)/*Ri一开始,游19戏结束*/show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color );GameOver= 1;) else (flag_newbox=false;)Currentaction=0;)else /*自由下落*/(if (Currentacti

27、on=MoveDown | TimerCounter (20-speed*2)(if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown) (EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color );)TimerCounter=0;20if(GameOver )/*| flag_newbox=-1 */printf(ugame o

28、ver,thank you! your score is %dn,score);getch();break;getch();KillTimer();closegraph();初始化界面玩家进行游戏时,需要对游戏界面进行初始化工作。此代码被main。函数调 用。主要进行的工作如下:(1)循环调用line()函数绘制当前游戏板。(2)调用ShowScore。函数显示初始的成绩,初始成绩为0。调用ShowSpeed。函数显示初始的速度(等级),初始速度1。/*初始化界面*参数说明:x,y为左上角坐标m,n 对应于 Vertical_boxs,Horizontal_boxs分别表示纵横方向上方块的个数

29、(以方块为单位)BSIZE Sys_x Sys_y*2* 7,7,*5 *3*7,*1* 7,7,*1* 7.7,/.卜 rj% rj* 4.rj%rj*rjw rj,.rrj* ,.、,卜 rj* rj* /void initialize(int x,int y,int m,int n)21int i,j,oldx;oldx=x;for(j=0;jn;j+)(for(i=0;i=t_boardy;n)(if(n=Vertical_boxs )continue; /*超过低线了*/for(m=0;mHorizontal_boxs;m+)/* 水平的方向*/264.1.5 成绩、速度及帮助的显示

30、24满行处理254.1.6 游戏方块的显示和清除29游戏方块操作判断处理344.2运行结果40游戏初始状态404.2.1 游戏进行状态415.结论42致谢43参考文献44/*发现有一个是if(!Table_boardn+full_numbm.var)break;空就跳过该行*/)/*找到满行了*/*第一次献给了 n,最高的/*清除游戏板里的该/*统计找到的行数*/*找到满行了*/*第一次献给了 n,最高的/*清除游戏板里的该/*统计找到的行数*/if(m=Horizontal_boxs)(if(n=t_boardy+3)*/top=DelFullRow(n+full_numb);行,并下移数据

31、*/elseDelFullRow(n+full_numb);full_numb+;if(full_numb)(int oldx,x=Sys_x,y二BSIZE*top+Sys_y;oldx=x;score=score+fun_numb*10;/* 加分数*/*这里相当于重显调色板*/for(n=top;n=Vertical_boxs)continue;/* 超过低线 了 */for(m=0;m=0;n-)/*从当前行往上看*/ (totoal=0;for(m=0;mHorizontal_boxs;m+) ( if( !Table_boardLn mJ. var)totoal+;/* 没占有方格

32、+ 1*/if(Table_boardn m. var! =Table_boardn-1 m. var) /* 上行不等 于下行就把上行传给下行xor关系刃 (Table_boardn m. var=Table_boardn-1 m .var;Table_boardlnJ mJ .color=Table_boardLn-1J LmJ .color; ) ) if(totoal=Horizontal_boxs)/* 发现上面有连续的空行提前结束*/ ( top=n; break; ) ) return(top);/* 返回最高点*/)游戏方块的显示和清除游戏方块的显示和清除是游戏中经常出现的操作

33、。主要进行的过程如下: (1)调用 show_box(int x,int y,int box_numb,int color)函数,在(x,y)位置开始,用指定颜色color显示编号为box_numb的游戏方块。29(2)调用 EraseBox(int x,int y,int box_numb)函数,清除在(x,y)位置开始的方 块编号为box_numb的游戏方块。*显示指定的方块*/void show_box(int x,int y,int box_numb,int color)(int i,ii,ls_x=x;if(box_numb=MAX_BOX)/*指定的方块不存在*/box_numb=

34、MAX_BOX/2;setfillstyle(SOLID_FILL,color);/曲曲4kf Tw rr *7、卜 *7、*7、*7、*T* *T T *7* T *T *T T 7 * 移位来判断第哪一位是1* 方块是每1行用半个字节来表示* 128d=1000 0000b. :. T TW Tw r1 T T*1 *T* *7 T ri ffor(ii=0;ii2;ii+)(int mask=128;for(i=0;i8;i+)(if(i%4=0 & i!=0)/*表示转到方块的下一行了*/y+=BSIZE;x=ls_x;if(shapesbox_numb.boxii)&mask)bar(x,y,x+BSIZE,y+BSIZE);30line(x,y,x+BSIZE,y);line(x,y,x,y+BSIZE);Iine(x,y+BSIZE,x+BSIZE,y+BSIZE);line(x+BSIZE,y,x+BSIZE,y+BSIZE);

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 初中其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服