基于C + + 的游戏设计.docx
- 文档编号:13808429
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:14
- 大小:217.26KB
基于C + + 的游戏设计.docx
《基于C + + 的游戏设计.docx》由会员分享,可在线阅读,更多相关《基于C + + 的游戏设计.docx(14页珍藏版)》请在冰点文库上搜索。
基于C++的游戏设计
学号:
实习论文(本科)
学院数学与统计学院
专业统计学
年级2013级
姓名
论文题目基于C++的2048游戏设计
指导教师职称讲师
成绩
2016年10月16日
基于C++的2048游戏设计
学生姓名:
学号:
学院:
数学与统计学院专业:
统计学
指导教师:
职称:
讲师
摘要:
专业实习,是教学计划中的一门重要的必修课和综合实践课程,是培养学生的专业素质和实际能力的重要实践环节。
通过此次的C++实习,掌握了程序设计的基本理论与方法,能够运用基本代码进行简单的程序设计,运行基本的游戏程序。
关键词:
C++;设计;程序
TheGameDesignof2048BasedonC++
Abstract:
Theimportantrequiredcourseintheteachingplanandcomprehensivepracticecurriculum,professionalinternships,istocultivatethestudents'professionalqualityandpracticalabilityoftheimportantlinkofpractice.ThroughtheC++practice,wegraspthebasictheoryandmethodofprogramdesign,beabletousebasiccodetobuildsimpleprogramandrunit.
Keywords:
C++;Design;Program
前言
这次实习是我们毕业前的一次实践性实习。
为了拓展我们的知识面,增强我们对所学知识的应用能力,增加我们在社会竞争中的经验,锻炼和提高我们的综合素质,以便在以后毕业后能真正走入社会,并且能够在生活和工作中很好地处理各方面的问题,学校特地从北京达内科技集团聘请了专业的C++工程师讲师来对我们进行专业实训,进一步运用所学知识分析和解决实际专业问题,从而为就业打下良好的基础。
1实习前的准备
学校对我们的实习非常重视,本着通过实习来检验本专业教学中存在的问题,改进教学工作的目的,提前就为我们联系好了与专业相关的单位来做实习培训。
在正式进入机房实训前,讲师还专门做了一场关于实习内容的分享会,介绍了实习的基本情况、基本要求、实习项目的基本情况,学习和了解实习项目的相关文件和资料,帮助我们更系统地了解和熟悉接下来的实习课程内容。
2实习目的
1.培养理论联系实际的思想作风和工作作风;
2.培养作为计算机类工作人员的专业素质;
3.培养独立或与团队一起开展信息处理工作的基本业务能力。
3实习任务
1.通过实际操作,了解并逐步熟悉掌握C++;
2.掌握常用软件的熟练操作,为今后所期望的专业方向做准备;
3.在教师指导下,利用C++编程,完成独立的游戏编程任务;
4.最后在实习指导老师的指导下,参与信息处理与计算工作,完成一篇相关的实习论文(或实习记录)。
4实习内容
4.12048游戏简介
2048游戏是一款简单而流行的数字游戏,属于益智游戏。
操作界面上有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动。
每滑动一次,所有的数字方块都会往滑动的方向靠拢。
两个相同数字方块撞在一起之后合并成为他们的和。
每次操作之后会在空白的方格处随机生成一个2或者4(其他模式会有所改变),最终得到一个“2048”的方块就是胜利了。
由于规则简单,各种版本和平台上均有该款游戏。
相信有不少人都玩过它,但是操作界面只有半个巴掌大的一个游戏,背后却要用到类似随机数的产生、大批量数据的处理、UI设计等任务,真的不算是一个很简单的工作。
本次的游戏程序设计任务将运用C++来实现。
4.22048模块需求分析
首先分析了这款游戏的功能需求。
2048游戏一般由以下几个模块来构成:
1.矩阵方块;
2.控制模块;
3.计算模块;
4.输出模块。
每个模块来实现2048游戏的各项功能:
方向移动、方块合并、记录当前数据和输出计分结果、游戏胜利或失败后执行结束游戏操作等。
4.3UI界面的规划设计
首先进行UI界面的规划设计。
创建一个800×600的背景模块,在模块左侧这里我们需要16个方块,按照4×4的规格排列整齐。
模块右侧的空白区域需要添加功能键:
上、下、左、右、重置、关闭。
另外我们还需要再添加一个计分标签,用来计算并输出游戏得分。
最后按照模块功能与人的操作习惯,将标签分别排列在合适的位置。
最终的UI界面如图1所示:
图1
UI界面(矩阵方块)设计完成以后,接着来开始程序代码的编写。
4.4头文件的需求分析
首先分析需要用到的头文件。
第一步需要生成随机数,第二步要为16个矩形模块填充随机数所对应的图片,第三步为操作界面添加背景,第四步在游戏成功或失败时即时输出信息。
分析完成以后将所有需要用到的头文件都写入show.cpp文件里:
#include"show.h"
#include"ui_show.h"
#include
#include
#include
#include
#include
QDialog(parent),
ui(newUi:
:
Show)
4.5随机数的生成
接下来我们开始写入生成两个随机数和分数从零开始的代码,同时加入图片加载和声明面板对象的代码:
{
ui->setupUi(this);
srand(time(NULL));
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
map[i][j]=0;
}
}
sui();
sui();
fen=0;
QPixmappix(":
/image/bj.jpg");//加载图片
QPalettepalette;//声明画板对象
palette.setBrush(this->backgroundRole(),QBrush(pix));//设置画板样式
this->setPalette(palette);//设置到我们的面板上
}
voidShow:
:
sui(){
do{
intx=rand()%4;
inty=rand()%4;
if(map[x][y]==0){
if(rand()%20==4)
map[x][y]=4;
else
map[x][y]=2;
break;
}
}while
(1);
}
4.6图片资源的导入和加载
将所有准备好的图片资源载入设计程序,以便后续的图片加载工作。
随后我们进入为16个矩形模块和背景加载其各对应随机数图片的设计过程,这个模块以地址形式实现:
voidShow:
:
paintEvent(QPaintEvent*){
QImageimg;
img.load(":
/image/"+QString:
:
number(map[0][0])+".png");
ui->show_1->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[0][1])+".png");
ui->show_2->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[0][2])+".png");
ui->show_3->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[0][3])+".png");
ui->show_4->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[1][0])+".png");
ui->show_5->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[1][1])+".png");
ui->show_6->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[1][2])+".png");
ui->show_7->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[1][3])+".png");
ui->show_8->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[2][0])+".png");
ui->show_9->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[2][1])+".png");
ui->show_10->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[2][2])+".png");
ui->show_11->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[2][3])+".png");
ui->show_12->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[3][0])+".png");
ui->show_13->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[3][1])+".png");
ui->show_14->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[3][2])+".png");
ui->show_15->setPixmap(QPixmap:
:
fromImage(img));
img.load(":
/image/"+QString:
:
number(map[3][3])+".png");
ui->show_16->setPixmap(QPixmap:
:
fromImage(img));
ui->fen->setText(QString:
:
number(fen));
}
4.7主体算法的分析和实现
接下来进入主要的算法设计步骤。
在此根据2048游戏算法的功能需求和功能模块,对主要算法进行分析并实现。
对于控制模块,一共有上、下、左、右、重置、关闭六个控制功能键。
对于左移功能键的算法,每点击一次,所有的数字方块都会往滑动的方向靠拢。
两个相同数字方块撞在一起之后合并成为他们的和。
每次操作之后会在空白的方格处随机生成一个2或者4。
此时分数也在累计增加。
这一部分中重置和关闭这两个功能键相对与其他功能键独立,而上、下、左、右四个功能键的算法有一定的相似之处,所以以下仅详细展示左移功能键的代码。
现在开始对这六个功能键进行代码编写:
voidShow:
:
on_pushButton_3_clicked()
{
//reset
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
map[i][j]=0;
}
}
sui();
sui();
fen=0;
update();
}
voidShow:
:
on_clo_clicked()
{
//clo
this->close();
}
voidShow:
:
on_pushButton_2_clicked()
{
//up
for(intk=0;k<3;k++){
for(inti=1;i<4;i++){
for(intj=0;j<4;j++){
if(map[i-1][j]==0){
map[i-1][j]=map[i][j];
map[i][j]=0;
}
else{
if(map[i][j]==map[i-1][j]){
map[i-1][j]=map[i-1][j]+map[i][j];
map[i][j]=0;
fen+=map[i-1][j];
}
}
}
}
}
if(go()==1){
sui();//产生随机数
}
update();//更新界面
}
Show:
:
~Show()
{
deleteui;
}
voidShow:
:
on_pushButton_clicked()
{
//right
}
voidShow:
:
on_pushButton_5_clicked()
{
//down
}
voidShow:
:
on_pushButton_4_clicked()
{
//left
}
4.8游戏结束的判断
最后一个需解决的问题就是对于游戏是否结束的判断,其主要体现在控制和计算模块。
如果游戏未能达成任务而失败,输出“失败”和“游戏结束”的信息,同时只有关闭和重置功能键可以被操作:
intShow:
:
go(){
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
if(map[i][j]==0){
return1;
}
}
}
return-1;
}
voidShow:
:
pan(){
intarr[4][2]={-1,0,0,-1,0,1,1,0};
for(inti=0;i<4;i++){
for(intj=0;j<4;j++)
{
if(map[i][j]==0)
{
return;
}
else
{
for(intloop=0;loop<4;loop++)
{
intx=i+arr[loop][0];
inty=j+arr[loop][1];
if(x<0||x>3||y>3||y<0)
{
continue;
}
elseif(map[x][y]==0)
{
return;
}
elseif(map[i][j]==map[x][y])
{
return;
}
}
}
}
}
if(QMessageBox:
:
question(this,tr("失败"),tr("游戏结束");
QMessageBox:
:
Yes|QMessageBox:
:
No,QMessageBox:
:
Ok)==QMessageBox:
:
Yes)
{
on_pushButton_3_clicked();
}
else
{
this->close();
}
}
以上我们对2048这个游戏的程序设计部分的工作已经完全结束,接下来构建程序,检查并修改错误,就可以打开并运行这个游戏了。
4.9游戏最终运行成果
最终的游戏界面如图2所示:
图2
点击右侧功能键,即可开始游戏。
5个人总结
通过这次实习我很好地掌握了如何将C++实际运用到游戏开发中去,检验了自己学习的成效、检测了自己的所缺。
这就形成了从实践中学习,从学习中实践的良性循环。
这是一个很好的锻炼机会,能将所学的理论知识联系于实际,我感觉学习与实践是密不可分的。
当今中国经济飞速发展,国内外经济不断变化,在机会越来越多的同时,也出现了更多的题目,有了更多更艰巨的挑战,这也就对人才的要求越来越高。
我们不仅要学好课本里的知识,还要主动走进社会,积极在实践中学习其他的东西,不断增加自己的经验,全方面武装自己,才能在这个社会有立足之地甚至拥有不败之地。
参考文献
[1] 谭浩强.C程序设计教程[M].清华大学出版社,2007.
[2] 荣钦科技.Visual C++游戏编程基础[M].电子工业出版社,2005.
[3] 王浩.Visual C++游戏开发经典案例详解[M].清华出版社,2010.
[4]刘明军.C语言程序设计[M].电子工业出版社,2007.
[5]凌云.C语言程序设计与实践[M].机械工业出版社,2010.
[6]StanleyB.LippmanC++primer[M].人民邮电出版社,2006.
[7]SteveMaguire.编程精粹[M].人民邮电出版社,2009.
[8]AndrewKoenig.C陷阱与缺陷[M].人民邮电出版社,2008.
(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的配合和支持)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于C 的游戏设计 基于 游戏 设计