欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    俄罗斯方块C课程设计报告(共14页).doc

    • 资源ID:14025291       资源大小:53KB        全文页数:14页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    俄罗斯方块C课程设计报告(共14页).doc

    精选优质文档-倾情为你奉上课程设计报告题目:基于C+俄罗斯方块学院:专业:学号:姓名:二一三年十二月经典小游戏设计-俄罗斯方块一、 需求分析。1.1、游戏需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,若在游戏中各形状填满了给定区域,为输者,弹出相应提示。1.2、游戏界面需求良好的用户界面,有关信息显示(如操作方法、等级等)。让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,本游戏的背景设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。而不同的方块用不同的着色表示,使游戏界面更加清晰、有条理。消层时采用一定的时间延迟,增加视觉消行的感官效果。1.3、游戏方块需求良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字型)以及另外本程序另外加入的点形方块,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。为体现游戏的趣味性和扩展性,本游戏象征性的增加了点形方块,其他更多形状的方块可用类似方法增加。1.4、游戏控制的需求游戏控分为多个方面,包括画面绘制,控制命令的获取,控制命令的分配、控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和消层以及计分等。对各个命令的合理处理和综合控制十分重要,一旦出错可能导致整个程序的崩溃,因此需要小心设计。二、 系统设计。2.1、程序流程图:2.2、游戏设计概述从整体上而言,在该游戏可设计一个方块类,其中包括对方块的信息描述(如:ID)、方块的操作(如:旋转、下沉)。再设计一个控制类,实现各种控制(如:获取控制信号,分发控制信号)。另定义一个游戏区类,用以处理游戏区绘制等内容。框图如下:方块类(GAME_BLOCK)游戏区类(Window)Private:BLOCKINFOg_CurBlock;(新方块)BLOCKINFOg_NextBlock;(下一方块)Private:无Public:VoidInitWindow()Public:GAME_BLOCK()GAME_BLOCK()voidNewBlock();/生成方块boolCheckBlock(BLOCKINFO_block);/检测方块能否放下voidDrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);voidOnRotate();/旋转方块voidOnLeft();/左移方块voidOnRight();/右移方块voidOnDown();/下移方块voidOnSink(CGAME&);/沉底方块BLOCKINFO&CurBlock();BLOCKINFO&NextBlock();游戏控制类(CGame)Private:VoidDispatchControl(CTRL);Public:voidInitGame();/初始化游戏VoidStart_Game();/开始游戏voidGame_Over();/游戏结束voidNewGame();/新游戏voidQuit_Game();/退出游戏CTRLGetControl(bool_onlyresettimer=false);/获取控制命令在主函数中(按照2.1中框图),先通过控制类初始化游戏,再通过随机时间函数获得一个随机数,该随机数确定一个方块,即用该随机数产生一个ID从而确定产生的为方块。然后从键盘取得各种操作信号,通过控类函数对操作信号进行分发、处理,进而控制方块的行为改变。与此同时,监控游戏区中已有方块的状态,一旦满足消行即进行消行控制,同时进行计分和等级划分,而如果游戏区已满则游戏结束,弹出提示。而对界面和方块的展现主要通过第三方软件EasyX实现,通过其画图位置的改变与时间的结合达到方块视觉移动的效果。2.3、定义方块的数据结构方块是本游戏的基本要素,对于方块的设计,本游戏用4*4的矩阵画出来,在相应的位置置为1和0以实现各种方块的形状,以“立L形”为例如下:0100010001100000而在程序设计中则赋予各种基本方块一个不同的十六进制ID即可表示该方块,如“立7形”其ID为0x4460,再与其其他变形组合和着色分配即可得到各种L形ID的集合0x4460,0x02E0,0x0622,0x0740,MAGENTA;其他各种方块类似设计。具体清单如下:0x0F00,0x4444,0x0F00,0x4444,RED,/I0x0660,0x0660,0x0660,0x0660,BLUE,/口0x4460,0x02E0,0x0622,0x0740,CYAN,/L蓝绿色0x2260,0x0E20,0x0644,0x0470,GREEN,/反L0x0C60,0x2640,0x0C60,0x2640,BROWN,/Z0x0360,0x4620,0x0360,0x4620,YELLOW,/反Z0x4E00,0x4C40,0x0E40,0x4640,MAGENTA;/T品红2.4、方块的变形方块要实现变形,其实就是通过EasyX画出不同的图形来实现的,当然乱画是不行的,而为了控制其变形的情况,必须设定相应的图形描述,本程序使用的是不同图形的不同ID码表示的方法来实在方块的描述的。能过键盘接收变形指令(即向上键),将所得信号传递给信号接收函数,再通过信号处理函数改变当前方块的ID值,最后根据新的ID值画出新的图形,此时即实在了方块的变形。2.5、定时处理机制为了提高游戏的易控性和自动性,定时机制是很有必要的。经过定时器的设置后,这里通过利用控制程序跳到定时器的时间的处理函数去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束,弹出相应对话框供用户选择是否继续重新开始。图3.2.2装载方块视图类通过不同十六进制ID来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而ID除了记录下坠物的类型外,还需记录其当前的变形状态。在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。三、关键代码描述。#include<easyx.h>#include<conio.h>#include<time.h>/定义常量、枚举量、结构体、全局变量/#defineWIDTH10/游戏区宽度#defineHEIGHT22/游戏区高度#defineUNIT20/每个游戏区单位的实际像素/定义操作类型enumCMDCMD_ROTATE,/方块旋转CMD_LEFT,CMD_RIGHT,CMD_DOWN,/方块左、右、下移动CMD_SINK,/方块沉底CMD_QUIT/退出游戏;/定义绘制方块的方法enumDRAWSHOW,/显示方块CLEAR,/擦除方块FIX/固定方块;/定义七种俄罗斯方块structBLOCKWORDdir4;/方块的四个旋转状态COLORREFcolor;/方块的颜色g_Blocks7=0x0F00,0x4444,0x0F00,0x4444,RED,/I0x0660,0x0660,0x0660,0x0660,BLUE,/口0x4460,0x02E0,0x0622,0x0740,CYAN,/L蓝绿色0x2260,0x0E20,0x0644,0x0470,GREEN,/反L0x0C60,0x2640,0x0C60,0x2640,BROWN,/Z0x0360,0x4620,0x0360,0x4620,YELLOW,/反Z0x4E00,0x4C40,0x0E40,0x4640,MAGENTA;/T品红/定义当前方块、下一个方块的信息structBLOCKINFObyteid;/方块IDcharx,y;/方块在游戏区中的坐标bytedir:2;/方向g_CurBlock,g_NextBlock;/定义游戏区BYTEg_WorldWIDTHHEIGHT=0;/函数声明/voidInit();/初始化游戏voidQuit();/退出游戏voidNewGame();/开始新游戏voidGameOver();/结束游戏CMDGetCmd();/获取控制命令voidDispatchCmd(CMD_cmd);/分发控制命令voidNewBlock();/生成新的方块boolCheckBlock(BLOCKINFO_block);/检测指定方块是否可以放下voidDrawUnit(intx,inty,COLORREFc,DRAW_draw);/画单元方块voidDrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);/画方块voidOnRotate();/旋转方块voidOnLeft();/左移方块voidOnRight();/右移方块voidOnDown();/下移方块voidOnSink();/沉底方块staticintscore=0;/函数定义/主函数voidmain()Init();CMDc;while(true)c=GetCmd();DispatchCmd(c);/按退出时,显示对话框咨询用户是否退出if(c=CMD_QUIT)HWNDwnd=GetHWnd();if(MessageBox(wnd,_T("您要退出游戏吗?"),_T("提醒"),MB_OKCANCEL|MB_ICONQUESTION)=IDOK)Quit();/初始化游戏voidInit()initgraph(640,480);srand(unsigned)time(NULL);setbkmode(TRANSPARENT);/设置图案填充的背景色为透明/显示操作说明settextstyle(14,0,_T("宋体");outtextxy(20,330,_T("操作说明:");outtextxy(20,350,_T("上:旋转");outtextxy(20,370,_T("下:下移");outtextxy(20,390,_T("左:左移");outtextxy(20,410,_T("右:右移");outtextxy(20,430,_T("空格:沉底");outtextxy(20,450,_T("ESC:退出");outtextxy(40,150,_T(score);/设置坐标原点setorigin(220,20);/绘制游戏区边界rectangle(-1,-1,WIDTH*UNIT,HEIGHT*UNIT);rectangle(WIDTH+1)*UNIT-1,-1,(WIDTH+5)*UNIT,4*UNIT);/开始新游戏NewGame();/退出游戏voidQuit()closegraph();exit(0);/开始新游戏voidNewGame()/清空游戏区setfillcolor(BLACK);solidrectangle(0,0,WIDTH*UNIT-1,HEIGHT*UNIT-1);ZeroMemory(g_World,WIDTH*HEIGHT);/生成下一个方块g_NextBlock.id=rand()%7;g_NextBlock.dir=rand()%4;g_NextBlock.x=WIDTH+1;g_NextBlock.y=HEIGHT-1;/获取新方块NewBlock();/结束游戏voidGameOver()HWNDwnd=GetHWnd();if(MessageBox(wnd,_T("游戏结束。n想重新来一局吗?"),_T("游戏结束"),MB_YESNO|MB_ICONQUESTION)=IDYES)NewGame();elseQuit();/获取控制命令DWORDm_oldtime;CMDGetCmd()/获取控制值while(true)/如果超时,自动下落一格DWORDnewtime=GetTickCount();if(newtime-m_oldtime>=500)m_oldtime=newtime;returnCMD_DOWN;/如果有按键,返回按键对应的功能if(kbhit()switch(getch()case'w':case'W':returnCMD_ROTATE;case'a':case'A':returnCMD_LEFT;case'd':case'D':returnCMD_RIGHT;case's':case'S':returnCMD_DOWN;case27:returnCMD_QUIT;case'':returnCMD_SINK;case0:case0xE0:switch(getch()case72:returnCMD_ROTATE;case75:returnCMD_LEFT;case77:returnCMD_RIGHT;case80:returnCMD_DOWN;/延时(降低CPU占用率)Sleep(20);/分发控制命令voidDispatchCmd(CMD_cmd)switch(_cmd)caseCMD_ROTATE:OnRotate();break;caseCMD_LEFT:OnLeft();break;caseCMD_RIGHT:OnRight();break;caseCMD_DOWN:OnDown();break;caseCMD_SINK:OnSink();break;caseCMD_QUIT:break;/生成新的方块voidNewBlock()g_CurBlock.id=g_NextBlock.id,g_NextBlock.id=rand()%7;g_CurBlock.dir=g_NextBlock.dir,g_NextBlock.dir=rand()%4;g_CurBlock.x=(WIDTH-4)/2;g_CurBlock.y=HEIGHT+2;/下移新方块直到有局部显示WORDc=g_Blocksg_CurBlock.id.dirg_CurBlock.dir;while(c&0xF)=0)g_CurBlock.y-;c>>=4;/绘制新方块DrawBlock(g_CurBlock);/绘制下一个方块setfillcolor(BLACK);solidrectangle(WIDTH+1)*UNIT,0,(WIDTH+5)*UNIT-1,4*UNIT-1);DrawBlock(g_NextBlock);/设置计时器,用于判断自动下落m_oldtime=GetTickCount();/画单元方块voidDrawUnit(intx,inty,COLORREFc,DRAW_draw)/计算单元方块对应的屏幕坐标intleft=x*UNIT;inttop=(HEIGHT-y-1)*UNIT;intright=(x+1)*UNIT-1;intbottom=(HEIGHT-y)*UNIT-1;/画单元方块switch(_draw)caseSHOW:/画普通方块setlinecolor(0x);roundrect(left+1,top+1,right-1,bottom-1,5,5);setlinecolor(0x);roundrect(left,top,right,bottom,8,8);setfillcolor(c);setlinecolor(LIGHTGRAY);fillrectangle(left+2,top+2,right-2,bottom-2);break;caseFIX:/画固定的方块setfillcolor(RGB(GetRValue(c)*2/3,GetGValue(c)*2/3,GetBValue(c)*2/3);setlinecolor(DARKGRAY);fillrectangle(left+1,top+1,right-1,bottom-1);break;caseCLEAR:/擦除方块setfillcolor(BLACK);solidrectangle(x*UNIT,(HEIGHT-y-1)*UNIT,(x+1)*UNIT-1,(HEIGHT-y)*UNIT-1);break;/画方块voidDrawBlock(BLOCKINFO_block,DRAW_draw)WORDb=g_Blocks_block.id.dir_block.dir;intx,y;for(inti=0;i<16;i+,b<<=1)if(b&0x8000)x=_block.x+i%4;y=_block.y-i/4;if(y<HEIGHT)DrawUnit(x,y,g_Blocks_block.id.color,_draw);/检测指定方块是否可以放下boolCheckBlock(BLOCKINFO_block)WORDb=g_Blocks_block.id.dir_block.dir;intx,y;for(inti=0;i<16;i+,b<<=1)if(b&0x8000)x=_block.x+i%4;y=_block.y-i/4;if(x<0)|(x>=WIDTH)|(y<0)returnfalse;if(y<HEIGHT)&&(g_Worldxy)returnfalse;returntrue;/旋转方块voidOnRotate()/获取可以旋转的x偏移量intdx;BLOCKINFOtmp=g_CurBlock;tmp.dir+;if(CheckBlock(tmp)dx=0;gotorotate;tmp.x=g_CurBlock.x-1;if(CheckBlock(tmp)dx=-1;gotorotate;tmp.x=g_CurBlock.x+1;if(CheckBlock(tmp)dx=1;gotorotate;tmp.x=g_CurBlock.x-2;if(CheckBlock(tmp)dx=-2;gotorotate;tmp.x=g_CurBlock.x+2;if(CheckBlock(tmp)dx=2;gotorotate;return;rotate:/旋转DrawBlock(g_CurBlock,CLEAR);g_CurBlock.dir+;g_CurBlock.x+=dx;DrawBlock(g_CurBlock);/左移方块voidOnLeft()BLOCKINFOtmp=g_CurBlock;tmp.x-;if(CheckBlock(tmp)DrawBlock(g_CurBlock,CLEAR);g_CurBlock.x-;DrawBlock(g_CurBlock);/右移方块voidOnRight()BLOCKINFOtmp=g_CurBlock;tmp.x+;if(CheckBlock(tmp)DrawBlock(g_CurBlock,CLEAR);g_CurBlock.x+;DrawBlock(g_CurBlock);/下移方块voidOnDown()BLOCKINFOtmp=g_CurBlock;tmp.y-;if(CheckBlock(tmp)DrawBlock(g_CurBlock,CLEAR);g_CurBlock.y-;DrawBlock(g_CurBlock);elseOnSink();/不可下移时,执行“沉底方块”操作/沉底方块voidOnSink()inti,x,y;/连续下移方块DrawBlock(g_CurBlock,CLEAR);BLOCKINFOtmp=g_CurBlock;tmp.y-;while(CheckBlock(tmp)g_CurBlock.y-;tmp.y-;DrawBlock(g_CurBlock,FIX);/固定方块在游戏区WORDb=g_Blocksg_CurBlock.id.dirg_CurBlock.dir;for(i=0;i<16;i+,b<<=1)if(b&0x8000)if(g_CurBlock.y-i/4>=HEIGHT)/如果方块的固定位置超出高度,结束游戏GameOver();return;elseg_Worldg_CurBlock.x+i%4g_CurBlock.y-i/4=1;/检查是否需要消掉行,并标记BYTEremove=0;/低4位用来标记方块涉及的4行是否有消除行为for(y=g_CurBlock.y;y>=max(g_CurBlock.y-3,0);y-)i=0;for(x=0;x<WIDTH;x+)if(g_Worldxy=1)i+;if(i=WIDTH)remove|=(1<<(g_CurBlock.y-y);setfillcolor(LIGHTGREEN);setlinecolor(LIGHTGREEN);setfillstyle(BS_HATCHED,HS_DIAGCROSS);fillrectangle(0,(HEIGHT-y-1)*UNIT+UNIT/2-5,WIDTH*UNIT-1,(HEIGHT-y-1)*UNIT+UNIT/2+5);setfillstyle(BS_SOLID);if(remove)/如果产生整行消除/延时300毫秒Sleep(300);/擦掉刚才标记的行IMAGEimg;for(i=0;i<4;i+,remove>>=1)if(remove&1)for(y=g_CurBlock.y-i+1;y<HEIGHT;y+)for(x=0;x<WIDTH;x+)g_Worldxy-1=g_Worldxy;g_Worldxy=0;getimage(&img,0,0,WIDTH*UNIT,(HEIGHT-(g_CurBlock.y-i+1)*UNIT);putimage(0,UNIT,&img);score+;outtextxy(50,150,_T(score);/产生新方块NewBlock();四、测试结果。程序完成后运行如下,达到预期结果,运行效果良好。成功地完成了方块的显示、旋转、消行功能,游戏可玩性强,且具有封装性、通用性、容错性。五、实验总结。本次C+课程设计前期准备阶段,设想一些构想和主要任务;后期则是具体功能的实现。这次设计中我遇到了不少困难,本来设想实现双人版对战,美化界面和增加背景音乐等功能,可是由于时间的短促,最终没能实现,心里不免有些遗憾,在实现类的封装和类的继承和多态性时,也遇到了不少问题,通过大家的一起探讨和分析,问题最终一个个迎刃而解,系统开发基本完毕。通过这次课程设计,使我懂得了不少东西。我们在日常的学习中应该注意对所学知识的实践运用,在学习时,应该深入的了解,体会知识,这对我们今后的学习和工作会有很大的帮助。通过此次的实践,我体会到学以致用的乐趣,收获了很多。专心-专注-专业

    注意事项

    本文(俄罗斯方块C课程设计报告(共14页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开