




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计报告 题目:基于C+我罗斯方块 学 院: 专 业: 学 号: 姓 名: 二O三 年十二月 经典小游戏设计-俄罗斯方块 一、需求分析。 1.1、游戏需求 随机给出不同的形状(长条形、 Z字形、反Z形、田字形、7字形、反7形、 T字型)下落填充给定的区域,若填满一条便消掉,若在游戏中各形状填满了给定 区域,为输者,弹出相应提示。 1.2、游戏界面需求 良好的用户界面,有关信息显示(如操作方法、等级等)。让方块在一定的区 域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,本游戏的背景 设为黑色。还需用另一种颜色把黑色围起来 ,宽度适中,要实现美感。而不同的方 块用不同的着色表示,使
2、游戏界面更加清晰、有条理。消层时采用一定的时间延 迟,增加视觉消行的感官效果。 1.3、游戏方块需求 良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、 田字形、L字形、反L形、T字型)以及另外本程序另外加入的点形方块,各个方 块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。为体现游戏 的趣味性和扩展性,本游戏象征性的增加了点形方块,其他更多形状的方块可用 类似方法增加。 1.4、游戏控制的需求 游戏控分为多个方面,包括画面绘制,控制命令的获取,控制命令的分配、 控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和消层以及 计分等。对各个命令的合理处理和
3、综合控制十分重要,一旦出错可能导致整个程 序的崩溃,因此需要小心设计。 二、系统设计。 2.1、程序流程图: 2.2、游戏设计概述 从整体上而言,在该游戏可设计一个方块类, 其中包括对方块的信息描述(如: ID)、方块的操作(如:旋转、下沉)。再设计一个控制类,实现各种控制(如: 获取控制信号,分发控制信号)。另定义一个游戏区类,用以处理游戏区绘制等内 容。框图如下: 方块类(GAME BLOCK 游戏区类(Window) BLOCKINFO g_CurBlock; Private: 无 Private: (新方块) Public: Void InitWin dow() BLOCKINFO g
4、_NextBlock; (下一方块) Public: GAME_BLOCK () 游戏控制类(CGam) GAME_BLOCK () Private Void void NewBlock();生成方块 : DispatchC on trol(CTRL); bool CheckBlock(BLOCKINFO Public: void Ini tGame();/初始化游 _block);检测方块能否放下 戏 void DrawBlock(BLOCKINFO Void Start_Game();开始游 _block,DRAW_draw=SHOW); 戏 void On Rotate。;/旋转方块 v
5、oid On Left();左移方块 void On Right();右移方块 void On Dow n();下移方块 void On Si nk(CGAME /沉 底方块 BLOCKINFO BLOCKINFO void Game_Over();游戏结 束 void NewGame(); 新游戏 void Quit_Game();退出游 戏 CTRL GetCo ntrol(bool _only resettimer= false);/ 获取控制命令 在主函数中(按照2.1中框图),先通过控制类初始化游戏,再通过随机时间 函数获得一个随机数,该随机数确定一个方块,即用该随机数产生一个ID从
6、而确 定产生的为方块。然后从键盘取得各种操作信号,通过控类函数对操作信号进行 分发、处理,进而控制方块的行为改变。与此同时,监控游戏区中已有方块的状 态,一旦满足消行即进行消行控制,同时进行计分和等级划分,而如果游戏区已 满则游戏结束,弹出提示。而对界面和方块的展现主要通过第三方软件EasyX实 现,通过其画图位置的改变与时间的结合达到方块视觉移动的效果。 2.3、定义方块的数据结构 方块是本游戏的基本要素,对于方块的设计,本游戏用4*4的矩阵画出来,在 相应的位置置为1和0以实现各种方块的形状,以“立L形”为例如下: 而在程序设计中则赋 六进制ID即可表示该方 0 x4460,再与其其他变
7、种L形ID的集合0 x4460, MAGENTA其他各种方块 0 x0F00, / I 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 予各种基本方块一个不同的十 块,如“立7形”其ID为 形组合和着色分配即可得到各 0 x02E0, 0 x0622, 0 x0740, 类似设计。具体清单如下: 0 x4444, 0 x0F00, 0 x4444, RED, 0 x0660, 0 x0660, 0 x0660, 0 x0660, BLUE,/ 口 0 x4460, 0 x02E0, 0 x0622, 0 x0740, CYAN, / L蓝绿色 0 x2260, 0 x0E20,
8、 0 x0644, 0 x0470, GREEN,反 L 0 x0C60, 0 x2640, 0 x0C60, 0 x2640, BROWN,/ Z 0 x0360, 0 x4620, 0 x0360, 0 x4620, YELLOW,反 Z 品红 0 x4E00, 0 x4C40, 0 x0E40, 0 x4640, MAGENTA; / T 2.4、方块的变形 方块要实现变形,其实就是通过EasyX画出不同的图形来实现的,当然乱画 是不行的,而为了控制其变形的情况,必须设定相应的图形描述,本程序使用的 是不同图形的不同ID码表示的方法来实在方块的描述的。能过键盘接收变形指令 (即向上键),
9、将所得信号传递给信号接收函数,再通过信号处理函数改变当前方 块的ID值,最后根据新的ID值画出新的图形,此时即实在了方块的变形。 2.5、定时处理机制 为了提高游戏的易控性和自动性,定时机制是很有必要的。经过定时器的设 置后,这里通过利用控制程序跳到定时器的时间的处理函数去实现,当固定时间 片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行下坠物向下 移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的, 将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用 后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底 部的同时到达游戏区
10、域的顶部,从而判定游戏是否因违规而结束,弹出相应对话 框供用户选择是否继续重新幵始。 图3.2.2装载方块 视图类通过不同十六进制ID来记录下坠物的类型,共有七种形状,并从7种 方块中随机抽取图形。而ID除了记录下坠物的类型外,还需记录其当前的变形状 态。 在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠 物保存下来,然后用随机函数Ran dom ()产生一个最大值不大于指定值的随机正整 数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。 三、关键代码描述。 #in elude #in elude #in elude / /定义常量、枚举量、结构体、全局变量 / #d
11、efine WIDTH10/ 游戏区宽度 #define HEIGHT 22/ 游戏区高度 #defi ne UNIT 20 II每个游戏区单位的实际像素 /定义操作类型 enum CMD CMD_ROTATE,II CMD_LEFT, CMD_RIGHT, CMD_DOWNI CMD_SINK,II CMD QUIT II 方块旋转 方块左、右、下移动 方块沉底 退出游戏 ; II 定义绘制方块的方法 enum DRAW SHOW, CLEAR, FIX II II II 显示方块 擦除方块 固定方块 ; II II WORD dir4; II 方块的四个旋转状态 COLORREF colo
12、r; II方块的颜色 g_Blocks7 = OxOFOO, 0 x4444, OxOFOO, 0 x4444, RED, 0 x0660, OxO66O, OxO66O, OxO66O, BLUE, Ox446O, OxO2EO, OxO622, OxO74O, CYAN, Ox226O, OxOE2O, OxO644, OxO47O, GREEN, OxOC6O, Ox264O, OxOC6O, Ox264O, BROWN, OxO36O, Ox462O, OxO36O, Ox462O, YELLOW, Ox4EOO, Ox4C4O, OxOE4O, Ox464O, MAGENTA; II
13、 T 定义当前方块、下一个方块的信息 II L II I II II 口 蓝绿色 反L II Z 反Z 品红 定义七种俄罗斯方块 struct BLOCK struct BLOCKINFO byte id; char x, y; byte dir:2; II II II 方块ID 方块在游戏区中的坐标 方向 II II初始化游戏 II退出游戏 II开始新游戏 II结束游戏 II获取控制命令 g_CurBlock, g_NextBlock; 定义游戏区 BYTE g_WorldWIDTHHEIGHT = O; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
14、II II函数声明 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII void In it(); void Quit(); void NewGame(); void GameOver(); CMD GetCmd(); void DispatchCmd(CMD _cmd); void NewBlock(); bool CheckBlock(BLOCKINFO _block); void Draw Un it(i nt x, i nt y, COLORREF c, DRAW _draw); void DrawBlock(BLOCKINFO _block,
15、DRAW _draw = SHOW);/ void On Rotate(); void On Left(); void On Right(); void On Dow n(); void On Si nk(); static int score=0; / / / / / / / / / 分发控制命令 生成新的方块 检测指定方块是否可以放下 画单元方块 画方块 旋转方块 左移方块 右移方块 下移方块 沉底方块 /函数定义 / /主函数 void mai n() In it(); CMD c; while(true) c = GetCmd(); DispatchCmd(c); /按退出时,显示对话
16、框咨询用户是否退出 if (c = CMD_QUIT) HWND wnd = GetHWnd(); if (MessageBox(wnd, _T(”您要退出游戏吗? ), _T( 提醒),MB_OKCANCEL | MB_ICONQUESTION) = IDOK) Quit(); /初始化游戏 void Init() initgraph(640, 480); /设置图案填充的背景色为透明 sran d( un sig ned)time(NULL); setbkmode(TRANSPARENT); 宋体); 操作说明:); 上:旋转); 下:下移); 左:左移); /显示操作说明 settext
17、style(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); /设置坐标原点 setorigi n(220, 20); /绘制游戏区边界 recta ngle(-1, -1, WIDTH * UNIT,
18、 HEIGHT * UNIT); recta ngle(WIDTH + 1) * UNIT -1,-1, (WIDTH + 5) * UNIT, 4 * UNIT); /开始新游戏 NewGame(); /退出游戏 void Quit() closegraph(); exit(0); /开始新游戏 void NewGame() /清空游戏区 setfillcolor(BLACK); solidrectangle(0, 0, WIDTH * UNIT - 1, HEIGHT * UNIT - 1); ZeroMemory(g_World, WIDTH * HEIGHT); /生成下一个方块 g_
19、NextBlock.id = ran d() % 7; g_NextBlock.dir = ran d() % 4; g_NextBlock.x = WIDTH + 1; g_NextBlock.y = HEIGHT - 1; /获取新方块 NewBlock(); /结束游戏 void GameOver() HWND wnd = GetHWnd(); if (MessageBox(wnd, _T(游戏结束。n 想重新来一局吗? ”),_T(游戏结束),MB_YESNO | MB_ICONQUESTION) = IDYES) NewGame(); else Quit(); /获取控制命令 DWO
20、RD m_oldtime; CMD GetCmd() /获取控制值 while(true) /如果超时,自动下落一格 DWORD n ewtime = GetTickCou nt(); if (n ewtime - m_oldtime = 500) m_oldtime = n ewtime; return CMD_DOWN; 如果有按键,返回按键对应的功能 / if (kbhit() switch(getch() case w: case W: case a: return CMD_ROTATE; case A: case d: return CMD_LEFT; case D: case s:
21、 return CMD_RIGHT; case S: return CMD_DOWN; case 27: return CMD_QUIT; case : case 0: case 0 xE0: return CMD_SINK; switch(getch() case 72: case 75: case 77: case 80: return CMD_ROTATE; return CMD_LEFT; return CMD_RIGHT; return CMD_DOWN; / 延时 Sleep(20); (降低CPU占用率) / 分发控制命令 void DispatchCmd(CMD _cmd) s
22、witch(_cmd) case CMD_ROTATE: On Rotate(); break; case CMD_LEFT: On Left(); break; case CMD_RIGHT: On Right(); break; case CMD_DOWN: On Dow n(); break; case CMD_SINK: On Si nk(); break; case CMD_QUIT: break; /生成新的方块 void NewBlock() g_NextBlock.id = ran d() % 7; g_NextBlock.dir = ran d() % 4; g_CurBlo
23、ck.id = g_NextBlock.id, g_CurBlock.dir = g_NextBlock.dir, g_CurBlock.x = (WIDTH - 4) / 2; g_CurBlock.y = HEIGHT + 2; /下移新方块直到有局部显示 WORD c = g_Blocksg_CurBlock.id.dirg_CurBlock.dir; while(c c = 4; /绘制新方块 DrawBlock(g_CurBlock); /绘制下一个方块 setfillcolor(BLACK); solidrecta ngle(WIDTH + 1) * UNIT, 0, (WIDTH
24、 + 5) * UNIT - 1,4 * UNIT - 1); DrawBlock(g_NextBlock); /设置计时器,用于判断自动下落 m_oldtime = GetTickCou nt(); /画单元方块 void Draw Un it(i nt x, i nt y, COLORREF c, DRAW _draw) /计算单元方块对应的屏幕坐标 int left = x * UNIT; int top = (HEIGHT - y - 1) * UNIT; int right = (x + 1) * UNIT - 1; int bottom = (HEIGHT - y) * UNIT
25、- 1; / 画单元方块 switch(_draw) case SHOW: /画普通方块 setl in ecolor(0 x006060); roun drect(left + 1, top + 1, right - 1, bottom - 1,5, 5); setl in ecolor(0 x003030); roundrect(left, top, right, bottom, 8, 8); setfillcolor(c); setli necolor(LIGHTGRAY); fillrecta ngle(left + 2, top + 2, right - 2, bottom - 2)
26、; break; case FIX: / 画固定的方块 setfillcolor(RGB(GetRValue(c) * 2 / 3, GetGValue(c) * 2 / 3, GetBValue(c) * 2 / 3); setli necolor(DARKGRAY); fillrecta ngle(left + 1, top + 1, right - 1, bottom - 1); break; case CLEAR: /擦除方块 setfillcolor(BLACK); solidrectangle(x* UNIT, (HEIGHT - y - 1) * UNIT, (x + 1) *
27、UNIT - 1, (HEIGHT -y) * UNIT - 1); break; /画方块 void DrawBlock(BLOCKINFO _block, DRAW _draw) WORD b = g_Blocks_block.id.dir|_block.dir; int x, y; for(i nt i = 0; i 16; i+, b = 1) if (b y = _block.y - i / 4; if (y HEIGHT) Draw Un it(x, y, g_Blocks_block.id.color, _draw); /检测指定方块是否可以放下 bool CheckBlock(
28、BLOCKINFO _block) WORD b = g_Blocks_block.id.dir_block.dir; int x, y; for(i nt i = 0; i 16; i+, b = 1) if (b y = _block.y - i / 4; if (x = WIDTH) | (y 0) return false; if (y HEIGHT) return true; /旋转方块 void On Rotate。 /获取可以旋转的x偏移量 int dx; BLOCKINFO tmp = g_CurBlock; dx = =0; goto rotate; dx = =-1;got
29、o rotate; dx = =1; goto rotate; dx = =-2;goto rotate; dx = =2; goto rotate; tmp.dir+;if (CheckBlock(tmp) tmp.x = g_CurBlock.x - 1;if (CheckBlock(tmp) tmp.x = g_CurBlock.x + 1;if (CheckBlock(tmp) tmp.x = g_CurBlock.x - 2;if (CheckBlock(tmp) tmp.x = g_CurBlock.x + 2;if (CheckBlock(tmp) return; rotate:
30、 /旋转 DrawBlock(g_CurBlock, CLEAR); g_CurBlock.dir+; g_CurBlock.x += dx; DrawBlock(g_CurBlock); /左移方块 void On Left() BLOCKINFO tmp = g_CurBlock; tmp.x-; if (CheckBlock(tmp) DrawBlock(g_CurBlock, CLEAR); g_CurBlock.x-; DrawBlock(g_CurBlock); /右移方块 void On Right() BLOCKINFO tmp = g_CurBlock;tmp.x+; if
31、(CheckBlock(tmp) DrawBlock(g_CurBlock, CLEAR); g_CurBlock.x+; DrawBlock(g_CurBlock); /下移方块 void On Down() BLOCKINFO tmp = g_CurBlock; tmp.y-; if (CheckBlock(tmp) DrawBlock(g_CurBlock, CLEAR); g_CurBlock.y-; DrawBlock(g_CurBlock); else / OnSin k();/不可下移时,执行“沉底方块”操作 沉底方块 void On Si nk() int i, x, y; /
32、连续下移方块 DrawBlock(g_CurBlock, CLEAR); BLOCKINFO tmp = g_CurBlock; tmp.y-; while (CheckBlock(tmp) g_CurBlock.y-; tmp.y_; DrawBlock(g_CurBlock, FIX); /固定方块在游戏区 WORD b = g_Blocksg_CurBlock.id.dirg_CurBlock.dir; for(i = 0; i 16; i+, b = HEIGHT) /如果方块的固定位置超出高度,结束游戏 GameOver(); return; else g_Worldg_CurBlock.x + i % 4g_CurBlock.y - i / 4 = 1; /检查
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电热电容器企业数字化转型与智慧升级战略研究报告
- 耐磨铸件企业县域市场拓展与下沉战略研究报告
- 压电晶体生产设备企业ESG实践与创新战略研究报告
- 晶闸管模块和组件企业县域市场拓展与下沉战略研究报告
- 新能源汽车整车试验台企业ESG实践与创新战略研究报告
- 电工钢板带(外购再加工)企业数字化转型与智慧升级战略研究报告
- 采矿企业废水监测服务企业ESG实践与创新战略研究报告
- 组装钟表机心企业数字化转型与智慧升级战略研究报告
- 不锈钢壶企业县域市场拓展与下沉战略研究报告
- 硬币企业ESG实践与创新战略研究报告
- 面试真题华中科技
- 自身免疫性脑炎
- 医院质控科工作质量考核指标
- CRPS电源设计向导 CRPS Design Guide r-2017
- GB/T 9345.1-2008塑料灰分的测定第1部分:通用方法
- GB/T 4937.22-2018半导体器件机械和气候试验方法第22部分:键合强度
- GB/T 3452.2-2007液压气动用O形橡胶密封圈第2部分:外观质量检验规范
- 煤矿从业人员安全培训考试题库(附答案)
- 第十章-国际政治与世界格局-(《政治学概论》课件)
- 2023年法律职业资格考试历年真题精选合集
- 滤毒罐使用说明书
评论
0/150
提交评论