C++课程设计报告.docx
《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(27页珍藏版)》请在冰点文库上搜索。
C++课程设计报告
重庆大学课程设计报告
课程设计题目:
GUI小游戏的设计与实现
学院:
计算机学院
专业班级:
网络1班
年级:
2011级
姓名:
费仁杰,胡吉乾,颜宵鹏
学号:
20115435,20115433,20115434
完成时间:
2013年1月3日
成绩:
指导教师:
杨广超
重庆大学教务处制
课程设计指导教师评定成绩表
学号:
20115435姓名:
费仁杰班级:
11网络工程1班
项目
分值
优秀
(100>x≥90)
良好
(90>x≥80)
中等
(80>x≥70)
及格
(70>x≥60)
不及格(x<60)
评分
参考标准
参考标准
参考标准
参考标准
参考标准
学习态度
15
学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作
学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务
学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作
学习态度尚可,能遵守组织纪律,能按期完成任务
学习马虎,纪律涣散,工作作风不严谨,不能保证设计时间和进度
技术水平与实际能力
25
设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合理、调查调研非常合理、可信
设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,文献引用、调查调研比较合理、可信
设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比较可信
设计基本合理,理论分析与计算无大错,实验数据无大错
设计不合理,理论分析与计算有原则错误,实验数据不可靠,实际动手能力差,文献引用、调查调研有较大的问题
创新
10
有重大改进或独特见解,有一定实用价值
有较大改进或新颖的见解,实用性尚可
有一定改进或新的见解
有一定见解
观念陈旧
论文(计算书、图纸)撰写质量
50
结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰
结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰
结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰
结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整
内容空泛,结构混乱,文字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰
指导教师评定成绩:
指导教师签名:
年月日
课程设计指导教师评定成绩表
学号:
20115433姓名:
胡吉乾班级:
11网络工程1班
项目
分值
优秀
(100>x≥90)
良好
(90>x≥80)
中等
(80>x≥70)
及格
(70>x≥60)
不及格(x<60)
评分
参考标准
参考标准
参考标准
参考标准
参考标准
学习态度
15
学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作
学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务
学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作
学习态度尚可,能遵守组织纪律,能按期完成任务
学习马虎,纪律涣散,工作作风不严谨,不能保证设计时间和进度
技术水平与实际能力
25
设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合理、调查调研非常合理、可信
设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,文献引用、调查调研比较合理、可信
设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比较可信
设计基本合理,理论分析与计算无大错,实验数据无大错
设计不合理,理论分析与计算有原则错误,实验数据不可靠,实际动手能力差,文献引用、调查调研有较大的问题
创新
10
有重大改进或独特见解,有一定实用价值
有较大改进或新颖的见解,实用性尚可
有一定改进或新的见解
有一定见解
观念陈旧
论文(计算书、图纸)撰写质量
50
结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰
结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰
结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰
结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整
内容空泛,结构混乱,文字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰
指导教师评定成绩:
指导教师签名:
年月日
课程设计指导教师评定成绩表
学号:
20115434姓名:
颜宵鹏班级:
11网络工程1班
项目
分值
优秀
(100>x≥90)
良好
(90>x≥80)
中等
(80>x≥70)
及格
(70>x≥60)
不及格(x<60)
评分
参考标准
参考标准
参考标准
参考标准
参考标准
学习态度
15
学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作
学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务
学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作
学习态度尚可,能遵守组织纪律,能按期完成任务
学习马虎,纪律涣散,工作作风不严谨,不能保证设计时间和进度
技术水平与实际能力
25
设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合理、调查调研非常合理、可信
设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,文献引用、调查调研比较合理、可信
设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比较可信
设计基本合理,理论分析与计算无大错,实验数据无大错
设计不合理,理论分析与计算有原则错误,实验数据不可靠,实际动手能力差,文献引用、调查调研有较大的问题
创新
10
有重大改进或独特见解,有一定实用价值
有较大改进或新颖的见解,实用性尚可
有一定改进或新的见解
有一定见解
观念陈旧
论文(计算书、图纸)撰写质量
50
结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰
结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰
结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰
结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整
内容空泛,结构混乱,文字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰
指导教师评定成绩:
指导教师签名:
年月日
重庆大学本科学生课程设计任务书
课程设计题目
GUI小游戏的设计与实现
学院
计算机学院
专业
网络工程
年级
2011级
已知参数和设计要求:
课程设计对游戏内容不做限制,学生需要自行设计游戏的内容和规则,并在课程设计报告中进行描述。
游戏内容可以参考俄罗斯方块、坦克大战等游戏。
要求以小组为单位,用C++实现游戏的主要功能模块。
最后需要提供的材料包括课程设计报告1份,程序拷贝1份(包括源代码和可执行程序),报告用PPT电子文档一份。
学生应完成的工作:
根据面向对象程序设计思想和C++编程技术,设计实现GUI小游戏。
上机调试并能正确运行。
最后提交完整的设计报告和软件程序拷贝,以及报告用PPT电子文档。
目前资料收集情况(含指定参考资料):
《AcceleratedC++:
PracticalProgrammingbyExample》,AndrewKoenig,BarbaraE.Moo著,Addison-Wesley,2000.
《Windows程序设计:
第5版》,CharlesPetzold著,北京大学出版社,2003.
《高级语言C++程序设计编程范例与精解》,周玉龙,刘景编,高等教育出版社,2003.
课程设计的工作计划:
课程设计时间为一周,从18周星期一开始(2012年12月31日),到18周星期五结束(2013年1月4日)。
课程设计以组为单位进行。
每组不能超过4人,不能少于2人。
星期一进行需求分析;星期二进行软件设计;星期三用C++语言实现程序;星期四对程序进行调试,完成课程设计报告;星期五提交程序和课程设计报告,进行评审。
本组由费仁杰(20115435)、胡吉乾(20115433)和颜宵鹏(20115434)3人组成。
费仁杰负责课程设计的查找资料,游戏界面设置及画出贪吃蛇和食物,写实验报告,代码总体检查,制作PPT部分,所进行的工作占总工作量的34%;
胡吉乾负责课程设计的查找资料,通过键盘对贪吃蛇进行方向操作设置穿墙部分,写实验报告及代码注释,制作PPT部分,所进行的工作占总工作量的33%;
颜宵鹏负责课程设计的查找资料,通过键盘对贪吃蛇进行状态操作(加减速)及游戏计分,设置背景音乐,写实验报告,制作PPT部分,所进行的工作占总工作量的33%。
任务下达日期2012年12月21日
完成日期2013年1月3日
说明:
学院、专业、年级均填全称,如:
计算机学院、计算机科学与技术、2010。
课程设计正文
1.需求分析
1.选题
接到课程设计任务后,我们对几款经典小游戏作了分析并筛选,然后根据老是推荐的题目以及自己的编程能力做了选择,决定了编写简单贪吃蛇游戏,锻炼自己通过Qt实现对函数,类的综合运用。
2.功能
先做贪吃蛇界面,再通过键盘上不同按键对贪吃蛇进行操作,如各个方向运动,计分数等等。
2.系统设计(类图、模块图等)
1.设计思路
通过Qt绘图事件及UI界面设置,绘出贪吃蛇游戏界面,并用draw函数画出矩形(至少三个连在一起代表贪吃蛇,单独一个随机出现在除在贪吃蛇身上外界面任意一格),并伴有背景音乐进行游戏。
2.程序框图
3.游戏流程图
3.关键代码描述
snake类头文件代码
#ifndefSNAKE_H
#defineSNAKE_H
#include
/这个ui是namespaceUi里的Widget类,而这个
类又是简单的继承了ui_widget.h里的Ui_Widget类(没有添加任何成员)*/
namespaceUi{
classSnake;
}
/*namespaceUi里的Widget类其实就是个空壳,而他的基类也仅仅是
把此窗口上的所有控件的声明实例化初始化了,仅仅是为了分离ui和其他控制代码*/
classSnake:
publicQWidget
{
Q_OBJECT
public:
explicitSnake(QWidget*parent=0);//explicit和构造函数一起用.explicitconstructor指明构造函数只能显示使用,目的是为了防止不必要的隐式转化.
~Snake();
protected:
voidpaintEvent(QPaintEvent*);
voidkeyPressEvent(QKeyEvent*);
voidtimerEvent(QTimerEvent*);
private:
Ui:
:
Snake*ui;
QSizenodeSize;
QSizegameAreaSize;
QPointgamePoint;
QListsnakeBody;
QPointhead;
QPointfood;
intcolumns,rows;
enumDIR{D,R,U,L};//枚举
DIRdirector;
intspeed;
intlevel;
intfoodnumber;
intgrade;
inthigh_grade;
voidgenFood();
boolisOver();
inttimerId;
};
#endifSNAKE_H
头文件snake类中定义了画图函数,键盘操作函数以及计时函数,定义了Qlist类对象snakeBody作为游戏主体贪吃蛇。
snake.cpp文件代码
#include"snake.h"
#include"ui_snake.h"
#include
#include
#include
#include//读写文件头文件
#include//加载背景音乐头文件
#include
#include
#include
usingnamespacestd;
Snake:
:
Snake(QWidget*parent):
QWidget(parent),
ui(newUi:
:
Snake)
{
ui->setupUi(this);
setFocusPolicy(Qt:
:
StrongFocus);//通过Tab键,单击两种方式获得焦点
nodeSize.setWidth(20);
nodeSize.setHeight(20);//设置蛇大小
gamePoint.setX(100);
gamePoint.setY(16);//格子起点坐标
columns=30;
rows=30;
grade=0;
gameAreaSize.setWidth(nodeSize.width()*columns);
gameAreaSize.setHeight(nodeSize.height()*rows);//网格总体大小设置
resize(nodeSize.width()*50,nodeSize.height()*32);//窗口大小
snakeBody<<<director=R;//初始化蛇运动方向,向右
qsrand(QTime(0,0,0).msecsTo(QTime:
:
currentTime()));
genFood();
level=1;
speed=240-level*20;//设置贪吃蛇最初速率
fstreamf;
f.open("grade.obj",ios:
:
in);//打开记录游戏分数文件,最初默认
stringline;存入为0
getline(f,line);
istringstreamstream(line);
stream>>high_grade;
ui->lcdNumber_2->display(high_grade);//窗口显示分数
f.close();
ui->gameoverLabel->setVisible(false);
}
Snake:
:
~Snake()
{
deleteui;
}
//画图函数,设置游戏界面及画出贪吃蛇
voidSnake:
:
paintEvent(QPaintEvent*)
{
QPainterp(this);
p.drawPixmap(0,0,QPixmap(":
/snake4.png"));
p.drawPixmap(100,16,QPixmap(":
/snake1.png"));
p.drawPixmap(710,16,QPixmap(":
/snake3.png"));//游戏背景图片设置
//设置网格范围,即贪吃蛇运动范围
QPainterPathpath1;
for(intx=0;x<=columns;x++)
{
path1.moveTo(gamePoint.x()+x*nodeSize.height(),gamePoint.y());
path1.lineTo(gamePoint.x()+x*nodeSize.height(),gamePoint.y()+gameAreaSize.height());
}
for(inty=0;y<=rows;y++)
{
path1.moveTo(gamePoint.x(),gamePoint.y()+y*nodeSize.width());
path1.lineTo(gamePoint.x()+gameAreaSize.width(),gamePoint.y()+y*nodeSize.width());
//设置终点坐标,自动把上一点当作起点
}
p.setPen(QColor(65,65,65,200));
p.drawPath(path1);
QPainterPathpath;
foreach(QPointnode,snakeBody)//根据数组中每个元素来循环代码块
{
path.addRect(gamePoint.x()+node.x()*nodeSize.width(),
gamePoint.y()+node.y()*nodeSize.height(),
nodeSize.width(),
nodeSize.height());
}
p.setPen(QColor(12,12,12,300));
p.setBrush(QColor(23,196,45,200));
p.drawPath(path);
p.setBrush(QColor(152,0,0,200));
p.drawRect(gamePoint.x()+food.x()*nodeSize.width(),
gamePoint.y()+food.y()*nodeSize.height(),
nodeSize.width(),
nodeSize.height());//画增加长度后的蛇
QPixmapsp(":
/snake2.png");
for(inti=0;i{
p.drawPixmap(63,594-i*(sp.height()+1),sp);//画桃心,表示速度大小
}
}
//键盘操作函数,通过键盘控制贪吃蛇运动
voidSnake:
:
keyPressEvent(QKeyEvent*e)
{
switch(e->key())//分别赋予director头文件中枚举值,改变运动状态
{
caseQt:
:
Key_Up:
if(director==U||director==D)
break;
else
{director=U;
break;}
caseQt:
:
Key_Down:
if(director==U||director==D)
break;
else
{director=D;
break;}
caseQt:
:
Key_Right:
if(director==R||director==L)
break;
else
{director=R;
break;}
caseQt:
:
Key_Left:
if(director==R||director==L)
break;
else
{director=L;
break;}
caseQt:
:
Key_N:
if(level<10)
{
level++;
speed=240-level*20;//加速
killTimer(timerId);
timerId=startTimer(speed);
break;
}
else
break;
caseQt:
:
Key_M:
//减速
if(level>1)
{
level--;
speed=240-level*20;
killTimer(timerId);
timerId=startTimer(speed);
break;
}
else
break;
caseQt:
:
Key_P:
killTimer(timerId);//定时器
break;
caseQt:
:
Key_Space:
ui->gameoverLabel->setVisible(false);
//“游戏结束”是否显示
ui->lcdNumber->display(grade);
QSoundmusic("snake.wav");//设置背景音乐
music.play();
killTimer(timerId);
timerId=startTimer(speed);
}
update();
}
//控制贪吃蛇运动状态实现函数
voidSnake:
:
timerEvent(QTimerEvent*)
{
inti;
head=snakeBody.last();
switch(director)
{
caseD:
head.ry()++;//下
break;
caseR:
//右
head.rx()++;
break;
caseU:
head.ry()--;//上
break;
caseL:
//左
head.rx()--;
break;
}
if(isOver())
{
killTimer(timerId);
ui->gameoverLabel->setVisible(true);
//判断游戏是否结束,并显示“游戏结束”字样
if(grade>high_grade)
{
fstreamf;
f.open("grade.obj",ios:
:
out|ios:
:
binary);
f<high_grade=grade;
ui->lcdNumber_2->di