大鱼吃小鱼说明书.doc_第1页
大鱼吃小鱼说明书.doc_第2页
大鱼吃小鱼说明书.doc_第3页
大鱼吃小鱼说明书.doc_第4页
大鱼吃小鱼说明书.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

VC+综合设计说明书姓名王冠杨焜耀班级计科091计科091学号20091110142009111038任务分工主函数实现类添加指导教师李璟完成日期2011年6月10日一、问题描述大鱼吃小鱼,是我根据自己的意愿,是为了我将要说明的下面有关内容而设置的。由于没有经过具体实践,我并不能保证其趣味性和吸引力,我们学习的是它实现过程中的一些思想。希望对读者有所帮助。其实,这种游戏,在街头电子游戏中是常见的。但由于电脑的渐渐普及,大规模游戏的迅速出现,已经不适合玩者的需求了。但是,我们可以以小见大,在学习小游戏的基础上,慢慢培养设计大游戏的一些方法和技巧。关于游戏的角色:小鱼(颜色不同),是游戏的主角,它有初始的生命值,它为了生存,必须能够逃脱灾难性的局面(被大鱼撞到),它在经过所谓的适者生存的淘汰之后(在30秒内吃掉20个小鱼),可以吃掉大鱼,以达到防身的目的。每吃一个小鱼得十分,每被大鱼撞一下失去一条生命。小鱼,一共有20个,但为了维持生态平衡,分时间段显示出来。敌人小鱼,是为了英雄小鱼添加生命值而存在的,它将会在现代科技的伪随机函数中不定向地出现。大鱼,在小鱼不能吃掉大鱼之前,每碰一下小鱼,会减掉小鱼的生命值,一次减60生命值。气泡,为了让界面漂亮而而设置的,没有碰撞之后的反应。关于游戏的实现:游戏,经常都是全屏的,但是由于我们的目的不仅仅在于游戏本身,我们的宗旨是利用游戏的趣味性和吸引力,来增强读者学习程序语言的信心。所以,在前面我们都没有用到全屏显示,我们不需要。另外说明:本游戏的全屏只适应于800*600的分辨率。多位图的移动,是本游戏要学习的内容,上面的有很多位图可以移动,这是由于游戏本身决定的。当然,这个游戏的多位图移动,也是游戏本身决定的,当然,我们没有那么多的手去操作键盘,去移动位图。我们必须设置我们的程序,让程序自己去执行,去移动,去显示计算机的优越性。这个游戏,只是玩者一个人充当角色。所以,我们新建了各自的类。二、程序特点本设计可以设置不同的难度,不同的难度是指大鱼会跟着小鱼移动,这样增加了游戏的难度和可玩性,另外,漂亮的背景和位图也是程序的特点,类的层次分明,采用Skin+皮肤。三、系统设计1 制作位图既然游戏是复杂的,它就需要很多位图,只是说明一下位图的数量和大小。背景位图:800*600 1张 IDB_GROUND英雄小鱼位图:50*50 4张 IDB_HERO敌小鱼位图:50*50 1张 IDB_ENEMY气泡位图:50*50 1张 IDB_PALL2 变量和函数英雄小鱼:它有位置,生命值,生命力。其中它自己的图像。我们必须为它定义一个类。新建类:CHero添加变量如下: public:CPoint m_pointHero;/ 英雄的位置CBitmap m_bmpHero;/ 英雄的图象bool HeroFlag; /英雄是否显示bool first;int HeroLife; /英雄生命值int m_nWidth;/ 英雄的图象宽int m_nHeight;/ 英雄的图象高 敌小鱼它也有位置,也有它自己的图像。由于一共有二十个球,我们也定义它为一共类。 新建类:CEnemy添加变量如下:public:CPoint m_pointEnemy;/ 小鱼的位置CBitmap m_bmpEnemy;/ 小鱼的图象bool EnemyFlag; /小鱼是否显示int EnemyLife; /小鱼生命值int m_nWidth;/ 小鱼的图象宽int m_nHeight;/ 小鱼的图象高int num; /区分显示不同位图气泡它也有位置,也有它自己的图像。由于一共有二十个球,我们也定义它为一共类。 新建类:CPall添加变量如下:public:CPoint m_pointPall ;/ 气泡的位置CBitmap m_bmpPall;/ 气泡的图象bool PallFlag; /气泡是否显示int PallLife; /气泡生命值int m_nWidth;/ 气泡的图象宽int m_nHeight;/ 气泡的图象高int num; /区分显示不同位图Boss它也有位置,也有它自己的图像。由于一共有二十个球,我们也定义它为一共类。 新建类:CBoss添加变量如下:public:CPoint m_pointBoss;/ boss的位置CBitmap m_bmpBoss;/ boss的图象bool BossFlag; /boss是否显示int BossLife; /boss生命值int m_nWidth;/ boss的图象宽int m_nHeight;/ boss的图象高bool first; /是否跟踪游戏:最后,到了主程序, 在CGameView中添加如下变量和函数:public:CPall pall4;/气泡数组CBoss boss4;/boss数组CHero hero;/英雄CEnemy enemy21/敌小鱼数组;CLeval Dlg;/设置难度的对话框int leval;/难度int Score;/得分int temp;/时间void DrawGround(CDC *pDC, CRect Client);/画背景BOOL ShotOn(CRect &body1, CRect &body2);/碰撞检测3 具体实现CBoss:CBoss()m_pointBoss= CPoint(926, 10);/初始boss位置坐标BossFlag=true;/初始显示first=true; /用于是否跟踪,跟踪为falseBossLife=100;/生命值设为100m_bmpBoss.LoadBitmap(IDB_BOSS);BITMAP BM;m_bmpBoss.GetBitmap(&BM);m_nWidth= BM.bmWidth/2;m_nHeight= BM.bmHeight;/ 显示bossvoid CBoss:ShowBoss(CDC *pDC, CDC *pMemDC, CRect Client)pMemDC-SelectObject(&m_bmpBoss);pDC-BitBlt(m_pointBoss.x,m_pointBoss.y,m_nWidth,m_nHeight,pMemDC,m_nWidth,0,SRCPAINT);/或运算pDC-BitBlt(m_pointBoss.x,m_pointBoss.y,m_nWidth,m_nHeight,pMemDC,0,0,SRCAND);/与运算/ 改变boss位置 在屏幕上方来回平移void CBoss:ChangePos(int num)if(m_pointBoss.x500)/边界是926m_pointBoss.x = rand()%926;m_pointBoss.y = rand()%600;elsem_pointBoss.x -= num;m_pointBoss.y+=rand()%12;void CBoss:ResetPos()m_pointBoss=(0,0);CBoss:CBoss()CEnemy:CEnemy()num=rand()%20;m_pointEnemy= CPoint(926, 10);/初始位置坐标EnemyFlag=false;EnemyLife=10;/生命值设为10if (num10)m_bmpEnemy.LoadBitmap(IDB_ENEMY2);elsem_bmpEnemy.LoadBitmap(IDB_ENEMY3);BITMAP BM;m_bmpEnemy.GetBitmap(&BM);m_nWidth= BM.bmWidth/2;m_nHeight= BM.bmHeight;/ 显示小鱼void CEnemy:ShowEnemy(CDC *pDC, CDC *pMemDC, CRect Client)pMemDC-SelectObject(&m_bmpEnemy);pDC-BitBlt(m_pointEnemy.x,m_pointEnemy.y,m_nWidth,m_nHeight,pMemDC,m_nWidth,0,SRCPAINT);/或运算pDC-BitBlt(m_pointEnemy.x,m_pointEnemy.y,m_nWidth,m_nHeight,pMemDC,0,0,SRCAND);/与运算/ 改变小鱼位置 在屏幕上方来回平移void CEnemy:ChangePos(int num)if(m_pointEnemy.x500)/边界是926m_pointEnemy.x = rand()%926;m_pointEnemy.y = rand()%600;elsem_pointEnemy.x -= num;m_pointEnemy.y+=rand()%12;void CEnemy:ResetPos()m_pointEnemy=(0,0);CEnemy:CEnemy()CHero:CHero()m_pointHero= CPoint(100, 300);/坐标赋初值HeroFlag=false;first=true;HeroLife=10;/生命值初始设为100m_bmpHero.LoadBitmap(IDB_HERO);BITMAP BM;m_bmpHero.GetBitmap(&BM);/通过此函数获得图像的长与宽m_nWidth= BM.bmWidth/2;m_nHeight= BM.bmHeight;/ 显示英雄void CHero:ShowHero(CDC *pDC, CDC *pMemDC, CRect Client)pMemDC-SelectObject(&m_bmpHero);pDC-BitBlt(m_pointHero.x,m_pointHero.y,m_nWidth,m_nHeight,pMemDC,m_nWidth,0,SRCPAINT);/或运算pDC-BitBlt(m_pointHero.x,m_pointHero.y,m_nWidth,m_nHeight,pMemDC,0,0,SRCAND);/与运算/ 根据tag改变英雄位置void CHero:ChangePos(int tag) if(tag = 0 & m_pointHero.x+m_nWidth 0)/边界m_pointHero.x-= 20;/左移else if(tag = 2 & m_pointHero.y+m_nHeight 60)/边界m_pointHero.y-= 20;/上移/复位英雄位置void CHero:ResetPos()m_pointHero= CPoint(100, 300);/坐标赋初值HeroFlag=false;HeroLife=10;/生命值初始设为10m_bmpHero.LoadBitmap(IDB_HERO1);BITMAP BM;m_bmpHero.GetBitmap(&BM);/通过此函数获得图像的长与宽m_nWidth= BM.bmWidth/2;m_nHeight= BM.bmHeight;CHero:CHero()CPall:CPall()num=rand()%20;m_pointPall= CPoint(26, 600);/初始位置坐标PallFlag=false;PallLife=10;/生命值设为10m_bmpPall.LoadBitmap(IDB_BITMAP4);BITMAP BM;m_bmpPall.GetBitmap(&BM);m_nWidth= BM.bmWidth/2;m_nHeight= BM.bmHeight;/ 显示pallvoid CPall:ShowPall(CDC *pDC, CDC *pMemDC, CRect Client)pMemDC-SelectObject(&m_bmpPall);pDC-BitBlt(m_pointPall.x,m_pointPall.y,m_nWidth,m_nHeight,pMemDC,m_nWidth,0,SRCPAINT);/或运算pDC-BitBlt(m_pointPall.x,m_pointPall.y,m_nWidth,m_nHeight,pMemDC,0,0,SRCAND);/与运算/ 改变pall上下移动void CPall:ChangePos(int num)if(m_pointPall.y0)/边界是926m_pointPall.y -= rand()%60;elsem_pointPall.y=rand()%1024;void CPall:ResetPos()m_pointPall=(0,0);CPall:CPall()CGameView:CGameView()/ TODO: add construction code hereScore=10;temp=0;pall0.m_pointPall=CPoint(0,600);pall1.m_pointPall=CPoint(200,600);pall2.m_pointPall=CPoint(600,600);pall3.m_pointPall=CPoint(960,600);boss0.m_pointBoss=CPoint(200,10);boss1.m_pointBoss=CPoint(20,10);boss2.m_pointBoss=CPoint(20,100);boss3.m_pointBoss=CPoint(600,500);enemy0.m_pointEnemy=CPoint(100,20);enemy1.m_pointEnemy=CPoint(400,230);enemy2.m_pointEnemy=CPoint(200,210);enemy3.m_pointEnemy=CPoint(40,50);enemy4.m_pointEnemy=CPoint(16,2);enemy5.m_pointEnemy=CPoint(130,68);enemy6.m_pointEnemy=CPoint(45,40);enemy7.m_pointEnemy=CPoint(10,80);enemy8.m_pointEnemy=CPoint(110,80);enemy9.m_pointEnemy=CPoint(10,800);enemy10.m_pointEnemy=CPoint(10,800);enemy11.m_pointEnemy=CPoint(102,800);enemy12.m_pointEnemy=CPoint(130,800);enemy13.m_pointEnemy=CPoint(10,1800);enemy14.m_pointEnemy=CPoint(10,800);enemy14.m_pointEnemy=CPoint(46,800);enemy15.m_pointEnemy=CPoint(10,800);enemy16.m_pointEnemy=CPoint(10,0);enemy17.m_pointEnemy=CPoint(0,800);enemy18.m_pointEnemy=CPoint(10,800);enemy19.m_pointEnemy=CPoint(10,800);enemy20.m_pointEnemy=CPoint(10,800);/画背景void CGameView:DrawGround(CDC *pDC, CRect Client)CBitmap bitmap;CDC dcMemory;bitmap.LoadBitmap(IDB_GROUND); dcMemory.CreateCompatibleDC(pDC);dcMemory.SelectObject(&bitmap);pDC-BitBlt(0,0,Client.right-Client.left,Client.bottom-Client.top,&dcMemory,0,0,SRCCOPY);void CGameView:OnDraw(CDC* pDC)CGameDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/的确,CDC BufferDC; /首先定义一个显示设备对象 CDC MemDC; /首先定义一个显示设备对象 MemDC.CreateCompatibleDC(pDC); CBitmap MemBitmap;/定义一个位图对象 CRect rect;GetClientRect(&rect);int ClientWidth;int ClientHeight;ClientWidth =rect.right-rect.left;ClientHeight = rect.bottom-rect.top;/随后建立与屏幕显示兼容的位图内存显示设备 /MemDC.CreateCompatibleDC(pDC);/随后建立与屏幕显示兼容的缓存显示设备BufferDC.CreateCompatibleDC(pDC); /下面建立一个与屏幕显示兼容的位图,位图的大小可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,ClientWidth,ClientHeight); /将位图选入到内存显示设备中 /只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 BufferDC.SelectObject(&MemBitmap); DrawGround(&BufferDC,rect); / 画背景hero.ShowHero(&BufferDC,&MemDC,rect);if (pall0.PallFlag)pall0.ShowPall(&BufferDC,&MemDC,rect);if (pall1.PallFlag)pall1.ShowPall(&BufferDC,&MemDC,rect);if (pall2.PallFlag)pall2.ShowPall(&BufferDC,&MemDC,rect);if (pall3.PallFlag)pall3.ShowPall(&BufferDC,&MemDC,rect);if (boss0.BossFlag)boss0.ShowBoss(&BufferDC,&MemDC,rect);if (boss1.BossFlag)boss1.ShowBoss(&BufferDC,&MemDC,rect);if (boss2.BossFlag)boss2.ShowBoss(&BufferDC,&MemDC,rect);if (boss3.BossFlag)boss3.ShowBoss(&BufferDC,&MemDC,rect);for (int i=0;iBitBlt(0,0,ClientWidth,ClientHeight,&BufferDC,0,0,SRCCOPY); /绘图完成后的清理 MemBitmap.DeleteObject(); BufferDC.DeleteDC(); MemDC.DeleteDC(); void CGameView:OnGamestart() / TODO: Add your command handler code hereSetTimer(1,220,NULL);SetTimer(2,1000,NULL);Score=10;void CGameView:OnGamestop() / TODO: Add your command handler code hereKillTimer(1);/碰撞检测BOOL CGameView:ShotOn(CRect &body1, CRect &body2) /若body2矩形区域的左上角在body1矩形区域中,则返回true return body1.PtInRect(body2.TopLeft();void CGameView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultswitch(nIDEvent)case 1:pall0.ChangePos(-15);pall1.ChangePos(-10);pall2.ChangePos(9);pall3.ChangePos(3);/自己随机改变位置boss0.ChangePos(20);/boss1.ChangePos(-30);/ /*boss2.ChangePos(50);*/ 始终跟着英雄if (boss3.first)boss3.ChangePos(-50);if (!boss3.first)if (boss3.BossFlag)if (boss3.m_pointBoss.xhero.m_pointHero.x)boss3.m_pointBoss.x-=10;if (boss3.m_pointBoss.yhero.m_pointHero.y)boss3.m_pointBoss.y-=10;if (boss3.m_pointBoss.yhero.m_pointHero.y)boss2.m_pointBoss.y+=10;enemy0.ChangePos(10);enemy1.ChangePos(-20);enemy2.ChangePos(15);enemy3.ChangePos(-25);enemy4.ChangePos(10);enemy5.ChangePos(-8);enemy6.ChangePos(20);enemy7.ChangePos(-28);enemy8.ChangePos(32);enemy9.ChangePos(-32);enemy10.ChangePos(42);enemy11.ChangePos(-62);enemy12.ChangePos(83);enemy13.ChangePos(-83);enemy14.ChangePos(101);enemy15.ChangePos(-103);enemy16.ChangePos(156);enemy17.ChangePos(-159);enemy18.ChangePos(-200);enemy19.ChangePos(200);enemy20.ChangePos(-250);if (boss2.BossFlag)if (boss2.m_pointBoss.xhero.m_pointHero.x)boss2.m_pointBoss.x-=20;if (boss2.m_pointBoss.yhero.m_pointHero.y)boss2.m_pointBoss.y-=20;if (boss2.m_pointBoss.y=5)hero.first=false;if(temp%5=0)boss0.BossFlag=true;enemy0.EnemyFlag=true;enemy1.EnemyFlag=true;if(temp%10=0)enemy2.EnemyFlag=true;enemy3.EnemyFlag=true;if(temp%15=0)enemy5.EnemyFlag=true;enemy4.EnemyFlag=true;if(temp%20=0)pall3.PallFlag=true;pall2.PallFlag=true;pall1.PallFlag=true;pall0.PallFlag=true;enemy6.EnemyFlag=true;enemy7.EnemyFlag=true;if(temp%25=0)enemy8.EnemyFlag=true;enemy9.EnemyFlag=true;if(temp%30=0)for (int i=10;i=20;i+)enemyi.EnemyFlag=true;break;Invalidate(false);CView:OnTimer(nIDEvent);void CGameView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar)case VK_UP:hero.ChangePos(3);break;case VK_DOWN:hero.ChangePos(2);break;case VK_LEFT:hero.ChangePos(1);break;case VK_RIGHT:hero.ChangePos(0);break;for (int i=0;i=20;i+)if(ShotOn(enemyi.GetEnemy(),hero.GetHero()|ShotOn(hero.GetHero(),enemyi.GetEnemy()/如果被接到就加十分/并且置显示位为falseenemyi.EnemyFlag=false;hero.HeroLife+=10;enemyi.ResetPos();for (int j=0;j=3;j+)if (!bossj.first)if(ShotOn(bossj.GetBoss(),hero.GetHero()|ShotOn(hero.GetHero(),bossj.GetBoss()/如果被接到就去20分/并且置显示位为falsehero.HeroLife+=60;bossj.BossFlag=false;bossj.ResetPos();if (bossj.first)if(ShotOn(bossj.GetBoss(),hero.GetHero()|ShotOn(hero.GetHero(),bossj.GetBoss()/如果被接到就去20分/并且置显示位为falsehero.HeroLife-=60; if (leval=2)boss3.first=false;/等级为2的时候就激活另一大鱼的跟踪Score=hero.HeroLife;if (Score=20&tempTrackPopupMenu( TPM_LEFTALIGN, point.x,point.y,this); void CGameView:OnLeval() / TODO: Add your command handler code hereif (IDOK=Dlg.DoModal()leval=Dlg.m_leval;CString str;str.Format(%d,leval);AfxMessageBox(有+str+个大鱼要追着吃你哦);void CGameView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaulthero.m_p

温馨提示

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

评论

0/150

提交评论