徐州师范大学物电学院
课程设计报告
课程名称: 计算机程序设计实训
题 目: AngryBirds记忆翻牌游戏
专业班级: 11物41
学生姓名: 杨国栋
学生学号: 11224024
日 期: 2013.12.28
指导教师: 赵纪平
物电学院教务部印制
说明:
1、报告中的第一、二、三项由学生在课程设计开始前填写,由指导教师指导并确认签字。
2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩,并填写成绩评定表。
3、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。答辩小组成员应由2人及以上教师组成。答辩后学生根据答辩情况填写答辩记录表。
4、报告正文字数一般应不少于3000字,也可由指导教师根据本门课程设计的情况另行规定。
5、平时表现成绩低于6分的学生,取消答辩资格,其该课程设计成绩按不及格处理。
6、课程设计完成后,由指导教师根据完成情况写出总结。
7、此表格式为徐州师范大学物理与电子工程学院提供的基本格式,指导教师可根据本门课程设计的特点及内容做适当的调整。
指导教师签字:
年 月 日
目 录
摘 要 ………………………………………………………………………………………,
Abstract …………………………………………………………………………………,...
1 绪论…………………….……………………………………. ………………………..
1.1 设计背景………………………………………………………………………………,
1.2 设计目的…………………………………………………..………………………….,.
1.3 设计意义………………………………………………………………………………..,
1.4 需解决的问题…………………………………………………………………………,,,
1.5 风险评估 ………………………………………………………………………………..
2 设计方案简述 ………………………………………..………………………………..
2.1 需求分析…………………………………………………..………………………….…
2.2 市场分析…………………………………………………..………………………….…
2.3 系统总体设计……………………………………………..………………………….…
2.4 各子类系统设计………………………………………………………………………..
3 详细设计……………………………………………………………..…………………..
3.1 类与结构…………………………………………………..………………………….…
3.1 系统生成的类…………………………………………..………………………….……
4 设计结果及分析………………………………………………..…….………………...
4.1 测试总结……………………………………….………………………………..………
4.2 测试记录…………………………………………………..………………………….…
4.3 技术难点…………………………………………………………………………………
5总 结 ……..…………………………………………………..………………………….…
参考文献 …….………………..………………………………..………………………….…
摘 要
记忆翻牌游戏的设计能有效的是玩家在休闲时间达到放松的目的,在深入的学习了vc++实用教程后,同时,在对休闲游戏市场的分析,用其MFC做一个此类的小游戏,不仅是对自己学习的检验,使自己得到锻炼的机会,增强编程能力,为以后找工作奠定扎实的基础。
关键词:记忆翻牌;游戏;编程;MFC。
Abstract
Memory flop game design can effectively be players in the leisure time to relax purpose ,in-depth study of the vc++ ,After the practical course, while in the casual game market analysis, with its MFC to do a kind of small game is not only a test of their own learning, so that they can receive training opportunities to enhance the programming ability to lay a solid foundation to find a job for the future.
Keywords:Memory flop game;Game;Programming ;MFC。
1 绪论
1.1 设计背景
在大多数小组都选择计算器等一些应用程序的情况下,我选择了制作游戏,而在休闲游戏中,翻牌类游戏涉及较少,所以我选择记忆翻牌游戏软件。由于市场上的翻牌游戏大体都是一样的框架,所以我做出几点创新:1.进行人机对战。2.增加难度选择。加强了游戏的耐玩性,增强了市场上的竞争能力。在刚接触MFC的情况下,依然选择了并不熟悉翻牌游戏的制作,更多的是因为希望迎接挑战。
1.2 设计目的
“记忆翻牌游戏”将重点放在放松精神和训练短时记忆力上,以期获得大众的青睐,缓解大众的疲劳,是大众得到休闲娱乐,同时检验自己对于vc++的学习,增强自己的编程能力,达到实战的目的。
1.3 设计意义
目前市面上有不少类似的小游戏,需要有独到之处才能吸引受众的眼球。选择了目前热度较高的“愤怒的小鸟”作为整个游戏的背景,辅以一些欢快的音乐。只要令玩家放松,休闲,则增强市场竞争力。
1.4 需解决的问题
在开发的过程中,将会碰到几个难点:
1.为避免玩家很快玩腻,设置了难度等级;
2.为了给游戏增加挑战性,设置了电脑AI玩家,并且电脑会具备记忆能力;
3.对于翻开相同的牌时,设计把它消除。
对于第一个难点:需要响应玩家在对话框中点击的按钮消息,在绘制区域的时候选择矩形的排列和个数。
对于第二个难点:需要设计在玩家点击翻牌指令后,插入一个延时函数,再获得一张卡片的坐标,存入一个用于记录计算机翻过的牌的数组,并对之前存入数组的牌逐个检索,分别对有或没有与此次翻牌内容相同的牌进行处理。有相同的牌之后将会在下次选择这两张牌。
对于第三个难点:要能够比较两次翻牌的结果,并能分别处理,是消除还是重新绘制。
1.5 风险评估
此类小游戏的市场竞争较为激烈,因而此软件的推出可能会陷入竞争利润的泥潭,埋没在大量同类游戏之中。同时,此游戏较为简单易玩,同时具有很强的吸引力,可能会导致部分青少年沉迷其中,消耗大量宝贵时间,耽误学业
2 设计方案简述
2.1 需求分析
目前市面上有不少类似的小游戏,所以吸引用户就必须靠程序的特别之处。因而我们选择了目前热度较高的“愤怒的小鸟”作为整个游戏的背景,并配以轻松欢快的音乐以取得放松的效果,从而满足用户在闲余时间放松精神的需求。
2,2 市场分析
随着工作和生活压力的增大,人们的精神始终处于高度紧张状态,疲劳感和记忆力衰退顺之成为大众当今面临的几个主要问题之一,因而我们这个“记忆翻牌游戏”将重点放在放松精神和训练短时记忆力上,以期获得大众的青睐。
2.3 系统总体设计
游戏能够实现人机互动,玩家通过点击翻牌与电脑AI进行比赛。在此游戏中实现了难度等级的设定,玩家可以根据自己的喜好选择牌堆的数量。游戏操作中,实现了翻牌数量最大为两张,并在翻出相同的牌之后进行消去,不符合时翻回的功能。在整个游戏过程中进行积分统计,在消去所有的牌之后将玩家与电脑AI的得分比较,决出胜负。整个游戏精心设计了好看的画面和欢快的音乐,有着更好的休闲娱乐的效果。
24 各子系统设计
1.窗口显示:显示选择界面,游戏界面(牌的翻转、图片、文字与背景),游戏结束后结果界面。
2.Manager管理:构造并显示牌堆,AI智能翻牌,判断翻牌是否消除,得分统计,判断结果。
3.音乐效果。
3 详细设计
3.1类与结构
1.class Manager //游戏整体管理类
{
public:
void ShowCurrentGUI(CDC *pDC,CWnd *pWnd);//显示得分
int SingleCardShow(CDC *pDC,CPoint point,CWnd *pWnd);//显示牌面
int GetCardNums();//获取牌的序号
int GetColumns();//获取牌的列号
int GetRows();//获取牌的行号
Manager():rows(0),columns(0),CardNums(0),CardDouble(NULL),pCardActiveList(NULL),pCardList(NULL),pRobotRememberList(NULL),DoubleFlag(0),MatchedCardPairNums(0),MismatchedCardPairNums(0),Created(false),ClientScore(0),IsRobotChance(false){}//构造函数
void Create(int x,int y);//根据玩家选择生成牌堆结构
virtual ~Manager();//析构函数
bool RobotDoMatch(CDC *pDC,CWnd *pWnd);//电脑AI进行选牌
bool IsRobotChance;//判断电脑是否选牌
private:
void ShowResult();//显示结果
void GetRand(int down,int up,int &n);//获取随机翻牌的随机数
int ClientScore;//玩家得分
void DrawRect(CDC *pDC,bool active,int column=0,int row=0);
//显示单张牌区域
bool IsCardMatch(Card *pCardDouble);//判断是否匹配
int GetRand();//获取随机数,范围为[1,CardNums)
bool Created;//是否已经构造游戏
int MatchedCardPairNums;//已匹配牌的号码
int MismatchedCardPairNums;//未匹配牌的号码
int DoubleFlag;//连续点击不同图片的个数
Card *pCardList;//记录已翻出的牌
Card *pCardActiveList;//记录正在翻出的牌
Card *pRobotRememberList;//电脑AI记录翻开的牌
Card *CardDouble;//记录进行比较配对的牌
int rows;//行号
int columns;//列号
int CardNums;//牌号
};
2.class NewDialog : public CDialog//窗口类,继承CDialog类
{
public:
int columns;//列号
int rows;//行号
NewDialog(CWnd* pParent = NULL);//构造函数
protected:
CBrush m_brush;//画刷
DECLARE_MESSAGE_MAP()
};
3.struct Card
{
Card():row(0),column(0),ID(0){}
void SetPrimitive(){row=0;column=0;ID=0;}//设置为翻转原始图片
void SetDisappear(){row=0;column=0;ID=-1;}//设置以翻转消除图片
int row;//行号
int column;//列号
int ID;//临时图片的ID
};
3.2 系统生成的类
4. class CAboutDlg : public CDialog//继承CDialog生成的CAboutDlg类
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
5. class CMainFrame : public CFrameWnd//继承CFrameWnd生成的CMainFrame类
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // control bar embedded members
//CStatusBar m_wndStatusBar;
//CToolBar m_wndToolBar;
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
6. class CPairClientApp : public CWinApp//继承CWinApp生成的CPairClientApp类
{
public:
CPairClientApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPairClientApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CPairClientApp)
afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
7. class CPairClientDoc : public CDocument//继承CDocument生成的CPairClientDoc类
{
protected: // create from serialization only
CPairClientDoc();
DECLARE_DYNCREATE(CPairClientDoc)
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPairClientDoc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CPairClientDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CPairClientDoc)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
8. class CPairClientView : public CView//继承CView生成的CPairClientView类
{
protected: // create from serialization only
CPairClientView();
DECLARE_DYNCREATE(CPairClientView)
// Attributes
public:
CPairClientDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPairClientView)
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:
Manager myManager;
virtual ~CPairClientView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CPairClientView)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnNewGame();
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam) ;
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool IsNewGame;
void DrawLineBG(CDC *pDC);
};
9. class CResultDialog : public CDialog//继承CDialog生成的CResultDialog类
{
// Construction
public:
void ShowDlg(CString result);
CResultDialog(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CResultDialog)
enum { IDD = IDD_DIALOG_RESULT };
CStatic m_result;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CResultDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CResultDialog)
virtual void OnOK();
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
CString result;
CBrush m_brush;};
4 设计结果及分析
4.1 测试记录
4.2 测试总结
总结的多次测试,有时并不是多大的错误,说不定只是一个字母或者符号的错,但就是这小小的一环却依然对整个程序有着很大的影响。因此,在编写程序时就变得无比小心,现在的小心是减少以后的工作量。问题是需要去寻找的,而测试也是对知识的考验,在测试时将知识与实践融汇,同时也学会了合作与科研的精神。在此才意识到测试的重要性,并对程序的制作的整个过程都学会了大胆创新,细致工作。
4.3 技术难点
1.电脑AI的编写:电脑要记住已经翻开的牌并将相同的牌翻出。
解决方法:参考一些有AI的程序,想出用数组存取坐标的方法,最后参考一些有AI的程序完善编写。
2.窗口的动画效果。
解决办法:参考一些书籍和网上的教程,解决了用控件显示动画效果的问题。
3.相同牌的消去效果。
解决办法:经过同学和老师的帮助,并结合不断调试的改进,成功完成了消去效果。
5 总结
在这一次课程设计中,虽然是各自为战,自己做自己的课题,但是,在实际中仍然是需要老师和同学的帮助的。第一次的一个人做一个课程设计,其一是这一块是比较新的知识额,需要在完成课题之前要大量参考文献,因为每一个课题有其自己鲜明的特点;其二是限于刚刚上手MFC,有许多代码上的不熟悉没时间也不可能在刚刚开始学习时就完全解决,必须一边写代码,一边借鉴一些功能相仿的程序的写法,有的甚至还要与所做程序同样含有某一类功能,如图片处理。还有,第一次编程还要注意各模块的借口问题,某一模块的函数是否能满足别的模块的功能,如通过重载drawrect函数实现最开始的初始化牌堆和每次点击牌的显示结果。还有其他一些问题在整个过程中不断出现,都需要去解决。
但是经历过这样的实践后,也收获了很多东西。比如专研精神:如何在庞大的数据资料面前寻找适合自己的材料。还有学习新知识的能力,学会走出课堂,在没有老师的帮助下自主自学所需的知识,这也是大学生必须掌握的基本素质之一。
关于我的程序,经过多方的努力。实现了一个翻牌记忆游戏所具备的几乎所有的功能。如传统的难度选择(牌数的多少)、点击翻牌、同类消去、计分、胜负判断等。特别加入的电脑AI系统能够很大程度上与传统的单人翻牌游戏区别出来,实现了人类与计算机的记忆力的比拼,增加了趣味和挑战性,这也作为本游戏的一大亮点和难点所在。由于时间不足,程序还有很多可以提升的空间,如现代游戏十分常见的完成等级评定、更加绚丽的动态效果、奖励道具等等。还有待进一步开发。
参考文献
1.郑阿奇. Vc++实用教程(第四版).电子工业出版社,2011
2.孙鑫. VC++深入详解.电子工业出版社.
3.侯俊杰. 深入浅出MFC.华中科技大学出版社. 2001
4.陈元琰等.vc++6.0实用技术与案例.清华大学出版社.2001
答辩记录表
成绩评定表
学生姓名:杨国栋 学号 11224024 班级: 11物41
课程设计总结