C++俄罗斯方块课程设计报告书.doc_第1页
C++俄罗斯方块课程设计报告书.doc_第2页
C++俄罗斯方块课程设计报告书.doc_第3页
C++俄罗斯方块课程设计报告书.doc_第4页
C++俄罗斯方块课程设计报告书.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

大学C+面向对象课程设计报告院(系): 计算机工程学院 专业: 学生姓名: 班级:学号:201007206 题目: 俄罗斯方块 起迄日期: 2012.6.182012.6.29 设计地点: 计算机学院机房 指 导 教 师: 完成日期: 2012 年6月 29 日目 录一、需求分析. 31.课程设计内容.32.程序实现功能.3二、设计内容.31俄罗斯方块主功能框架图4 2. 主函数及各功能模块流程图.4三、调试分析.26 1.实际完成情况.27 2.上机过程中出现的问题及其解决方案 .27 3.程序中可以改进、扩充的功能及设计实现构想.27四、用户手册.27五、设计总结 31六、参考文献 32七、附录 32一、需求分析1. 课程设计目的俄罗斯方块是由阿列谢.帕基特诺发明的,Tetris游戏在一个m*n 的矩形形框内进行的,矩形框的顶部会随机的出现一个有四个小方块组成的砖块,每过一段时间,就会下落一格,知道他碰到底部,然后再过一个时间下落另一个砖块,依次进行,砖块是随机出现的。当发现底部砖块是满的话,则消去它从而得到相应设置的分数,当砖块到达顶部的时候,游戏结束。选择俄罗斯方块进行C+面向对象程序设计课程设计主要是在学习C+这门面向对象语言的基础上,在完成C+面向对象程序设计各部分实验的基础上,通过自学MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C+面向对象程序设计语言特点的认识与理解。同时,可以提高运用C+编程语言解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。2. 程序实现的功能【1】 实现方块的变形、下落、左移、右移消行等基本的功能。【2】 实现方块的直接丢下、暂停、判断分数以及等级设置功能。【3】 友好的地用户界面,七种基本的方块图形设计功能。【4】 设置快捷键实现游戏的暂停和播放音乐功能。二、设计内容方块旋转控制菜单显示功能俄罗斯方块方块移动操作功能方块移动控制主界面显示功能方块显示功能播放音乐功能游戏规则判断功能等级管理功能游戏等级选择游戏升级功能1.俄罗斯方块主功能框架图 2.主函数及各功能模块流程图【1】主程序流程图开始显示封面响应开始菜单函数画出游戏界面以及等级分数显示随机产生方块方块的移动及变形能否变形和移动以及到达顶端是否消行计算分数判断是否升级升级更新速度判断输赢【2】主程序函数调用图OnGamezStart()SetTimer()russia.GameStart()OnTimer() nIDEvent)russia.DrawBKMove()DrawWill()Meet()LineDelete()Win()Change()【3】键盘响应方块移动及操作模块算法流程图开始是否按下左方向键能否左移是否按下右方向键能否右移是否按上方向键能否变换是否按下下方向键能否下移左移右移下移代码实现部分:void CTetrisView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) /没有开始if(!m_bStart)return;if(m_bPause=TRUE)return;switch(nChar)case VK_LEFT:russia.Move(KEY_LEFT);break;case VK_RIGHT:russia.Move(KEY_RIGHT);break;case VK_UP:russia.Move(KEY_UP);break;case VK_DOWN:russia.Move(KEY_DOWN);break;/重画CDC* pDC=GetDC();russia.DrawBK(pDC);ReleaseDC(pDC);CView:OnKeyDown(nChar, nRepCnt, nFlags); void CRussia:Move(int direction) /移动方块if(end) return;switch(direction)/左case KEY_LEFT:if(Meet(Now,KEY_LEFT,NowPosition) break;NowPosition.y-;break;/右case KEY_RIGHT:if(Meet(Now,KEY_RIGHT,NowPosition) break;NowPosition.y+;break;/下case KEY_DOWN:if(Meet(Now,KEY_DOWN,NowPosition)LineDelete();break;NowPosition.x+;break;/上case KEY_UP:Meet(Now,KEY_UP,NowPosition);break;default:break;/方块旋转/bool CRussia:Change(int a4,CPoint p,int b100)int tmp44;int i,j;int k=4,l=4;for(i=0;i4;i+)for(j=0;j4;j+)tmpij=aj3-i;Afterij=0;/存放变换后的方块矩阵for(i=0;i4;i+)for(j=0;ji) k=i;if(lj) l=j;for(i=k;i4;i+)for(j=l;j4;j+)Afteri-kj-l=tmpij;/把变换后的矩阵移到左上角/判断是否接触,是:返回失败for(i=0;i4;i+)for(j=0;j=m_RowCount)|(p.y+j)=m_ColCount)return false;if(bp.x+ip.y+j=1)return false;return true;bool CRussia:Meet(int a4,int direction,CPoint p) /判碰撞,遇到了边界或者有其他方块档住int i,j;/先把原位置清0 for(i=0;i4;i+)for(j=0;j4;j+)if(aij=1)Russiap.x+ip.y+j=0;for(i=0;i4;i+)for(j=0;j4;j+)if(aij=1)switch(direction)case 1:/左移if(p.y+j-1)=m_ColCount) goto exit;if(Russiap.x+ip.y+j+1=1) goto exit;break;case 3:/下移if(p.x+i+1)=m_RowCount) goto exit;if(Russiap.x+i+1p.y+j=1) goto exit;break;case 4:/变换if(!Change(a,p,Russia) goto exit;for(i=0;i4;i+)for(j=0;j4;j+)Nowij=Afterij;aij=Nowij;return false;break;int x,y;x=p.x;y=p.y;/移动位置,重新给数组赋值switch(direction)case 1:y-;break;case 2:y+;break;case 3:x+;break;case 4:break;for(i=0;i4;i+)for(j=0;j4;j+)if(aij=1)Russiax+iy+j=1;return false;exit:for(i=0;i4;i+)for(j=0;j4;j+)if(aij=1)Russiap.x+ip.y+j=1;return true;【4】等级管理功能模块流程图开始响应菜单等级设置函数初始化等级对话框判断是否升级取出等级记录加一输入等级存入等级结束更新速度画面代码实现部分: void CRule:SetLevel(int nLevel)m_nLevel = nLevel;int CRule:UpLevel(int nLine) m_nLevel=nLine/30; return m_nLevel; CLevelDlg:CLevelDlg(CWnd* pParent /*=NULL*/): CDialog(CLevelDlg:IDD, pParent)/AFX_DATA_INIT(CLevelDlg)m_level = 0;/AFX_DATA_INITvoid CLevelDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CLevelDlg)DDX_Text(pDX, IDC_LEVEL_EDIT, m_level);/将变量和控件映射DDV_MinMaxInt(pDX, m_level, 1, 10);/设置等级最大值最小值/AFX_DATA_MAP/ CLevelDlg message handlersvoid CLevelDlg:OnOK() if(UpdateData(TRUE)CString tmp;tmp.Format(%d, m_level);WritePrivateProfileString(SETUP, level, tmp, .setup.ini);CDialog:OnOK();void CLevelDlg:OnOK() /确定if(UpdateData(TRUE)CString tmp;tmp.Format(%d, m_level);WritePrivateProfileString(SETUP, level, tmp, .setup.ini);CDialog:OnOK();void CLevelDlg:OnCancel() /取消CDialog:OnCancel();BOOL CLevelDlg:OnInitDialog() CDialog:OnInitDialog();char pszTmp128 = 0;GetPrivateProfileString(SETUP, level, 0, pszTmp, 127, .setup.ini);/取出保存的等级记录m_level = atoi(pszTmp);UpdateData(FALSE);return TRUE; void CRussia:LineDelete()int m=0;/本次共消去的行数bool flag=0;for(int i=0;im_RowCount;i+)/检查要不要消行flag=true;for(int j=0;j0;k-)/上行给下行for(int l=0;lm_ColCount;l+)Russiakl=Russiak-1l;/第一行为零for(int l=0;lBitBlt(0,0,500,550,&Dc,0,0,SRCCOPY);elserussia.DrawBK(pDC);void CTetrisView:OnTimer(UINT nIDEvent) /设置时间函数让方块自动按时移动russia.Move(KEY_DOWN);russia.DrawBK(GetDC();CView:OnTimer(nIDEvent);/绘游戏界面/void CRussia:DrawBK(CDC*pDC)CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(Cant create DC);/画背景 Dc.SelectObject(bkMap);pDC-BitBlt(0,0,540,550,&Dc,0,0,SRCCOPY); /画分数,速度,难度DrawScore(pDC); /如果有方块,显示方块/游戏区for(int i=0;im_RowCount;i+)for(int j=0;jBitBlt(j*30,i*30,100,100,&Dc,0,0,SRCCOPY);/预先图形for(int n=0;n4;n+)for(int m=0;mBitBlt(400+m*30,100+n*30,30,30,&Dc,0,0,SRCCOPY); /绘分数和等级/void CRussia:DrawScore(CDC*pDC)int nOldDC=pDC-SaveDC();/设置字体CFont font; if(0=font.CreatePointFont(200,Comic Sans MS)AfxMessageBox(Cant Create Font);pDC-SelectObject(&font); /设置字体颜色及其背景颜色CString str;CString a(下一个方块:);pDC-SetTextColor(RGB(0,255,0);pDC-SetBkColor(RGB(255,255,255); /输出数字str.Format(等级:%d,m_Level);if(m_Level=0)pDC-TextOut(400,275,str);/*str.Format(行数:%d,m_CountLine);if(m_Speed=0)pDC-TextOut(410,325,str);*/str.Format(总分:%d,m_Score);if(m_Score=0)pDC-TextOut(400,325,str);str.Format(%s,a); pDC-TextOut(370,25,str); pDC-RestoreDC(nOldDC);【6】游戏规则判断功能模块开始是否升级更新级别速度是否结游戏束结束代码实现部分:CRule:CRule()CRule:CRule()void CRule:SetLevel(int nLevel)m_nLevel = nLevel;/设置等级int CRule:UpLevel(int nLine) m_nLevel=nLine/30;return m_nLevel; /游戏每一次消30行升一级bool CRule:Win(int Now44, int Russia 100100, CPoint NowPosition)if(m_nLevel = 11)return true;for(int i=0;i4;i+)for(int j=0;j4;j+)if(Nowij=1)if(Russiai+NowPosition.xj+NowPosition.y=1)return true;return false;/判断是否结束游戏/行消除函数/void CRussia:LineDelete()int m=0;/本次共消去的行数bool flag=0;for(int i=0;im_RowCount;i+)/检查要不要消行flag=true;for(int j=0;j0;k-)/上行给下行for(int l=0;lm_ColCount;l+)Russiakl=Russiak-1l;/第一行为零for(int l=0;lGetMenu();/判断播放音乐菜单当前状态BOOL bCheck = (BOOL)pMenu-GetMenuState(IDR_PLAY_MUSIC, MF_CHECKED);if(m_bStart)if(bCheck)pMenu-CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_UNCHECKED);elsepMenu-CheckMenuItem(IDR_PLAY_MUSIC, MF_BYCOMMAND | MF_CHECKED);PlayBackMusic(!bCheck);/调用播放背景音乐功能函数void CTetrisView:PlayBackMusic(BOOL bCheck)/指定文件并播放if(bCheck)/播放音乐sndPlaySound(music.wav,SND_ASYNC); else/停止播放sndPlaySound(NULL,SND_PURGE); 三、调试分析1.实际完成情况【1】数据类型说明此程序中用到的数据结构主要是二维数组。如:int Russia100100;/游戏数组,用于存放整个界面的方块 int Now44;/ 当前图形,用于存放当前产生的方块 int Will44;/上一图形,用于存放上一次产生的方块【2】功能说明俄罗斯方块能实现游戏方块的变形、下落、左移、右移消行基本功能,当方块落满一行时,需要消除这一行。而且需要在界面上显示出游戏的级别以及要不断刷新的分数。在方块的移动过程当中,要不断地刷洗界面同时判断方块下一个位置有没有方块或者墙壁存在。当游戏结束时,有两种结果。一种是玩家失败方块落到顶部,另外一种是超过最大等级级,也就是是通关了。游戏的等级设置分为(十种等级,当点击菜单中的响应选项时,弹出对话框,输入后你想玩的级别要对游戏有相应的改变。除此之外额外添加了背景音乐和快捷键功能使游戏更加完善。2.上机过程中出现的问题及其解决方案首先是如何使用vc中的MFC问题,一个完全陌生的平台让我不知所措,后来通过阅读老师推荐的闻怡洋的MFC快速入门,以及观看孙鑫的视频对MFC有了初步的认识,从而逐步静下心来开始编写成素。接着就是游戏的算法问题,如何变换,如何消行,如何检测是否碰到墙壁壁,开始的时候都是很茫然,后来通过查阅网上的算法。知道变换时可以通过一个tmp数组临时存储方块,判断是否碰到碰壁可以借助一个After数组便可以轻松解决。最后程序运行时却发现方块不是按纵坐标而是按横坐标移动,但却始终找不到问题的症结,从头上下检查了几遍,终于发现,原来是画方块的DrawBK(CDC*pDC)函数中的横纵坐标搞翻,修改后程序运行成功。3.程序中可以改进、扩充的功能及设计实现构想随着级别的上升,我只是让速度发生了改变,其实还可以通过改变游戏界面行数和列数还有增加方块的样式来提升游戏难度。添加英雄榜同样可以吸引玩家的兴趣,另外我在设计的时候没有考虑到帮助模块,希望在以后的编程中改进。游戏的界面非常简单,我使用了加载位图的方法,其实还可以使用一些画图函数使界面更加漂亮,只是由于自己掌握的知识太过贫乏,没办法在短时间内设计出一个漂亮的界面,在课程设计之后希望能多补充一些知识设计出一个美观而又完善的界面。四、用户手册1.使用平台:Microsoft Visual.2.需要安装。将下载的压缩包解压出来,然后在解压出来的文件中点击setup.exe;这需要很长的时间。3

温馨提示

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

评论

0/150

提交评论