C课程设计_俄罗斯方块游戏1_第1页
C课程设计_俄罗斯方块游戏1_第2页
C课程设计_俄罗斯方块游戏1_第3页
C课程设计_俄罗斯方块游戏1_第4页
C课程设计_俄罗斯方块游戏1_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告课程名称:面向对象程序设计C+设计题目: 俄罗斯方块游戏专 业:计算机科学与技术姓 名:学 号:指导教师:2015年12 月25日目录一、需求分析 31.1 系统概述 31.2 游戏特色 31.3 功能需求 3二、总体设计 42.1 系统模块 42.2 系统业务处理流程 5三、详细设计 53.1 砖块预显示 53.2 分数统计 63.3 砖块移动和游戏暂停的实现 73.4 播放背景音乐 83.5 游戏设置与帮助 83.6 背景位图的插入 93.7 砖块三维化 93.8 俄罗斯方块双人版的实现 10四、测试与结果 114.1 整个游戏运行界面图 114.2 游戏设置与帮助页面图 11

2、五、总结 12一、需求分析1.1 系统概述俄罗斯方块玩家通过键盘控制方块的形状样式和速度,组成相连的 1 行 或 1 行以上方块会自动消除 ,方块消除到一定数量后会得到一定的分数, 玩家可 以升级,从而难度加大,也就是速度加快,玩家还可以通过消除一组方块,使得 到的分数翻倍等到更多的分数, 造成更强的分数效果。 游戏中玩家可以和其他玩 家 1V1 对战。1.2 游戏特色俄罗斯方块是基于 pc 休闲平台上的单机对战休闲游戏,这就要求游戏 本身不能过于庞大复杂, 需要考虑到单机对战的灵活性和多变性。 在游戏中通过 对方块速度的变, 能够使玩家不仅仅通过自己消除方块来获胜, 还可以等到更多 的分数,

3、因此获得胜利。 俄罗斯方块游戏在传统的俄罗斯方块当中加入了新 鲜的游戏元素, 例如可爱的方块的颜色, 绚目的消除方块特效显示, 在游戏本身 的简单耐玩的基础上, 大大丰富了游戏的观赏性和趣味性, 令玩家有了完全的游 戏体验,充分享受游戏带来的乐趣。1.3 功能需求(1) 实现双人俄罗斯方块(2) 隐藏菜单栏、工具栏、状态栏(3) 实现难度可以选择(4) 实现下一个砖块预测功能(5) 实现总分统计功能,和每步消除所得分数显示(6) 实现下、左、右、旋转、暂停功能(7) 实现背景音乐播放功能(8) 添加游戏帮助菜单(9) 实现砖块三维化(10) 实现双缓冲避免屏幕闪烁(11) 设置窗口大小,禁用最

4、大化按钮,禁止鼠标拖动改变窗口大小二、总体设计2.1系统模块图2-12.2系统业务处理流程随1机牛一曲啊专 块类型和狀态块类型与状态 随叶I :凯个码 览类變和状爲设锐砖块棘赳J卜落否戟输出固/宦块/置顶砖块将時诀眾挟贝遴牆时数纽诀/|:拦N置顶砖块祥时川数据乂图2-2三、详细设计3.1砖块预显示砖块预显示的原理就是在第一次生成砖块的时候,一次生成 2个砖块。然后 将第2个砖块预显示,第1个砖块掉下来。接着将预显示的砖块掉下来,新随机 生成的砖块预显示。这样的话,我们用 flagl标记是不是第一次产生砖块厂倾显示砖块生成部分代码: if (1 =bTypel - (rand() % NUM_B

5、RICK_TYPES) + l;/rand()%7:随机产生數字& iOrientl (unsigned int) (rand() % 4);/随机状态左七 flagl = 0ibrickType - bTypel/rand()K7:趣机卢生0-6ffi動宇*InitOrientation = iOrientl;/ 随机状态FFif (9 “ flael)/2bTypel - (rand() % HLh_BRICK_TYPE5) + l;/rand(: seKo 1 our(un$igned char)bTypel);,设贵砖块两色 activeBr让kYlTpuUtTupliOLiEntl,

6、 binJidth 2);畫顶 bi nYl - eet I mage (output Ina百亡丫1); /将固定块拷贝到制寸数组 activeBrickVl*&perator(outputIfrageYl);将冈 I左生的加入.3.2分数统计这里实现了,显示每次消除所得的分数和游戏总共所得的分数。由于,我们 有一个返回消除了多少行的函数 removeFullLines(),所以我们将这个返回值乘 以积分规则里面的值,就实现了显示每次消除所得的分数。 然后游戏总分就是累 加每次得到的分数值。因为砖块最多就是消除4行,所以这里用个switch()语句来实现。m_num是一个成员变量,保存的就是

7、 removeFullLi nes()的返回值。分數统计部分代码:switchrr_nurr2)case 0:m_num2 = m_nun2*0; nun)Lines2 += m_nuin2;Jbreak;case 1:m_num2 = m_numi*5Q; n uniLines 2 += m_num2;break;.省略打3case 4:m_num2 = m_num2*1000; numinesi += m_num2;Jbreak;default: break;3.3砖块移动和游戏暂停的实现这里原本是需要响应键盘按下事件的,所以需要添加 WM_KEYDOW息响应然后将函数传进来的nChar,

8、也就是你按的键盘值,和你游戏中设定的移动按键 比较。从而执行相应的操作。同时这里也要熟悉一下虚拟按键码。但是由于我们添加了位图按钮,导致键盘按键事件响应不了,我们这里就重 载了 PreTranslateMessage函数,在这个函数里面拦截按键消息,从而响应。 一键下落:这里用了一个循环,直到下落到砖块与边界或者其他砖块产生冲突 才停止下落。 空格暂停:暂停的原理就是关闭定时器,KillTimer(l);/关闭定时器 空格继续:SetTimer(O,difficulty,NULL);继续恢复原来的下落速度具体代码如下:BOOL CTetris View: : PreTrans latere a

9、 sagepf-sg)if (pPsg-Te5sage EyDCi.N)/, iif (VK_ESCAPE =pMs*wParam)/ESCjEii PostQuitMessage (0 ;if (VK_SPACE = p5E-wPara(n & n_Stop 1) KillTiiner(l);/ 闭定时器KillTiner(2);/ 闭定时器 m_Stop 工 0;else if(n_Stop - 0)SetTimertlifficultyNULL;/续SetTimer (2, difficulty? HULL); 绻续 m_Stop = 1;return 匚Vieu : : PreT an

10、slate- essagei pK,sg);3.4播放背景音乐添加头文件:#inelude /播放音乐。然后在工程-设置 -链接- 对象/库模块里面添加winmm.lib然后就将已经准备好的.wav格式的音乐引入VC中。这里可以自己先去下载.mp3格式的音乐,然后用格式工厂转换一下格式,我就是这么干的。心耳体爵战昔乐和关闭音乐的代颐下:PlaySDund( (LPCT5TRIQH_WAVE1 AfInstanceHandl ( SND_RE SOURCE | ENQ_ASWC) ; j 逵加在 71 财壬我里面PlaySounfKNULL, NULLSND.FILEHAME);音乐3.5游戏设

11、置与帮助这里就是调用了一个对话框,用来做一些解释说明。实现步骤: 插入一个对话框 给对话框关联一个类 在需要弹出对话框的函数里面定义一个对话框的对象,然后DoModal().弹出 模态对话框。静态文本超链接颜色和鼠标样式:由于静态文本是不能响应鼠标点击事件的,所以我们要现将静态文本的 ID 改掉口: IDC STATIC Bl然后在样式中将通知勾选上。这样就可以响应鼠标点/ TWOf Add your spscislizei cadThere BHct/or cell the class击事件了。Gmt ,应二寸J;接着就是要实现鼠标移动到超链接上面显示一个手的形状, 这里我们需要载 入一个手

12、型的光标。本来是载入这个:IDC_HAND就可以了,但是当我载入它的 时候,编译,提示TDC_HAN未定义。查了一下原来是版本的问题,不支持手型 的。后来谷歌上找到了一个可以载入手型的方法:m_hCursor = :LoadCursor(NULL, MAKEINTRESOURCE(32649);if (pHi f - .x Mct.l静 upV 4 Ftrt-riftit u p*f3- mcttap *t pftfi-pr- rFi 11 Rett (rect广u百hBxIcg广ourid); 将拒形区域用位图填充3.7砖块三维化这里用到函数Draw3dRect()实现砖块三维化,其中需要3

13、个参数参数:1.矩形区域; 参数2: RGB() 参数3: RGB():void Draw3dRect(LPCRECr IpRectfCOLORREF clrTopLe-FttCOLORREF clrBottonlUEht);其中后面两个参数,由下面这两个函数返回。具体代码如下:COLORREF 匚TetrisView:6etLightColor(COLORREF m_crBody) BYTE r = GetRValue(ir_crBody);BYTE g = GetGValue(m_crBody);BYTE b = QetBValue(m_crBody);r -: r + COLOR_CHA

14、GE25S?255: r+CDLOR_CHANGE;g = g + COLOR_CHANGE255?255:g4-COLOR_CHANGE;b - b + COLOR_CHANGE255?255:b+COLOR_CHAMGE; return RGB(r,g?b);COLORREF CTetrisView:GetDerkColor(COLORREF T_trBod0BYTE r 二 GetRVelue(fn_crBody);BYTE g = GetGValue(m_crBody);BY f t b = GetBValu(m_crBody);r = r -匚OLOR_CHANGE0?0:r-COL

15、OR.CHAHGE;g - E -匚OLOR_CHANGE0?9:g-COLOR_CHANCE;b = b - COLOR_CHANGE0:b-COLOR_CHANGE; return RGB(rjgb)J3.8俄罗斯方块双人版的实现其实实现双人版的很简单,就是将FillRect()填充区域右移一定距离就实现了双人版的。当然,是在你将第二个游戏的代码也编写好的前提下,不然只是把左边玩家的界面再显示一次,那没得意思。同理,预显示也就是这么实现的,就 是调整了一下砖块显示的位置。/ M 坪航家上辅戏面橫显示的牝码=for (i i height;卄行的画薛境for (j &i j *n5iM+S5

16、j (i+i)*n$lw+TO)j打综制面扳/SlLplayerif (B != ImsEOij)pK- FillRect(rclj iCBrush(0rickColarirageli j ),;打画临时直块(运纳中)pDC- Drnn3-dRect(rtFillftect(rc2J SCBnishf BriekColor 11 j j )/画临旳鹫块(运动申)pK Drawl dRect (rc2p6Bt LightCnl nr(Br icKCQlar image2GetDarkCDlor (Br LcfcCalor( image2 i) j四、测试与结果4.1整个游戏运行界面图其中Next

17、是预显示,Point是每次固定块后所得的分数,X0用于播放/暂停 背景音乐,a,b,c用于选择游戏难度。START点击开始游戏。下面还有个总分统 计栏。图4-14.2游戏设置与帮助页面图Qs口 -START图4-2五、总结这次编写双人版俄罗斯方块,主要参照了 VC+实验指导书,界面主要就是插 入了一个位图背景,图是从4399上面截图下来的,然后ps成自己需要的大小并 转化成.bmp格式。插入后,再就是在适当的地方显示砖块和分数统计,这样一 个界面就做好了。界面上的按钮,我是用位图按钮CBitmapButton实现的,这里 有个小插曲,就是4张图片的大小问题,我本来的意思是想让鼠标点击的时候就 显示一张小一点的图片,从而达到按钮的效果,所以我就做了 4张大小不同的位 图,导致了后来的白边的产生。另外,由于添加了位图按钮导致了按键事件 WM_KEYDOW鼠标点击事件 WM_LBUTTONDOW晌应

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论