为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

吃豆子vc 课程设计

2017-11-12 25页 doc 93KB 21阅读

用户头像

is_003124

暂无简介

举报
吃豆子vc 课程设计吃豆子vc 课程设计 面向对象方法及程序设计 课程设计报告 题目: 吃豆子游戏 分 组: 第17组 组员姓名:周俊晨、白增垚、武春晓 班 级:计本1203班 指导教师:刘通 完成日期: 2014年 6 月 20 日 1 目录 一、游戏功能描述...............................3 二、程序源代码.................................3-18 三、程序运行结果...............................19 四、课程设计总结报告....
吃豆子vc  课程设计
吃豆子vc 课程 面向对象方法及程序设计 课程设计报告 题目: 吃豆子游戏 分 组: 第17组 组员姓名:周俊晨、白增垚、武春晓 班 级:计本1203班 指导教师:刘通 完成日期: 2014年 6 月 20 日 1 目录 一、游戏功能描述...............................3 二、程序源代码.................................3-18 三、程序运行结果...............................19 四、课程设计报告...........................20 2 一、游戏功能描述 (一)设计目的: 实现小时候经典PC游戏,吃豆子,练习基础JAVA基础技能。完成课程设计。 (二)设计要求: 1..基本实现玩家躲避怪物,并且吃掉所有豆子的所有功能。 2.满足人们需求加入个性化效果,实现画面简洁.美观.有吸引力。 3.实现游戏的可靠性.安全性.完整性.灵活性。 (三)设计规则: 蓝色大嘴代表玩家,红色大头代表妖怪,白色小猪代表豆子。 玩家选择进入游戏会有6条生命,和怪物撞在一起牺牲一次直至游戏结束。 玩家需在地图里的迷宫里躲避怪物的同时吃完所有的豆子方可取胜,不限时间。 二、程序源代码 // zjcView.h : interface of the CZjcView class // ///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_ZJCVIEW_H__1345D381_A306_4542_BF88_AA50591204E3__INCLUDED _) #define AFX_ZJCVIEW_H__1345D381_A306_4542_BF88_AA50591204E3__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CZjcView : public CView { protected: // create from serialization only CZjcView(); DECLARE_DYNCREATE(CZjcView) 3 // Attributes public: CZjcDoc* GetDocument(); // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CZjcView) public: virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL // Implementation public: BOOL k; int x,y,h,s; char fangxiang; struct Q { int x; int y; }qiang[185]; struct D { int x; int y; int n; }dian[165]; struct G { int x; int x0; int y; 4 int y0; int n; }guai[12]; void clear(); void Clear(int i); void Qiang(); void Dian(); void Guaix(int j,int l,int f2); void Guaiy(int j,int l,int f2); void Guai (int j,int l,int f2,int f1); void Fangxiang(int i); virtual ~CZjcView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: //{{AFX_MSG(CZjcView) afx_msg void Onkaishi(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // debug version in zjcView.cpp inline CZjcDoc* CZjcView::GetDocument() { return (CZjcDoc*)m_pDocument; } #endif ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_ZJCVIEW_H__1345D381_A306_4542_BF88_AA50591204E3__INCLUDED_ 5 ) // CZjcView IMPLEMENT_DYNCREATE(CZjcView, CView) BEGIN_MESSAGE_MAP(CZjcView, CView) //{{AFX_MSG_MAP(CZjcView) ON_COMMAND(ID_kaishi, Onkaishi) ON_WM_TIMER() ON_WM_KEYDOWN() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CZjcView construction/destruction CZjcView::CZjcView() { // TODO: add construction code here k=FALSE; //各种数据的初始化 x=y=50; h=s=0; fangxiang=37; for(int i=0;i<185;i++) { qiang[i].x =qiang[i].y=0; } for(i=0;i<12;i++) { guai[i].n =0; } guai[1].x =guai[1].x0=250; guai[1].y=guai[1].y0=350; //怪物初始坐标设置 guai[2].x =guai[2].x0=450; guai[2].y=guai[2].y0=350; 6 guai[3].x =guai[3].x0=200; guai[3].y=guai[3].y0=250; guai[4].x =guai[4].x0=50; guai[4].y=guai[4].y0=150; guai[5].x =guai[5].x0=250; guai[5].y=guai[5].y0=250; guai[6].x =guai[6].x0=50; guai[6].y=guai[6].y0=550; guai[7].x =guai[7].x0=1000; guai[7].y=guai[7].y0=550; guai[8].x =guai[8].x0=700; guai[8].y=guai[8].y0=250; guai[9].x =guai[9].x0=850; guai[9].y=guai[9].y0=300; guai[10].x =guai[10].x0=1000; guai[10].y=guai[10].y0=400; guai[11].x =guai[11].x0=1250; guai[11].y=guai[11].y0=150; } CZjcView::~CZjcView() { } BOOL CZjcView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CZjcView drawing void CZjcView::OnDraw(CDC* pDC) { CZjcDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if(k==FALSE) //说明界面的设置 { pDC->TextOut (300,200,"游戏说明:"); pDC->TextOut (300,300," 你有6条命且游戏途中不要改变窗口大小"); pDC->TextOut (300,400," 点击“菜单”选项的“开始”开始游戏"); } } 7 ///////////////////////////////////////////////////////////////////////////// // CZjcView printing BOOL CZjcView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CZjcView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CZjcView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CZjcView diagnostics #ifdef _DEBUG void CZjcView::AssertValid() const { CView::AssertValid(); } void CZjcView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CZjcDoc* CZjcView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CZjcDoc))); return (CZjcDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CZjcView message handlers void CZjcView::Onkaishi() 8 //开始菜单的设置 { // TODO: Add your command handler code here k=TRUE; clear(); Qiang(); Dian(); //CDC *pDC=GetDC(); //OnDraw( pDC); SetTimer(1,500,NULL); SetTimer(2, 10,NULL); } void CZjcView::clear() //清除说明的函数 { CDC *dc=GetDC(); CRect r; CBrush b(dc->GetBkColor ()); GetClientRect(&r); dc->FillRect (&r,&b); } void CZjcView::Clear(int i) //怪物设置时用到的清除函数 { CDC *pDC=GetDC(); CDC dc; CBitmap b; dc.CreateCompatibleDC (pDC); for(int j=1;j<168;j++) if(guai[i].x==dian[j].x &&guai[i].y==dian[j].y) break; if(dian[j].n ) b.LoadBitmap(IDB_BITMAP8); else b.LoadBitmap(IDB_BITMAP2); 9 dc.SelectObject(&b); pDC->BitBlt(guai[i].x,guai[i].y,50,50,&dc,0,0,SRCCOPY); } void CZjcView::Qiang() //墙壁的建立 { int q[13][27]= { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,0,0,0,0,1,1,0,1}, {1,1,0,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0,1,1,0,1,0,1}, {1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1}, {1,0,1,1,0,1,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,1,0,0,1,1}, {1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,1,0,1,1,1}, {1,0,1,0,1,0,1,1,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,1,0,1}, {1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1}, {1,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1}, {1,0,1,0,0,0,1,1,1,1,1,1,1,0,1,1,0,0,1,0,0,1,1,1,0,1,1}, {1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, }; int i,j,Q; i=j=Q=0; CDC *pDC=GetDC(); CDC dc; CBitmap b1; dc.CreateCompatibleDC (pDC); b1.LoadBitmap(IDB_BITMAP1); dc.SelectObject(&b1); for(i=0;i<13;i++) for(j=0;j<27;j++) 10 if(q[i][j]) { pDC->BitBlt(50*j,50*i,50,50,&dc,0,0,SRCCOPY); qiang[Q].x =50*j; qiang[Q].y =50*i; Q++; } } void CZjcView::Dian() //豆子的建立以及第一幅人 物图 { int q[13][27]= { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,0,0,0,0,1,1,0,1}, {1,1,0,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0,1,1,0,1,0,1}, {1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1}, {1,0,1,1,0,1,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,1,0,0,1,1}, {1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,1,0,1,1,1}, {1,0,1,0,1,0,1,1,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,1,0,1}, {1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1}, {1,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1}, {1,0,1,0,0,0,1,1,1,1,1,1,1,0,1,1,0,0,1,0,0,1,1,1,0,1,1}, {1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, }; int i,j,Q; i=j=Q=0; CDC *pDC=GetDC(); CDC dc; CBitmap b1,b2; dc.CreateCompatibleDC (pDC); b1.LoadBitmap(IDB_BITMAP2); dc.SelectObject (&b1); for(i=1;i<12;i++) 11 for(j=1;j<26;j++) if(!q[i][j]) { pDC->BitBlt(50*j,50*i,50,50,&dc,0,0,SRCCOPY); dian[Q].n =0; dian[Q].x =50*j; dian[Q].y =50*i; Q++; } b2.LoadBitmap(IDB_BITMAP3); dc.SelectObject (&b2); pDC->BitBlt(50,50,50,50,&dc,0,0,SRCCOPY); } void CZjcView::Guaix(int j,int l,int f2) //X方向怪物的设置 //ID(j),距离(l), //起始移动方向(f2):1向下或向右,-1向左或向上 { if(guai[j].n==0) { Clear(j); guai[j].x+=50*f2; if(guai[j].x==guai[j].x0+l*f2) guai[j].n=1; } else { Clear(j); guai[j].x+=-50*f2; if(guai[j].x==guai[j].x0) guai[j].n=0; 12 } } void CZjcView::Guaiy(int j,int l,int f2) //Y方向怪物设置 { if(guai[j].n==0) { Clear(j); /*if(x==guai[i].x+m &&y==guai[i].y+n ) {x=50;y=50;}*/ guai[j].y+=50*f2; if(guai[j].y==guai[j].y0+l*f2) guai[j].n=1; } else { /*if(x==guai[i].x+m &&y==guai[i].y+n ) {x=50;y=50;}*/ Clear(j); guai[j].y+=-50*f2; if(guai[j].y==guai[j].y0) guai[j].n=0; } } void CZjcView::Guai(int j,int l,int f2,int f1) //X,Y方向怪物的选择函数 //ID(j),起始位置坐标(m,n),距离(l), //起始移动方向(f2):1向下或向右,-1向左或向上 //移动路径方向(f1):1表示x轴0表示y轴, { if(f1==1) Guaix(j, l, f2); if(f1==0) Guaiy(j, l, f2); 13 } void CZjcView::OnTimer(UINT nIDEvent) //设置怪物的移动属 性 { // TODO: Add your message handler code here and/or call default switch(nIDEvent) { case 1: { CDC *pDC=GetDC(); CDC dc; CBitmap b,b1; CRect r; dc.CreateCompatibleDC (pDC); b.LoadBitmap(IDB_BITMAP7); dc.SelectObject (&b); Guai(1,250,1,1); //1到 11号怪物方向及距离设置 pDC->BitBlt(guai[1].x,guai[1].y,50,50,&dc,0,0,SRCAND); Guai(2,300,-1,0); pDC->BitBlt(guai[2].x ,guai[2].y,50,50,&dc,0,0,SRCAND); Guai(3,150,-1,0); pDC->BitBlt(guai[3].x ,guai[3].y,50,50,&dc,0,0,SRCAND); Guai(4,400,1,0); pDC->BitBlt(guai[4].x ,guai[4].y,50,50,&dc,0,0,SRCAND); Guai(5,300,1,0); pDC->BitBlt(guai[5].x ,guai[5].y,50,50,&dc,0,0,SRCAND); Guai(6,1100,1,1); pDC->BitBlt(guai[6].x ,guai[6].y,50,50,&dc,0,0,SRCAND); Guai(7,500,-1,0); pDC->BitBlt(guai[7].x ,guai[7].y,50,50,&dc,0,0,SRCAND); Guai(8,200,-1,0); pDC->BitBlt(guai[8].x ,guai[8].y,50,50,&dc,0,0,SRCAND); Guai(9,150,1,0); pDC->BitBlt(guai[9].x ,guai[9].y,50,50,&dc,0,0,SRCAND); Guai(10,250,1,1); 14 pDC->BitBlt(guai[10].x ,guai[10].y,50,50,&dc,0,0,SRCAND); Guai(11,250,-1,1); pDC->BitBlt(guai[11].x ,guai[11].y,50,50,&dc,0,0,SRCAND); for(int j=0;j<165;j++) //胜利判定 { if(!dian[j].n) break; AfxMessageBox ("YOU WIN,点击确定重新开始"); KillTimer (1); KillTimer (2); s=0; Onkaishi(); } break; } case 2: for(int i=1;i<12;i++) //死亡判定 死后会回到原点 if(x==guai[i].x &&y==guai[i].y) { x=y=50; s++; CDC *pDC=GetDC(); CDC dc; CBitmap b; b.LoadBitmap (IDB_BITMAP3); dc.CreateCompatibleDC (pDC); dc.SelectObject (&b); pDC->BitBlt(x,y,50,50,&dc,0,0,SRCAND); dc.DeleteDC (); pDC->DeleteDC (); b.DeleteObject (); if(s>4) //命数设定 { AfxMessageBox ("你死了,点击确定重新开始"); KillTimer (1); 15 KillTimer (2); s=0; Onkaishi(); } break; } } CView::OnTimer(nIDEvent); } void CZjcView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //人物移动设置,移动的同时消去豆子 { // TODO: Add your message handler code here and/or call default int t; fangxiang=nChar; CDC *pDC=GetDC(); CRect r; CBrush brush(pDC->GetBkColor ()); r.SetRect (x,y,x+50,y+50); for(int i=1;i<168;i++) if(x==dian[i].x &&y==dian[i].y) {dian[i].n =1;break;} pDC->FillRect (&r,&brush); switch(nChar) //上下左右对应设置 { case VK_LEFT: { for(t=0;t<185;t++) if(x==qiang[t].x+50 &&y==qiang[t].y) {h=1;Fangxiang(h);break;} if(!h) {x-=50;Fangxiang(h);} else h=0; break; 16 } case VK_RIGHT: { for(t=0;t<185;t++) if(x==qiang[t].x-50&&y==qiang[t].y) {h=1;Fangxiang(h);break;} if(!h) { x+=50;Fangxiang(h);} else h=0; break; } case VK_UP: { for(t=0;t<185;t++) if(y==qiang[t].y+50 &&x==qiang[t].x) {h=1;Fangxiang(h);break;} if(!h) {y-=50;Fangxiang(h);} else h=0; break; } case VK_DOWN: { for(t=0;t<185;t++) if(y==qiang[t].y-50 &&x==qiang[t].x) {h=1;Fangxiang(h);break;} if(!h) {y+=50;Fangxiang(h);} else h=0; break; } } 17 CView::OnKeyDown(nChar, nRepCnt, nFlags); } void CZjcView::Fangxiang(int i) //人物移动时改变头像方向的函数 { CDC dc; CDC *pDC=GetDC(); CBitmap b1; dc.CreateCompatibleDC (pDC); if(!i) { CRect r; CBrush brush(pDC->GetBkColor ()); r.SetRect (x,y,x+50,y+50); pDC->FillRect (&r,&brush); } if(fangxiang==37) b1.LoadBitmap(IDB_BITMAP5); if(fangxiang==39) b1.LoadBitmap(IDB_BITMAP3); if(fangxiang==38) b1.LoadBitmap(IDB_BITMAP6); if(fangxiang==40) b1.LoadBitmap(IDB_BITMAP4); dc.SelectObject (&b1); pDC->BitBlt(x,y,50,50,&dc,0,0,SRCCOPY); } 18 三、程序运行结果 初始游戏进入画面: 游戏画面: 19 四、课程设计总结报告 最初进行设计的时候,没有一点头绪,翻出课件来看重新学习,经与同学讨论,终于弄清了进程条的设置。而对于编程,是最庞大又棘手的一块,那是忘得更多了,于是把课本和图书馆借来的参考书重新针对性的学了一次,遇到难处先是仔细的思考然后在向同学请教。 可以说开始的那么几天都是在查找资料,翻阅相关的书籍。在最后添加代码的时候还有一些程序不知道怎么写。于是,于是又利用了网络资源,收集里了一些,经分析、查询资料仍有一些地方看不懂。感觉程序执行某个功能,将这段代码添加到对应位置。 所有的代码添加完后,运行、调试,开始会出现了很多很多的错误。逐条进行修改,再进行运行和调试,有时候错误看不懂,就找同学商量。也不知道错了多少次,改了多少次,终于最后做出了完美的游戏界面。终于完成了设计。 在这次课程设计过程中,我的编程有了很大的提高,虽然有时候自己没有思路,但是可以借鉴别人的代码,看别人设计的思路,理解的同时自己小试一下也可以编出来,所以 凡事不能被困难吓倒,只要有开始,去尝试。就会有意想不到的收获。 其次,在运行、调试过程中也学到了很多,以前编程最怕的就是报错,尤其是错误多了的时候,感觉毫无头绪直接头大,但是编程不可能不出错,报错,只要逐一对付,然后细心研究改正,终究一切问题都会迎刃而解的,所以遇到问题,不能急,要心平气和的去应对,才能把所学的只是真正用于实际,这不得不说正是我们当代大学生所严重缺乏的,以后的学习中更应注意。 20 21
/
本文档为【吃豆子vc 课程设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索