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

加入VIP,免费下载
 

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

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(俄罗斯方块C课程设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

俄罗斯方块C课程设计报告.docx

1、俄罗斯方块C课程设计报告 课程设计报告题 目 :基于C+俄罗斯方块 学 院: 专 业: 学 号: 姓 名: 二一三 年 十二 月经典小游戏设计-俄罗斯方块 一、 需求分析。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) Private:BLOCKINFO g_CurBlock;(新方块)BLOCKINFO g_NextBlock;(下一方块)Private:无Public:Void InitWindow()Publ

4、ic:GAME_BLOCK ()GAME_BLOCK ()void NewBlock();/生成方块bool CheckBlock(BLOCKINFO _block);/检测方块能否放下void DrawBlock(BLOCKINFO _block,DRAW_draw=SHOW);void OnRotate();/旋转方块void OnLeft();/ 左移方块void OnRight();/ 右移方块void OnDown();/ 下移方块void OnSink(CGAME &);/ 沉底方块BLOCKINFO &CurBlock();BLOCKINFO &NextBlock();游戏控制类

5、(CGame)Private:Void DispatchControl(CTRL);Public:void InitGame();/初始化游戏Void Start_Game();/开始游戏void Game_Over();/游戏结束void NewGame();/新游戏void Quit_Game();/退出游戏CTRL GetControl(bool _onlyresettimer = false);/获取控制命令在主函数中(按照2.1中框图),先通过控制类初始化游戏,再通过随机时间函数获得一个随机数,该随机数确定一个方块,即用该随机数产生一个ID从而确定产生的为方块。然后从键盘取得各种操作

6、信号,通过控类函数对操作信号进行分发、处理,进而控制方块的行为改变。与此同时,监控游戏区中已有方块的状态,一旦满足消行即进行消行控制,同时进行计分和等级划分,而如果游戏区已满则游戏结束,弹出提示。而对界面和方块的展现主要通过第三方软件EasyX实现,通过其画图位置的改变与时间的结合达到方块视觉移动的效果。2.3、定义方块的数据结构方块是本游戏的基本要素,对于方块的设计,本游戏用4*4的矩阵画出来,在相应的位置置为1和0以实现各种方块的形状,以“立L形”为例如下:0100010001100000 而在程序设计中则赋予各种基本方块一个不同的十六进制ID即可表示该方块,如“立7形”其ID为0x446

7、0,再与其其他变形组合和着色分配即可得到各种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, /

8、 Z 0x0360, 0x4620, 0x0360, 0x4620, YELLOW, / 反Z 0x4E00, 0x4C40, 0x0E40, 0x4640, MAGENTA; / T 品红2.4、方块的变形方块要实现变形,其实就是通过EasyX画出不同的图形来实现的,当然乱画是不行的,而为了控制其变形的情况,必须设定相应的图形描述,本程序使用的是不同图形的不同ID码表示的方法来实在方块的描述的。能过键盘接收变形指令(即向上键),将所得信号传递给信号接收函数,再通过信号处理函数改变当前方块的ID值,最后根据新的ID值画出新的图形,此时即实在了方块的变形。2.5、定时处理机制为了提高游戏的易控性

9、和自动性,定时机制是很有必要的。经过定时器的设置后,这里通过利用控制程序跳到定时器的时间的处理函数去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束,弹出相应对话框供用户选择是否继续重新开始。图 3.2.2装载方块 视图类通过不同十六进制ID来记录下坠物的类型,共有七种形状,并从7种方块中随机

10、抽取图形。而ID除了记录下坠物的类型外,还需记录其当前的变形状态。在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。三、关键代码描述。#include #include #include / 定义常量、枚举量、结构体、全局变量/#define WIDTH 10 / 游戏区宽度#define HEIGHT 22 / 游戏区高度#define UNIT 20 / 每个游戏区单位的实际像素/ 定义操作类型enum CMD CMD_ROTATE, /

11、方块旋转 CMD_LEFT, CMD_RIGHT, CMD_DOWN, / 方块左、右、下移动 CMD_SINK, / 方块沉底 CMD_QUIT / 退出游戏;/ 定义绘制方块的方法enum DRAW SHOW, / 显示方块 CLEAR, / 擦除方块 FIX / 固定方块;/ 定义七种俄罗斯方块struct BLOCK WORD dir4; / 方块的四个旋转状态 COLORREF color; / 方块的颜色 g_Blocks7 = 0x0F00, 0x4444, 0x0F00, 0x4444, RED, / I 0x0660, 0x0660, 0x0660, 0x0660, BLUE

12、, / 口 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 品红/ 定义当前方块、下一个方块的信息struct BLOCKINFO byte id; / 方块 ID char x, y; / 方块在游戏

13、区中的坐标 byte dir:2; / 方向 g_CurBlock, g_NextBlock;/ 定义游戏区BYTE g_WorldWIDTHHEIGHT = 0;/ 函数声明/void Init(); / 初始化游戏void Quit(); / 退出游戏void NewGame(); / 开始新游戏void GameOver(); / 结束游戏CMD GetCmd(); / 获取控制命令void DispatchCmd(CMD _cmd); / 分发控制命令void NewBlock(); / 生成新的方块bool CheckBlock(BLOCKINFO _block); / 检测指定方块

14、是否可以放下void DrawUnit(int x, int y, COLORREF c, DRAW _draw);/ 画单元方块void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW);/ 画方块void OnRotate(); / 旋转方块void OnLeft(); / 左移方块void OnRight(); / 右移方块void OnDown(); / 下移方块void OnSink(); / 沉底方块static int score=0;/ 函数定义/ 主函数void main() Init(); CMD c; while(true) c

15、 = GetCmd(); DispatchCmd(c); / 按退出时,显示对话框咨询用户是否退出 if (c = CMD_QUIT) HWND wnd = GetHWnd(); if (MessageBox(wnd, _T(您要退出游戏吗?), _T(提醒), MB_OKCANCEL | MB_ICONQUESTION) = IDOK) Quit(); / 初始化游戏void Init() initgraph(640, 480); srand(unsigned)time(NULL); setbkmode(TRANSPARENT); / 设置图案填充的背景色为透明 / 显示操作说明 sette

16、xtstyle(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); / 绘制游戏区边界 re

17、ctangle(-1, -1, WIDTH * UNIT, HEIGHT * UNIT); rectangle(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

18、, WIDTH * HEIGHT); / 生成下一个方块 g_NextBlock.id = rand() % 7; g_NextBlock.dir = rand() % 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

19、(); else Quit();/ 获取控制命令DWORD m_oldtime;CMD GetCmd() / 获取控制值 while(true) / 如果超时,自动下落一格 DWORD newtime = GetTickCount(); if (newtime - m_oldtime = 500) m_oldtime = newtime; return CMD_DOWN; / 如果有按键,返回按键对应的功能 if (kbhit() switch(getch() case w: case W: return CMD_ROTATE; case a: case A: return CMD_LEFT;

20、 case d: case D: return CMD_RIGHT; case s: case S: return CMD_DOWN; case 27: return CMD_QUIT; case : return CMD_SINK; case 0: case 0xE0: switch(getch() case 72: return CMD_ROTATE; case 75: return CMD_LEFT; case 77: return CMD_RIGHT; case 80: return CMD_DOWN; / 延时 (降低 CPU 占用率) Sleep(20); / 分发控制命令void

21、 DispatchCmd(CMD _cmd) switch(_cmd) case CMD_ROTATE: OnRotate(); break; case CMD_LEFT: OnLeft(); break; case CMD_RIGHT: OnRight(); break; case CMD_DOWN: OnDown(); break; case CMD_SINK: OnSink(); break; case CMD_QUIT: break; / 生成新的方块void NewBlock() g_CurBlock.id = g_NextBlock.id, g_NextBlock.id = ran

22、d() % 7; g_CurBlock.dir = g_NextBlock.dir, g_NextBlock.dir = rand() % 4; g_CurBlock.x = (WIDTH - 4) / 2; g_CurBlock.y = HEIGHT + 2; / 下移新方块直到有局部显示 WORD c = g_Blocksg_CurBlock.id.dirg_CurBlock.dir; while(c & 0xF) = 0) g_CurBlock.y-; c = 4; / 绘制新方块 DrawBlock(g_CurBlock); / 绘制下一个方块 setfillcolor(BLACK);

23、 solidrectangle(WIDTH + 1) * UNIT, 0, (WIDTH + 5) * UNIT - 1, 4 * UNIT - 1); DrawBlock(g_NextBlock); / 设置计时器,用于判断自动下落 m_oldtime = GetTickCount();/ 画单元方块void DrawUnit(int x, int y, COLORREF c, DRAW _draw) / 计算单元方块对应的屏幕坐标 int left = x * UNIT; int top = (HEIGHT - y - 1) * UNIT; int right = (x + 1) * UN

24、IT - 1; int bottom = (HEIGHT - y) * UNIT - 1; / 画单元方块 switch(_draw) case SHOW: / 画普通方块 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 +

25、2, top + 2, right - 2, bottom - 2); break; case FIX: / 画固定的方块 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; case CLEAR: / 擦除方块 setfillcolor(BLACK); solidrectangle(x * UNIT, (

26、HEIGHT - y - 1) * UNIT, (x + 1) * 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(int i = 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,

27、g_Blocks_block.id.color, _draw); / 检测指定方块是否可以放下bool CheckBlock(BLOCKINFO _block) WORD b = g_Blocks_block.id.dir_block.dir; int x, y; for(int i = 0; i 16; i+, b = 1) if (b & 0x8000) x = _block.x + i % 4; y = _block.y - i / 4; if (x = WIDTH) | (y 0) return false; if (y HEIGHT) & (g_Worldxy) return false; return true;/ 旋转方块void OnRotate() / 获取可以旋转的 x 偏移量 int dx; BLO

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1