C++ 俄罗斯方块小游戏论文
X X X X 大 学
《C++语言程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
》课程设计(论文)
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目: 俄罗斯方块小游戏
院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 起止时间:
课程设计(论文)任务及评语 院(系): 教研室: 学 号 学生姓名 专业班级
课程设计
(论文)俄罗斯方块小游戏 题目
程序设计的任务与要求:
(1).掌握面向对象程序设计语言C++的基本语法 课(2).掌握C++面向对象设计的思想
程(3).掌握VC++6.0与DEV C++ 开发工具的使用 设
计 (4). 运用
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
C++
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
设计应用程序 )
论
文设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。)
任正确地完成上述内容,规范完整地撰写出设计报告。 务
指
导 教
师
评 语
及成绩: 指导教师签字: 成
绩
年 月 日
xxxx 大 学 课 程 设 计 说 明 书(论 文)
目 录
第1章 课程设计目的与要求 ................................................... 1
1.1 设计目的 ............................................................ 1
1.2实验环境 ............................................................ 1
1.3预备知识 ............................................................ 1
1.4设计要求 ............................................................ 1 第2章 课程设计内容 ......................................................... 2
2.1 课题描述 ............................................................ 2
2.2 系统设计 ............................................................ 2
2.2.1功能分析 ...................................................... 2
2.2.2面向对象设计 .................................................. 2
2.2.2类成员描述 .................................................... 7
2.3程序实现 ............................................................ 7
2.3.1源码分析 ..................................................... 10
2.3.2运行结果 ..................................................... 10 第3章 总结 ................................................................ 16 参考文献 ................................................................... 17
xxxx 大 学 课 程 设 计 说 明 书(论 文)
第1章 课程设计目的与要求
1.1 设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。 通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训(
练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)掌握面向对象程序设计的方法。
(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境
硬件要求能运行Windows 操作系统的微机系统。C++语言应用程序开发软件使用:VC++ 系统,或其他C++语言应用程序开发软件。
1.3预备知识
熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。 1.4设计要求
1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房
管理制度
档案管理制度下载食品安全管理制度下载三类维修管理制度下载财务管理制度免费下载安全设施管理制度下载
,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。
1
xxxx 大 学 课 程 设 计 说 明 书(论 文)
第2章 课程设计内容
2.1 课题描述
本游戏程序玩家人数应为一人,游戏区域上方不断地出现预定义形状的方块,下坠方块可以通过旋转改变其显示形状,并且不断地往下坠,直到它接触到游戏区域底部或者其它之前已经累叠起的下坠方块。当一个下坠方块到达游戏区域底部或者接触到其他之前已经累叠起的下坠方块后,其位置则确定下来并占有该空间的位置区域。
当游戏区域的某一行被下坠方块完全填充,则消除该行的所有下坠方块,垒在其上的方块将按照一定的算法掉下代替改行空间。游戏的结束是以下坠方块的顶部到达游戏区域顶部作为判断依据。
在游戏区域产生一个新的方块的一瞬间,立即产生下一个下坠方块的形状并在提示区域的左上方有预先提示。同时,在游戏界面的右下方,将显示玩家所得的分数,已经消除的行数以及游戏的级别。每当游戏玩家成功消除一行方块时,将按照一定的算法计算出所得分数,并修改游戏状态区域的分数和行数的数值。另外,游戏可提供不同的游戏级别,用户可根据自己的兴趣选择相应的级别。游戏级别的信息也将显示在游戏状态区域。
本游戏通过键盘方向键操作。在游戏过程中,当游戏玩家按up键时,则改变方块的形状;按right键时,则方块向右移一个单元;按left键时,则方向块左移一个单元;当按down键时,加速下落。当方块堆满方框顶是游戏结束,游戏提示玩家是否继续。
2.2 系统设计
本程序由两个同学共同完成,具体分工如下:
1.共同部分:两个人共同确定整体设计阶段的程序框架和具体实现的功能,确定系统功能模块。
2.本人任务:完成方块移动和变形中所做的一些判断、显示方块、图形更新和其他等工作。
2.2.1功能分析
本游戏通过键盘方向键操作。在游戏过程中,当游戏玩家按up键时,则改变方块的形状;按right键时,则方块向右移一个单元;按left键时,则方向块左移一个单元;
2
xxxx 大 学 课 程 设 计 说 明 书(论 文) 当按down键时,加速下落。
从键盘输入的各按键的代码分别为:ESC 0x011b、UP 0x4800、DOWN 0x5000、LEFT
0x4b00、RIGHT 0x4d00、SPACE 0x3920、Y0x1579、N0x316e。 2.2.2面向对象设计
外部功能模块图
图2.3.2 外部功能模块图
3
xxxx 大 学 课 程 设 计 说 明 书(论 文) 主函数功能图
图2.3.3外部功能模块图
4
xxxx 大 学 课 程 设 计 说 明 书(论 文)
主函数流程图
开始界面
选择速度 即游戏级别
开始游戏
产生两个随机的图形,一个是当
前游戏图形,一个是下一个图形
方块的移动及变形 否 判断是否到
底
是
消行操作
否 到达底部
游戏是否结
束
是
游戏结束处理
游戏结
束
图2.3.4 主函数流程图
5
xxxx 大 学 课 程 设 计 说 明 书(论 文)
图形变换的N-S框图
定义i,j,count,并把count初始
化为0
i <= 19
j <= 13
方块本身的坐标加上动点
的坐标等于背景的坐标
是 否
back[i][j] = 1
i <= 19
int flag = 1
j <= 13
back[i][j] != 1
是 否
flag = 0
if flag == 1 是 否 进行消行操作
图2.3.5图形变换功能的N-S框图
6
xxxx 大 学 课 程 设 计 说 明 书(论 文)
2.2.2类成员描述
UML类图
图2.3.1类的UML图
2.3程序实现
在该程序中,把7中方块的总共19不同变形都用结构体储存下来了,前面四种为一种形状的不同变形,第5种到第六种为一种形状的不同变形,第七种为正方形方块,没有变形,第八到第九为一种形状的不同变形,第十到十一也为一种形状的不同变形,十二到十五和十六到十九分别为两种方块的不同变形。程序中把方块定义为参数t,当按
7
xxxx 大 学 课 程 设 计 说 明 书(论 文)
上键时执行t++,即变化为下一种情况,但是会遇到一个问题,就是假如t为四的时候
再做t++就会变成五,但是五不是前面四种形状中的一种变形,不符合要求,所以我用
一个判断语句做个判断,即if(t1 == 3) t1 = 0;,该语句的意思是,假如t1等于3
的时候就把t1赋值为0,不让它继续加导致变成另外一种类型的方块;下面的依次类推,
如果t1不等于3、5、6、8、10、14、18等就可以直接执行t++了。
方块变形的代码如下:
if(t1 == 3&&check_change( p, ps[0])) t1 = 0;
else if(t1 == 5&&check_change( p, ps[4])) t1 = 4;
else if(t1 == 6) t1 = 6
else if(t1 == 8&&check_change(p, ps[7])) t1 = 7;
else if(t1 == 10&&check_change( p, ps[9])) t1 = 9;
else if(t1 == 14&&check_change(p, ps[11])) t1 = 11;
else if(t1 == 18&&check_change( p, ps[15])) t1 = 15;
else if(check_change( p, ps[t1+1])) t1++; break;
上面代码中有函数check_change( p, ps[t1+1]),该函数是做一个判断,在下面讲
会讲到。
方块移动和变形中所做的一些判断
把移动、变形放到一个死循环中,用_kbhit()判断是否有键盘消息,用_getch()接
收键盘消息,其中0x50、0x4B、0x4d、0x48分别代表下键、左键、右键和上键,32代
表按空格。接受到从键盘输入的这些消息后,就做该消息所对应的操作。每做一次就会
清屏一次,并显示出来它做过该操后的效果。
其中还需要注意的就是移动的时候要判断是否到达边缘,到达边缘之后就不能继续
移动了,上面代码中判断到达边缘的语句有:
back[ps[t1].co[0]+p.i][ps[t1].co[1]+p.j - 1] == 0 && back[ps[t1].co[2]+
p.i][ps[t1].co[3]+p.j - 1] == 0 && back[ps[t1].co[4]+ p.i][ps[t1].co[5]+p.j -
1] == 0 && back[ps[t1].co[6]+ p.i][ps[t1].co[7]+p.j – 1等;其他大概都差不多。
还有一个问题不容易被察觉,就是方块贴到方框边缘后变形的问题,在这儿也要做
一个判断才行,要判断该形状变形后的形状是否超越过了边缘,如果没有做这个判断的
话,方块变形后就会挂在方框边缘上,因为方框的边缘是赋值为1的,变形后移动的时
候它会判断背景是否为1,如果为1的话便不会再移动了,所以图形块就挂在上面移动
不了了。关于判断变形后的图形是否越界的函数是:
其中传递进来的一个参数是t1+1,即当前图形的下一个形状,if中的条件就是判断
当前图形的下一个形状是否挨到边缘,是的话就返回0,没有就返回1。
8
xxxx 大 学 课 程 设 计 说 明 书(论 文)
接下来便是判断是否到底,然后再进行输出或刷新。
显示方块
用一个双循环来输出?,用s1.co[0]+p.i == i && s1.co[1]+p.j == j来判断,即用当前方块的坐标加上动点的坐标的值是否与当前的行或列相等,相等的时候就输出一个?,不相等的时候输出空格。在外循环内写两个内循环,一个用于现实当前正在下落的方块,另一个用来显示下一个将要显示的方块。第二的内循环把jj初始化为-1是为了不让其与边框贴太近导致看不清,而用s2.co[0]+4 == i和 s2.co[1]+1 == jj中间加了4和1是为了让上下左右都有一定的空间让游戏界面更加美观,在这个循环里做一个判断然后显示分数和游戏级别。
图形的更新
方块每移动一个坐标的位置,图形都会更新一次,其中的循环和显示方块中的循环一样,只是执行的内容改变了,在判断方块的坐标加上动点的坐标是否等于背景的坐标后,就把该坐标的值赋值为一,当下一个图形移动到该图形处由于该图形的背景坐标为一,所以图形便会停止移动了。该工作做完后便判断是否要消行,判断消行也要用一个双循环,在外循环中定义一个标志flag并赋值为1,在内循环中判断,看是否有一个坐标处为0,如果有一个为0的话,就把flag的值改为0;该循环结束后就进行下一个内循环,先判断flag的值,值为1的话就进行消行操作,即把上面一行的值赋给下面一行。在更新这个函数的开始定义一个变量,用来记消去的行数,如果一次消去一行,分数就加上10,一次消去两行,分数加上30,一次消去三行,分数加上50,消去四行分数就加上100。在该函数中还要判断游戏是否结束,即是检查第一列的没行的开始一个坐标是否等于1,如果等于1方块累积到了顶端,游戏便结束了,在方框底端输出“Game over!!!”字样。该部分代码如下:
其他
在程序中的方块是随机产生的,用srand(time(NULL))做随机种子,然后用rand%19随机选取十九中图形的一种。程序中的system(“cls”)是用于清屏。在开始还有一个chioce函数,是用来游戏玩家根据自己的需要选择游戏级别的,在选择中要按照游戏中提示的来选择,否则将按默认的速度来处理。
9
xxxx 大 学 课 程 设 计 说 明 书(论 文)
2.3.1源码分析
部分代码如下:
// MainFrm.h : interface of the CMainFrame class
#if !defined(AFX_MAINFRM_H__2D3735C2_3728_4501_AD1F_0F3A8353615B__INCLUD
ED_)
#define AFX_MAINFRM_H__2D3735C2_3728_4501_AD1F_0F3A8353615B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//##ModelId=495DB15C0265
class CMainFrame : public CFrameWnd {
protected: // create from serialization only //##ModelId=495DB15C0281
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
//##ModelId=495DB15C0282
virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL
// Implementation
public:
//##ModelId=495DB15C0292
virtual ~CMainFrame();
#ifdef _DEBUG
//##ModelId=495DB15C0294
vi
10
xxxx 大 学 课 程 设 计 说 明 书(论 文)
rtual void AssertValid() const;
//##ModelId=495DB15C029F
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // control bar embedded members
//##ModelId=495DB15C02BF
CStatusBar m_wndStatusBar;
//##ModelId=495DB15C02CF
CToolBar m_wndToolBar;
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
//##ModelId=495DB15C02EE
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// 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()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
// !defined(AFX_MAINFRM_H__2D3735C2_3728_4501_AD1F_0F3A8353615B__INCLUDED_)
// aaaaView.h : interface of the CAaaaView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_AAAAVIEW_H__40B67261_C3F3_4CD4_AFED_6D287A0B1AE3__INCLUDED_)
#define AFX_AAAAVIEW_H__40B67261_C3F3_4CD4_AFED_6D287A0B1AE3__INCLUDED_
11
xxxx 大 学 课 程 设 计 说 明 书(论 文) #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 //##ModelId=495DB15C02FD typedef struct point /*点的坐标*/
{
int i;//纵坐标
int j;//横坐标
}point;
//##ModelId=495DB15C031C typedef struct shape /*形状单一状态的记录*/ {
int co[8];
}shape;
//##ModelId=495DB15C038A class CAaaaView : public CView
{
protected: // create from serialization only
//##ModelId=495DB15C039A CAaaaView();
DECLARE_DYNCREATE(CAaaaView)
// Attributes
public:
int t1, t2, level, speed, timeFlag;
//##ModelId=495DB15C03AA shape ps[19];
//##ModelId=495DB15C03B9 int back[21][15];
//##ModelId=495DB15D003F point p;
//##ModelId=495DB15D0043
lo
12
xxxx 大 学 课 程 设 计 说 明 书(论 文)
ng score;
//##ModelId=495DB15D004E
CAaaaDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAaaaView)
public:
//##ModelId=495DB15D005D
virtual void OnDraw(CDC* pDC); // overridden to draw this view
//##ModelId=495DB15D006D
virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected:
//##ModelId=495DB15D007D
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); //##ModelId=495DB15D008C
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
//##ModelId=495DB15D009C
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL
// Implementation
public:
//##ModelId=495DB15D00BB
void show(point p,shape s1,shape s2);
//##ModelId=495DB15D00CB
int check_change(point p,shape s);
//##ModelId=495DB15D00DA
void update(point p, shape s);//更新
//##ModelId=495DB15D00EA
int check_buttom(point p, shape s);
13
xxxx 大 学 课 程 设 计 说 明 书(论 文)
//##ModelId=495DB15D00FA
void move();
//##ModelId=495DB15D00FB
void nint();//画方框
//##ModelId=495DB15D0109
int _continue();
//##ModelId=495DB15D010A
virtual ~CAaaaView();
#ifdef _DEBUG
//##ModelId=495DB15D0119
virtual void AssertValid() const; //##ModelId=495DB15D011B
virtual void Dump(CDumpContext& dc) const; #endif
protected:
// Generated message map functions protected:
//{{AFX_MSG(CAaaaView)
//##ModelId=495DB15D0129
afx_msg void OnTimer(UINT nIDEvent); //##ModelId=495DB15D0139
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//##ModelId=495DB15D014A
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//##ModelId=495DB15D0167
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in aaaaView.cpp
inline CAaaaDoc* CAaaaView::GetDocument()
{ return (CAaaaDoc*)m_pDocument; } #endif
14
xxxx 大 学 课 程 设 计 说 明 书(论 文)
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
// !defined(AFX_AAAAVIEW_H__40B67261_C3F3_4CD4_AFED_6D287A0B1AE3__INCLUDED_)
2.3.2运行结果
15
xxxx 大 学 课 程 设 计 说 明 书(论 文)
第3章 总结
通过课程设计,培养了我的动手能力以及综合运用所学的C++语言基础理论,掌握了C++的基础知识,基本技能,进行程序分析和程序开发,提高在实际开发中解决问题的能力,达到了能够利用C++语言进行应用程序的规划,分析,设计和实施,更能进一步使我对这门语言有深刻的理解和更好的得到巩固,更能对我所学的知识得到检验。
这次课程设计基本上含盖了大学专科一年纪学习到的C 语言和这个学期所学习到的C++知识点,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程的风格也很重要,同学只关心程序运行的结果,而对程序代码的结构的良好丝毫不在意。这是非常不可取的,如果我们希望将来从事编程工作,在这一点上该引起足够的重视。这是严谨的态度,很重要~
C++的奥义当然是面向对象;但是掌握C++的语法并不代表就掌握面向对象的技术,这个世界上使用C++却不懂面向对象的人很多;C++仅仅是支持面向对象,也就是说他的语法包含面向对象的特点,但面向对象不是语言特质,而是一种思想;C不是面向对象的语言,但用C一样能写出具有面向对象思想的程序。
C++课程设计,我学会了把书本上的知识应用到了实际中来。虽然在这几周中有过挫折和坎坷,有的问题一直到了最后才被解决,但是我认为这未必就不是好事,这样能锻炼我的意志,磨练我的耐心,失败是成功之母,这话一点都没错。
16
xxxx 大 学 课 程 设 计 说 明 书(论 文)
参考文献
[1] 陆宗骐. C/C++图像处理编程. 北京:清华大学出版社,2005
北京:清华大学出版社,2005 [2] 钱能. C++程序设计教程.
[3] 杨祥金等. Windows程序设计教程. 北京:清华大学出版社,2007 [4] Peter Norton,Rob McGregor著. MFC开发Windows95/NT4应用程序. 孙凤英,魏军,叙京等译. 北京:清华大学出版社, 1988
[5] 周长发. 精通Visual C++图像编程. 北京:电子工业出版社,2000 [6] 向世明. Visual C++数字图像与图形处理. 北京:电子工业出版社,2002 [7] Charlie Calvert. C++Builder 应用开发大全. 徐科等译.北京:清华大学出版社,1999
[8] Donald E.Knuth. 计算机程序设计艺术(第三版)第1卷:基本算法. 苏运霖译.北京:国防工业出版社,2002
[9] 陆惠恩. 软件工程实践教程. 北京: 机械工业出版社, 2006 [10] 杨富国. Visual C++程序开发案例解析. 北京:北方交通大学出版社,2006 [11] 郑莉、董渊 编着 《C++语言程序设计》 北京:清华大学出版社,2007
17