吃豆子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