C++俄罗斯方块(共30页).doc

上传人:飞****2 文档编号:7622014 上传时间:2022-02-28 格式:DOC 页数:30 大小:269KB
返回 下载 相关 举报
C++俄罗斯方块(共30页).doc_第1页
第1页 / 共30页
C++俄罗斯方块(共30页).doc_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《C++俄罗斯方块(共30页).doc》由会员分享,可在线阅读,更多相关《C++俄罗斯方块(共30页).doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上大连商务职业学院信息技术与艺术设计院毕业设计(论文)题目 VC小型项目的开发 小游戏的开发 专 业 软件技术 学 号 姓 名 闫森 指 导 教 师 章五一 2011年2月17日摘 要随着现代人民的生活水平不断提高,传统的娱乐项目已经无法满足现在人的市场需求,而随着电子计算机科技的高速发展,电子游戏这个新兴行业在次机遇下孕育而生。随着30年来的发展,电子游戏也产生了质的变化,向着智能化,人性化发展,而动作体感技术,裸眼3D技术,六轴感应功能都为我们带来了丰厚的体验。而始终不变的理论就是简单好玩,让玩的人感到快乐就是电子游戏的宗旨。关键词:小游戏开发 实现 附加内容 目

2、录 中文摘要2 1.引言4 2.VC+语言的简述4 2.1VC+语言的概念43关于游戏的实现4 3.1游戏的具体实现54.附加内容275总结29 注解29 参考文献291引言游戏是一系列有趣的选择,因此没有什么能够比用我们的游戏给人们带来快乐更能让人高兴的事情了。可以试想一下,几乎每个男孩子在儿童时代都有过飞天梦想,然而实现缺不允许每个人都完成他们的梦想,而这个时候游戏的出现却可以弥补这个问题,这将是一个多么幸福的事情。每一个人的脸上都涌现出幸福的笑容,而这正是从古至今人们所不断追求的。我之所以选择了俄罗斯方块开发就是因为它是游戏,而且还是一款具有划时代意义的优秀游戏。游戏的本质就是带给人于快

3、乐。人们从优秀的游戏中得到快乐和启发,而游戏制作者又从人们的建议中得到灵感,这正是FOR GAMER,FOR GAME。2VC+语言的简述2.1VC+语言的概念VC+是开发的一个(IDE),就是使用c+的一个开发平台。有些就是这个编出来的。另外还有VB、VF,只是使用不同语言。 VC+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Windows的消息机制以及回调(callback)的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;C

4、OM是的二进制标准,需要掌握其基本原理等等3关于游戏的实现俄罗斯方块,或称积木游戏,它是利用一些形状各异却又是用正方形组成的方块,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。而从我们编程的角度讲,我们只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。键盘操作键:就是四个方向键。其中左、右、下三个键意思一样,上键的功能不是使方块向上,而是使方块的下落角度改变31游戏的具体实现资源编辑添加位图: 封面: IDB_BITMAP1背景: IDB_BIT

5、MAP2方块: IDB_BITMAP4 图3-1添加菜单: 开始: ID_MENU_START图3-2 变量函数接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,我要建一个新类。是否应该先添加应该类呢?最好是这样。因为新类将会涉及到变量。添加普通类Crussia,添加变量函数:/4_1View.h :/俄罗斯类CRussia russia; /开始标志bool start; /封面CBitmap fenmian; /暂停BOOL m_bPause; /开始菜单afx_msg void OnMenuStart(); /计时器afx_msg void OnTimer(UINT nID

6、Event); /键盘操作afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);/ Russia.h:/游戏数组int Russia100100; / 当前图形int Now44; /上一图形int Will44; /变换后的图形int After44;/当前图形的左上角位置CPoint NowPosition;/当前可能出现的图形形状数,int Count;/游戏结束bool end; /级别int m_Level;/速度int m_Speed;/分数int m_Score; /行列数int m_RowCount,m_Co

7、lCount;/方块CBitmap fangkuai;/背景CBitmap jiemian; /显示分数等内容void DrawScore(CDC*pDC); /消行void LineDelete(); /方块移动void Move(int direction); /方块变化,即方向键上键操作bool Change(int a4,CPoint p,int b100); /是否与原来方块接触,或与边界接触bool Meet(int a4,int direction,CPoint p); /显示下一个方块void DrawWill(); /显示界面void DrawJiemian(CDC*pDC)

8、; /开始void Start(); 具体实现构造函数:CMy4_1View:CMy4_1View()/ TODO: add construction code herefenmian.LoadBitmap(IDB_BITMAP1);start=false;m_bPause=false;CRussia:CRussia()jiemian.LoadBitmap(IDB_BITMAP2);fangkuai.LoadBitmap(IDB_BITMAP4);画图函数:void CMy4_1View:OnDraw(CDC* pDC)CMy4_1Doc* pDoc = GetDocument();ASSER

9、T_VALID(pDoc);/ TODO: add draw code for native data hereCDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(Cant create DC);/没有开始,显示封面if( !start)Dc.SelectObject(fenmian);pDC-BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY);/显示背景elserussia.DrawJiemian(pDC);界面函数:void CRussia:DrawJiemian(CDC*pDC)CDC Dc;if(Dc.C

10、reateCompatibleDC(pDC)=FALSE)AfxMessageBox(Cant create DC);/画背景 Dc.SelectObject(jiemian);pDC-BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY); /画分数,速度,难度DrawScore(pDC); /如果有方块,显示方块/游戏区for(int i=0;im_RowCount;i+)for(int j=0;jBitBlt(j*30,i*30,30,30,&Dc,0,0,SRCCOPY); /预先图形方块for(int n=0;n4;n+)for(int m=0;mBitBlt(365

11、+m*30,240+n*30,30,30,&Dc,0,0,SRCCOPY); 图3-3 信息函数:void CRussia:DrawScore(CDC*pDC)int nOldDC=pDC-SaveDC();/设置字体CFont font; if(0=font.CreatePointFont(300,Comic Sans MS)AfxMessageBox(Cant Create Font);pDC-SelectObject(&font); /设置字体颜色及其背景颜色CString str;pDC-SetTextColor(RGB(39,244,10);pDC-SetBkColor(RGB(25

12、5,255,0); /输出数字str.Format(%d,m_Level);if(m_Level=0)pDC-TextOut(440,120,str);str.Format(%d,m_Speed);if(m_Speed=0)pDC-TextOut(440,64,str);str.Format(%d,m_Score);if(m_Score=0)pDC-TextOut(440,2,str);pDC-RestoreDC(nOldDC);菜单开始函数:添加菜单开始函数:ID_MENU_START其函数如下:void CMy4_1View:OnMenuStart() / TODO: Add your c

13、ommand handler code here start=true; russia.Start();SetTimer(1,50*(11-russia.m_Speed ),NULL); 开始函数:void CRussia:Start()end=false;/运行结束标志 m_Score=0;/初始分数m_Speed=0;/初始速度m_Level=1;/初始难度m_RowCount=18;/行数m_ColCount=12;/列数Count=7;/方块种类 /清空背景数组for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)Russiaij=

14、0; /清空方块数组Now Will for(i=0;i4;i+)for(int j=0;j4;j+)Nowij=0;Willij=0; /先画WillDrawWill();/再画Now&WillDrawWill(); 图3-4预备方块:void CRussia:DrawWill()int i,j;int k=4,l=4; /把将要出现的方块给当前数组,并把将要出现数组赋值为零for(i=0;i4;i+)for(j=0;j4;j+)Nowij=Willij;Willij=0;srand(GetTickCount();int nTemp=rand()%Count;/各种图形switch(nTem

15、p)case 0:Will00=1;Will01=1;Will10=1;Will11=1;break;case 1:Will00=1;Will01=1;Will10=1;Will20=1;break;case 2:Will00=1;Will01=1;Will11=1;Will21=1;break;case 3:Will01=1;Will10=1;Will11=1;Will20=1;break;case 4:Will00=1;Will10=1;Will11=1;Will21=1;break;case 5:Will00=1;Will10=1;Will11=1;Will20=1;break;case

16、 6:Will00=1;Will10=1;Will20=1;Will30=1;break;/*case 7:Will00=1;Will10=1;Will11=1;Will12=1;Will02=1;break;case 8:Will00=1;Will10=1;Will20=1;Will11=1;Will12=1;break;*/ /转换int tmp44;for(i=0;i4;i+)for(j=0;j4;j+)tmpij=Willj3-i; /整理,为了移动的需要for(i=0;i4;i+)for(j=0;ji) k=i;if(lj) l=j;for(i=0;i4;i+)for(j=0;j4;

17、j+)Willij=0;/把变换后的矩阵移到左上角for(i=k;i4;i+)for(j=l;j4;j+)Willi-kj-l=tmpij; / Now的开始位置NowPosition.x=0;NowPosition.y=m_ColCount/2;计时器函数:void CMy4_1View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default/下移russia.Move(3);/重画russia.DrawJiemian(GetDC();CView:OnTimer(nIDEven

18、t);键盘操作:void CMy4_1View:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call default /没有开始if(!start) return; /暂停 if(m_bPause=TRUE) return;switch(nChar)case VK_LEFT:russia.Move(1);break;case VK_RIGHT:russia.Move(2);break;case VK_UP:russia.Move(4);bre

19、ak;case VK_DOWN:russia.Move(3);break;/重画CDC* pDC=GetDC();russia.DrawJiemian(pDC);ReleaseDC(pDC);CView:OnKeyDown(nChar, nRepCnt, nFlags);移动函数:void CRussia:Move(int direction)if(end) return;switch(direction)/左case 1:if(Meet(Now,1,NowPosition) break;NowPosition.y-;break;/右case 2:if(Meet(Now,2,NowPositi

20、on) break;NowPosition.y+;break;/下case 3:if(Meet(Now,3,NowPosition)LineDelete();break;NowPosition.x+;break;/上case 4:Meet(Now,4,NowPosition);break;default:break;消行函数: /消去行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

21、l=0;lm_ColCount;l+)Russiakl=Russiak-1l;/第一行为零for(int l=0;lm_ColCount;l+)Russia0l=0; /消行,表示运动方块已经停止/必须生成新的运动方块DrawWill();/加分switch(m)case 1:m_Score+;break;case 2:m_Score+=3;break;case 3:m_Score+=6;break;case 4:m_Score+=10;break;default:break;/速度赋值m_Speed=m_Score/100;for(i=0;i4;i+)for(int j=0;j4;j+)if

22、(Nowij=1)/到了顶点if(Russiai+NowPosition.xj+NowPosition.y=1)end=true;AfxMessageBox(游戏结束!);return; 图3-5过界或重叠:/是否遇到了边界或者有其他方块档住了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)cas

23、e 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

24、;/移动位置,重新给数组赋值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; 图3-6变换函数:/转换bool CRussia:Change(int a4, CPoint p,int b100)int tmp44;i

25、nt 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

26、true;现在,我的程序编好了,可以玩了。 4附加内容但是,这样一来游戏是否还少了什么?对了,暂停、热键、还有艺术字!l l 暂停 void CMy4_1View:OnMenuPause() / TODO: Add your command handler code herem_bPause=!m_bPause;/停止计数器if(m_bPause)KillTimer(1);/开始计数器elseSetTimer(1,50*(11-russia.m_Speed ),NULL); void CMy4_1View:OnUpdateMenuPause(CCmdUI* pCmdUI) / TODO: Ad

27、d your command update UI handler code here/是否显示钩pCmdUI-SetCheck(m_bPause); l l 热键打开Accelerator,添加如上ID号,选择如上ID号和热键就行了。l l 艺术字这不是用VC+做的,它只是一张位图。不过,这张位图是我自己做的,怎么做?我是利用Word里面的艺术字,做好之后,把它拷贝到位图上就行了!5总结 一个好的游戏不仅仅需要优秀的创意,还离不开新的科学技术以及一个优秀的团队。我所制作的俄罗斯方块仅仅是最简单的一个例子,尽管如此,在制作过程中任然遇到了很多的问题,而基于所学的不精对于一些系统性的问题任然有许多的盲点,以此有的许多新鲜的想法最后不得不放弃实在是个遗憾。 注解: 闫森.信息技术与艺术设计学院.软件技术.大连商务职业学院参考文献 孙鑫VC+视屏教程 教程VC+ 专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁