版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告题目:基于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}, //I {0x0660,0x0660,0x0660,0x0660,BLUE}, //口 {0x4460,0x02E0,0x0622,0x0740,CYAN}, //L蓝绿色 {0x2260,0x0E20,0x0644,0x0470,GREEN}, //反L {0x0C60,0x2640,0x0C60,0x2640,BROWN}, //Z {0x0360,0x4620,0x0360,0x4620,YELLOW}, //反Z {0x4E00,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>///////////////////////////////////////////////定义常量、枚举量、构造体、全局变量/////////////////////////////////////////////#define WIDTH 10 //游戏区宽度#define HEIGHT 22 //游戏区高度#define UNIT 20 //每个游戏区单位实际像素//定义操作类型enumCMD{ CMD_ROTATE, //方块旋转 CMD_LEFT,CMD_RIGHT,CMD_DOWN, //方块左、右、下移动 CMD_SINK, //方块沉底 CMD_QUIT //退出游戏};//定义绘制方块办法enumDRAW{ SHOW, //显示方块 CLEAR, //擦除方块 FIX //固定方块};//定义七种俄罗斯方块structBLOCK{ WORDdir[4]; //方块四个旋转状态 COLORREFcolor; //方块颜色} g_Blocks[7]={ {0x0F00,0x4444,0x0F00,0x4444,RED}, //I {0x0660,0x0660,0x0660,0x0660,BLUE}, //口 {0x4460,0x02E0,0x0622,0x0740,CYAN}, //L蓝绿色 {0x2260,0x0E20,0x0644,0x0470,GREEN}, //反L {0x0C60,0x2640,0x0C60,0x2640,BROWN}, //Z {0x0360,0x4620,0x0360,0x4620,YELLOW}, //反Z {0x4E00,0x4C40,0x0E40,0x4640,MAGENTA}}; //T品红//定义当前方块、下一种方块信息structBLOCKINFO{ byteid; //方块ID charx,y; //方块在游戏区中坐标 bytedir:2; //方向} g_CurBlock,g_NextBlock;//定义游戏区BYTEg_World[WIDTH][HEIGHT]={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(); else Quit();}//获取控制命令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_Blocks[g_CurBlock.id].dir[g_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(0x006060); roundrect(left+1,top+1,right-1,bottom-1,5,5); setlinecolor(0x003030); 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_World[x][y])) 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); } else OnSink(); //不可下移时,执行“沉底方块”操作}//沉底方块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_Blocks[g_CurBlock.id].dir[g_CurBlock.dir]; for(i=0;i<16;i++,b<<=1) if(b&0x8000) { if(g_CurBlock.y-i/4>=HEIGHT) { //如果方块固定位置超过高度,结束游戏 GameOver(); return; } else g_World[g_CurBlock.x+i%4][g_CurBlock.y-i/4]=1; } //检查与否需要消掉行,并标记 BYTEremove=0; //低4位用来标记方块涉及4行与否有消除行为 for(y=g_CurBlock.y;y>=max(g_CurBlock.y-3,0);y--) { i=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合同模板学校食堂承包经营合同范本
- Unit2 He's cool(说课稿)2023-2024学年外研版(三起)四年级下册
- 2025合同模板工程的变更范本
- 2025江苏:安全责任写进集体合同模板范本
- Unit1 School(说课稿)-2024-2025人教版(新起点)英语一年级上册
- 2023七年级语文上册 第四单元 综合性学习 少年正是读书时说课稿 新人教版
- Unit5 I'm cleaning my room(说课稿)-2023-2024学年人教精通版英语五年级下册001
- 2024年九年级语文下册 第二单元 第5课 孔乙己说课稿 新人教版
- 2024-2025学年高中化学下学期第20周 常见气体的制备说课稿
- Unit 1 people of achievement Reading for writing 说课稿-2024-2025学年高中英语人教版(2019)选择性必修第一册
- 英语经典口语1000句
- 进模模具设计
- 完整,沪教版小学四年级英语上册单词表
- 2021年高考化学真题和模拟题分类汇编专题20工业流程题含解析
- 2023年北京市高考作文评分标准及优秀、满分作文
- 2023年大唐尿素投标文件
- 《钢铁是怎样炼成的》名著阅读(精讲课件) 初中语文名著导读
- 缩窄性心包炎课件
- 《工程电磁场》配套教学课件
- 职位管理手册
- 东南大学 固体物理课件
评论
0/150
提交评论