ImageVerifierCode 换一换
格式:DOCX , 页数:48 ,大小:306.29KB ,
资源ID:4522889      下载积分:5 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4522889.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(俄罗斯方块游戏(C语言).docx)为本站上传会员【二***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

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

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

2、拿来作为游戏程序设计的练习题材: 关键词:俄罗斯方块开发游戏编程程序开发Abstracts Tetris 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

3、 squares,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变量一固定

4、值(如10),可以吧等级level看作是速 度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_boar

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

6、方块的编号*/ ); SHAPE结构体表示某个游戏方块具有的属性。其中,char box[2]表示用2 个字节来表示这个游戏方块的形状。每4位来表示一个游戏方块的一行。 Color表示每个游戏方块的颜色,颜色可设为BLACK、BLUE、GREEN、 CYAN、RE、MAGENTA、BROWN、LIGHTGRAY、DARKGRAY、 LIGHTBLUE> LIGHTCYAN > LIGHTRED. LIGHTMAGENTA > YELLOW 和 WHITEo next表示下个游戏方块的编号,在旋转时需要用到此编号。 如box[0]="0x88”,box[l]="0xc0”,其中0x88和

7、OxcO为十六进制表示形式,具 体表现的含义如图3.3所示。 1000 ■口 □口1000 ■口 □口 1100 ■■口 口 0000 口 □□口 图3.3 SHAPE结构示意图 3.2.3 SHAPE结构数组 初始化游戏方块内容,即定义MAX.BOX个SHAPE类型的结构数组,并 初始化。MAX_BOX为19。应为一共有19种不同形状的俄罗斯方块。 struct SHAPE shapes[MAX_BOX]= * 口 □ □口 口 口 口 * □ □ □ □ □口 * 口 口 □ */ {0x88, OxcO, CYAN, 1},

8、 {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, MAGENTA, 4}, 口 口 口 口 口 口 口 口 {0x8c, 0x40, YELLOW,

9、 9), {0x6c, 0x0, YELLOW, 8}, * 口口口 * □口*/ k {0x4c, {0xc6, 0x80, 0x0, BROWN, BROWN, 11}, 10), * □ □ □ * □ □口 口 口 □ □口 口 口 * □ □ □ */ {0x4e, 0x0, WHITE, 13}, {0x8c, 0x80, WHITE, 14}, {0xe4, 0x0, WHITE, 15}, {0x4c, 0x40, WHITE, 12}, k □

10、 * 口 * 口 口口□口 * □ */ {0x88, 0x88, RED, ⑺, k {OxfO, 0x0, RED, 16), * □ 口 * 口 口 */ {Oxcc, 0x0, BLUE, 18) 10 3.3函数功能描述 (1) newtimer() 函数原型:void interrupt newtimer(void) Newtimer。函数用于为新的时钟中断处理函数。 (2) SetTimer() 函数原型:void

11、 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行 n列小方块,并显示积分、等级、帮助及预览游戏方块等。 (5) DelFullRow() 函数原型:i

12、nt DelFullRow(int y) DelFullRow。函数用于处理删除一满行的情况。Y指明具体哪一行为满行。 (6) setFullRow() 函数原型:void setFullRow(int t_boardy) setFullRow()函数用于找到满行,并调用DelFullRow。函数来处理满行。 t_boardy为在游戏底板中的垂直方向的坐标值。 (7) MkNextBox() 函数原型:int MkNextBox(int box_numb) MkNextBox。函数用于生成下一个游戏方块,并返回方块号。Box.numb表 示当前的游戏方块号。 (8) Erase

13、Box() 函数原型:void EraseBox(int x,int y,int box_numb)ii EraseBox。函数用于清除(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 box_numb,int directio

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

15、00#define VK_RIGHT 0x4d00 12#define VK_DOWN 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 /*水平

16、的方向以方块为单位的长度*/define Vertical_boxs 15/*垂直的方向以方块为单位的长度*/ # 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 Mo

17、veLeft 1 # define MoveRight 2define MoveDown 3 # define MoveRoll 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;

18、/*下落速度*/ int score=0; /*总分*/ int speed_step=3(); /*每等级所需要分数*/ void interrupt (*oldtimer)(void); /*指向原来时钟中断处理过程入口的中断处 理函数指针*/ struct BOARD/*游戏底板结构,表示每个点所具有的属性*/ int var; /*当前状态只有。和1』表示此点已被占用*/ int color;/*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/}Table_board[Vertical_boxs][Horizontal_boxs]; /*方块结构*/struct

19、 SHAPE char box[2]; 行 /*一个字节等于8位,每4位来表示一个方块的一 如:box[0]="0x88”,box[l]="0xc0” 表示的是: 1000 1000 1100 0000*/ int color; /*每个方块的颜色*/ int next; /*下个方块的编号号 ); /*初始化方块内容.即定义MAX.BOX个SHAPE类型的结构数组,并初始化*/struct SHAPE shapes[MAX_BOX]= □ □口 口口14 * □ □ □ □ □口 * 口 口 □ */ {0x88, OxcO, C

20、YAN, “, {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,YELLOW, 9), {0x6c, 0x0,YELLOW, 8}, * 口口口 * 口

21、口口口 * □ */ {0x4c, 0x80, BROWN, 11},15 15 * □□口 {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, );

22、 0x0, RED, RED, ⑺, 16), BLUE, 18) /*定时计数器变量*/ unsigned int TimerCounter=0; 4.1.2 主函数 main() Main。函数主要是实现了对整个程序的运行控制,以及相关功能模块的调fflo 16 Key: Tetris development , Game programming , program development目录 1 .前言1.功能描述2 2 .总体设计3 2.1 功能模块设计3游戏执行主流程3 2.1.1 游戏方块预览3游戏方块控制5 2.1.2 游戏显示更新6游戏速

23、度分数更新7 2.1.3 游戏帮助7 2.2 数据结构设计7游戏底板BOARD结构体7 2.2.1 游戏方块SHAPE结构体7SHAPE结构数组8 2.3 函数功能描述11.程序实现12 2.4 源码分析12程序预处理12 2.4.1 主函数 main。16初始化界面21 2.4.2 时钟中断处理22void main() int GameOver=0; int key,nextbox; int Currentaction=0;/*标记当前动作状态*/ int gd=VGA,gm=VGAHI,errorcode; initgraph(&gd,&gm;H,); erro

24、rcode = graphresult(); if (errorcode != grOk) (printf(H\nNotice:Graphics error: %s\nM, grapherrormsg(errorcode)); printf("Press any key to quit!");getch(); exit(l); ) setbkcolor(BgColor); setcolor(FgColor); randomize(); SetTimer(newtimer); initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_bo

25、xs);/* 初始化*/ nextbox=MkNextBox(-1);show_box(Curbox_x,Curbox_y,current_box_numb,shapeslcurrent_box_numbJ.color ); show_box(LeftWin_x,Curbox_y+200,nextbox,shapeslnextboxj.color); show_intro(Sys_x,Curbox_y+320); getch(); while(l)/* Currentaction=0; 17flag_newbox=false; 检测是否有按键*/ if (bioskey(l)){k

26、ey=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- =BSIZE;Currentaction=MoveLeft;}break; case VK_RIGHT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)){EraseBox(C

27、urbox_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,current_box_numb);Curbox_y+=BSIZE;Currentact ion=MoveDown;) else flag_newbox=true; break;case VK_UP:/*旋转方块*/ if(

28、MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll))18 {EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[cur rent_box_numbl.next;Currentaction=MoveRoll; ) break;case VK_ESC: GameOver= 1;break; default: break;) if(Currentaction){/*表示当前有动作,移动或转动*/ show_box(Cur

29、box_x,Curbox_y,current_box_numb,shapes[current_box_numb].color );Currentaction=0; ) /*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox)( /*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ ErasePreBox(LeftWin_x,Sys_y+200,nextbox);nextbox=MkNextBox(nextbox); show_box(LeftWin_x,Curbox_y+200,nextbox,shapeslnextbox].color);if(!Move

30、Able(Curbox_x,Curbox_y,current_box_numb,MoveDown))/*Ri]一开始,游 19戏结束*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color );GameOver= 1; ) else (flag_newbox=false; )Currentaction=0; )else /*自由下落*/ (if (Currentaction==MoveDown || TimerCounter> (20-speed*2)) (if(MoveAble(C

31、urbox_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,shapes[current_box_numb].color ); )TimerCounter=0; 20if(GameOver )/*|| flag_newbox==-1 */ printf(ugame over,thank you! your score is %dn,score);

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

33、的个数(以方块为单位)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) 21 int i,j,oldx; oldx=x; for(j=0;j

34、SIZE,y); line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE; ) y+=BSIZE; x=oldx; ) Curbox_x=x; Curbox_y=y;/*x,y是保存方块的当前坐标的*/ flag_newbox=false; /*是否要产生新方块的标记0*/ speed=0;/*下落速度*/ score=0;/* 总分*/ ShowScore(score); ShowSpeed(speed);时钟中断处理 随着用户等级的

35、提高,需要加快方块的下落速度,以增加游戏难度。速度越22 快,时间中断的间隔就越短。主要进行的工作如下: (1)定义新的时钟中断处理函数void interrupt newtimer(void)o (2)使用SetTimer()设置新的时钟中断处理过程。 (3)定义中断恢复过程KillTimer。。 void interrupt newtimer(void)( (*oldtimer)(); /* call the old routine */ TimerCounter++;/* increase the global counter */ )/*设置新的时钟中断处理过程列 voi

36、d SetTimer(void interrupt(*IntProc)(void)) ( oldtimer=getvect(TIMER); /*获取中断号为TIMER的中断处理函数的入口 地址*/ disable。;/*设置新的时钟中断处理过程时,禁止所有中断*/ setvect(TIMER,IntProc); /*将中断号为TIMER的中断处理函数的入口地址改为IntProc。函数的入 口地址 即中断发生时,将调用IntProc。函数。*/ enable(); /* 开启中断 */ )/*恢复原有的时钟中断处理过程*/ void KillTimer() disable();

37、setvect(TIMER,oldtimer);23 enable(); 2.4.3 成绩、速度及帮助的显示 成绩、速度及帮助的显示是此游戏开发的一局部。不要进行的工作如下: (I)调用ShowScore。函数,显示当前用户的成绩,成绩是不断提高的。 (2)调用ShowSpeedO函数,显示当前游戏方块的下落速度,速度与等级是成正比的。 (3)调用Show_help()函数,提示用户如何进行游戏的相关操作,此函数只 在初始局部调用。 /*显示分数*/void ShowScore(int score) int x,y; char score_str[5];/*保存游戏得分*/

38、 setfillstyle(SOLID_FILL,BgColor); x=LeftWin_x; y=100; bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3); sprintf(score_str," %3d'\score); outtextxy(x,y,nSCORE"); outtextxy(x,y+10,score_str);/*显示速度*/ void ShowSpeed(int speed) int x,y;24 char speed_str[5];/* 保存速度值*/ setfillstyle(SOLID_FILL,BgColor); x=Le

39、ftWin_x; y=150; bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3); /*确定一个以(xl,yl)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模 和颜色填充。刃 sprintf(speed_str,n%3dn,speed+1); outtextxy(x,y,"Level"); outtextxy(x,y+10,speed_str); /*输出字符串指针speed_str所指的文本在规定的(x, y)位置*/ outtextxy(x,y+50,',Nextboxn);) 2.4.4 满行处理 在左移、右移、旋转和下落动作不能进行时,即

40、游戏方块不满足相关操作条 件时,需要对游戏主板进行是否有满行的判断,假设有满行的情况,那么必须进行 消除满行的处理。如图4.1所示,当竖直的游戏方块下落在当前游戏板中,不 能再下移时,出现了两个行事满的,那么必须进行满行处理。满行处理包括两个 动作:第一,找到满行;第二,处理此满行。 1)调用selFuURow。函数 调用setFullRow。函数,找到一满行。具体过程如下: (1)对当前游戏方块落在的位置,从下到上逐行判断,假设该行的小方块的值 为1的个数等于游戏主板行的大小时,那么该行为满行,立即调用DelFullRow() 函数进行满行处理,并返回当前的游戏主板的非空行的最高点。否

41、那么,继续进 行对上一行的判断,直到游戏方块的最上行。 (2)假设有满行,那么根据DelFullRow。函数处理后的游戏主板Tabljboard数组25 中的值,进行游戏主板的重绘,即显示消除行后的游戏界面,并且对成绩和速 度进行更新。 2)调用 DelFullRow。函数 调用DelFullRow。函数,处理此满行,主要执行的是将上行数据移至下移的 操作。 图4.1满行示意图/*找到一行满的情况*/ void setFullRow(int t_boardy) ( int n,full_numb=0,top=0;/*top保存的是当前方块的最高点*/ register m;/*

42、 t_boardy 口 5口6 □□口□□口7n□□□□□□8 */ for(n=t_boardy+3;n>=t_boardy;n—) (if(n<0 || n>=Vertical_boxs ){continue;} /*超过低线了*/ for(m=0;m

43、e_board[n+full_numb][m].var)break;空就跳过该行*/ )/*找到满行了*/ /*第一次献给了 n,最高的 /*清除游戏板里的该 /*统计找到的行数*/ /*找到满行了*/ /*第一次献给了 n,最高的 /*清除游戏板里的该 /*统计找到的行数*/ if(m==Horizontal_boxs)( if(n==t_boardy+3)*/ top=DelFullRow(n+full_numb);行,并下移数据*/ elseDelFullRow(n+full_numb); full_numb++; if(full_numb) (int

44、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

45、[m] .color*/27 27 else setfillstyle(SOLID_FILL,BgColor); bar(x,y,x+BSIZE,y+BSIZE);line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE; )y+=BSIZE; x=oldx;) ShowScore(score);if(speed! =score/speed_step) {speed=score/speed_step;

46、 ShowSpeed(speed);} else{ShowSpeed(speed);} }) /*删除一行满的情况 * 这里的y为具体哪一行为满 */int DelFullRow(int y) ( /*该行游戏板往下移一行列 int n,top=0;/*top保存的是当前最高点,出现一行全空就表示为最点了,移动是到最高点结束*/ register m,totoal;28 for(n=y;n>=0;n--)/*从当前行往上看*/ (totoal=0; for(m=0;m

47、otoal++;/* 没占有方格+ 1*/ if(Table_board[n] [m]. var! =Table_board[n-1 ] [m]. var) /* 上行不等 于下行就把上行传给下行xor关系刃 ( Table_board[n] [m]. var=Table_board[n-1 ] [m] .var; Table_boardlnJ [mJ .color=Table_boardLn-1J LmJ .color; ) ) if(totoal==Horizontal_boxs)/* 发现上面有连续的空行提前结束*/ ( top=n; break; ) ) return(top);

48、/* 返回最高点*/ ) 游戏方块的显示和清除游戏方块的显示和清除是游戏中经常出现的操作。主要进行的过程如下: (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)

49、 int i,ii,ls_x=x; if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/box_numb=MAX_BOX/2; setfillstyle(SOLID_FILL,color);/•曲•曲4k f »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• »

50、T» ri»■[• f for(ii=0;ii<2;ii++) (int mask=128; for(i=0;i<8;i++)( if(i%4==0 && i!=0)/*表示转到方块的下一行了*/{ y+=BSIZE;x=ls_x; }if((shapes[box_numb].box[ii])&mask) bar(x,y,x+BSIZE,y+BSIZE);30 line(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);

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

关于我们      便捷服务       自信AI       AI导航        抽奖活动

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

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

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

关注我们 :微信公众号    抖音    微博    LOFTER 

客服