程序设计训练大作业报告控制台游戏Word下载.docx

上传人:wj 文档编号:1456060 上传时间:2023-04-30 格式:DOCX 页数:11 大小:71.44KB
下载 相关 举报
程序设计训练大作业报告控制台游戏Word下载.docx_第1页
第1页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第2页
第2页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第3页
第3页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第4页
第4页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第5页
第5页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第6页
第6页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第7页
第7页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第8页
第8页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第9页
第9页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第10页
第10页 / 共11页
程序设计训练大作业报告控制台游戏Word下载.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

程序设计训练大作业报告控制台游戏Word下载.docx

《程序设计训练大作业报告控制台游戏Word下载.docx》由会员分享,可在线阅读,更多相关《程序设计训练大作业报告控制台游戏Word下载.docx(11页珍藏版)》请在冰点文库上搜索。

程序设计训练大作业报告控制台游戏Word下载.docx

一、设计任务

设计目标:

完成一个控制台小游戏,其中包括游戏、排名、存档和读档等功能。

选题意义:

2048是最近最流行的小游戏之一,益智益趣,通过C语言控制台仿写这个游戏,可以锻炼编程框架思想以及技巧,同时将所学到的数据结构等知识灵活的运用。

目标实现的系统功能:

完成2048游戏主体,可查看各玩家排名情况,可查看玩家平均水平,可存档、读档。

二、程序设计与实现

1.结构框图

设计的控制台游戏2048结构图如图一所示。

控制台游戏2048

退出

查看纪录

读取存档

新的游戏

保存成绩

存档

存档位一

存档位二

步数排名

分数排名

平均水平

图1.2048游戏框图

2.功能模块设计及其流程图

(1)数据描述与存储

游戏模块数据采用二维数组存放,并且不断根据按键信息更新其中数据。

存储时以二进制文件存储,数据文件位于工程文件夹中load1.dat以及load2.dat(此时的步数以及分数存储在load1_step.dat、load2_grade、load2_step.dat、load2_grade)。

读取数据的目的是可以继续之前没有完成但存档了的游戏。

分数模块数据采用结构体数组存放,用typedef定义了StepRecord和GradeRecord。

StepRecord中name[15]代表玩家在步数排行榜中的名字,step代表玩家所坚持的步数;

GradeRecord中name[15]代表玩家在分数排行榜中的名字,grade代表玩家取得的分数(分数计算规则见说明)。

存储时以二进制文件存储,数据文件位于工程文件夹中step_rank.dat、grade_rank.dat。

读取数据的目的是将新的数据加入排行榜或者读取并显示排行榜。

(2)主要功能模块设计及其流程图

函数原型1 intHideCursor()

函数功能:

隐藏光标,减少游戏中的闪烁。

入口参数(形参):

void

出口参数(实参):

算法描述(即实现步骤):

函数原型2 intgotoxy(intx,inty)

入口参数:

intx,inty

出口参数:

实际点的坐标。

算法描述:

运用api函数,GetStdHandle获取标准输出设备句柄,SetConsoleCursorPosition设置控制台光标位置并输出。

函数原型3 intdraw_map()

绘制游戏地图以及提示信息。

利用for循环以及gotoxy函数绘制边框,再通过对文件的操作读取当前最高分显示在屏幕上。

函数原型4 intdraw_cover(intx)

绘制游戏中出现的各级菜单(通过参数x控制具体绘制哪一种)。

intx

数字1~3

同样利用for循环和gotoxy函数,绘制出菜单边框,通过参数x的值决定绘制的内容。

函数原型5 intquntity(intx)

获取数据文件中记录个数。

1或2

算法描述:

利用指针定位函数fseek,文件打开时,指针位于文件首第一个字节,调用fseek函数把指针移到文件末尾,再调用ftell()返回指针当前所在位置,这个返回值是文件长度,再根据参数x的值用它除以类型StepRecord或者GradeRecord的长度,得到记录个数。

函数原型6 intread_record(intx,inta[4][4],intb[2])

读取游戏存档。

intx,inta[4][4],intb[2]

x值为1或2,保存游戏数据的二维数组a[4][4],保存步数step和分数grade的数组b[2]。

通过参数x的控制以读的方式打开相应的数据文件,将游戏数据信息读取到数组a[4][4]中,将分数等信息读取到b[2]中。

函数原型7 intread_rank(intx,intnum)

读取游戏排名

intx,intnum

x值为1或2,num为数据文件中记录个数

通过参数x的控制以读的方式打开相应的数据文件,将排名数据存入相应数组中,再通过gotoxy函数以及for循环打印。

函数原型8 intsave_record(intx,inta[4][4],intstep,intgrade);

游戏中数据存档

intx,inta[4][4],intstep,intgrade

x值为1或2,a[4][4]为游戏中存放数据的二维数组,step和grade分别是游戏中的步数和分数。

通过参数x的控制以写的方式打开对应的存档位置,将相应数据写进数据文件。

函数原型9 intsave_rank(StepRecords,GradeRecordg,intnum1,intnum2)

保存游戏排名

StepRecords,GradeRecordg,intnum1,intnum2

s为上一局游戏中的步数结构体,g为上一局游戏中的分数结构体,num1和num2分别为当前数据文件中记录个数。

先以读的方式打开相应的文件,将原本数据文件中的排名信息读入相应数组,由于原来的信息已经有序,只需确定新数据的插入位置即可(这里采用顺序查找,可用二分查找减少比较次数)。

再以读的方式打开文件,将排序后的新序列写入文件。

函数原型10 intjudge(inta[4][4],intflag[5])

判断游戏是否可以继续进行

inta[4][4],intflag[5]

a[4][4]为当前游戏数据,flag[5]保存判断信息的数组

首先将判断数组flag[5]置0,再遍历二维数组元素,如果有0,将flag置1;

如果有2048的出现,return2结束;

如果既不为0也不为2048,则判断其上下左右是否有相邻相等的元素或者为0的元素,flag[1]~flag[4]表示是否可以进行上下左右四个操作,如果满足上述条件就将相应的flag置1。

最后只要flag数组中有一个元素为1,游戏便可继续,返回0;

否则返回1。

函数原型1 1 intup(inta[4][4])

控制按下w(上)之后数组元素的运算

inta[4][4]

a[4][4]为游戏数据数组

定义一个循环队列,以列为单位,将该列元素依次入队列。

元素入队列时判断队列是否已满,如果满了判断队列中元素是否相同,如果相同将二者相加后存入temp[4],如果不同头元素出队列,将新元素入队;

如果没满,直接入队。

如果以上的操作后队列不空,重负之前的判定步骤,直到元素全部出队。

再按顺序将temp中的元素重新写入二维数组。

函数原型1 2 intdown(inta[4][4])

控制按下s(下)之后数组元素的运算

与up函数算法相同,只是读取元素的方向相反,将temp写入二维数组的方向也相反。

函数原型1 3 intleft(inta[4][4])

控制按下a(左)之后数组元素的运算

定义一个循环队列,以行为单位,将该列元素依次入队列。

函数原型1 2 intdown(inta[4][4])

控制按下d(右)之后数组元素的运算

与left函数算法相同,只是读取元素的方向相反,将temp写入二维数组的方向也相反。

函数原型15 intcreate_newpoint(inta[4][4])

在随机的空白位置随机的产生2或者4

首先一个while

(1)循环,出口为找到值为0的位置。

再利用随机数决定产生的是2还是4。

函数原型16 intupdate_menu(intstep,intgrade,inta[4][4])

更新数据

intstep,intgrade,inta[4][4]

step和grade分别为当前的步数以及分数,a[4][4]为游戏数据数组

遍历二维数组元素,利用gotoxy函数在正确的位置输出数字以及恰当的空格符,同时利用API函数SetConsoleTextAttribute达到不同数字不同颜色的效果。

函数原型17 intinitialization(inta[4][4])

完成新的游戏的初始化

利用for循环,两次执行while

(1),while

(1)的出口为找到值为0的位置。

将找到的两个位置元素置为2,完成新的游戏数据初始化。

函数原型18 intgame(inta[4][4],intstep,intgrade)

游戏主体函数,完成游戏各种操作并允许各种误操作以及提供了存档接口。

inta[4][4],intstep,intgrade

a[4][4]为初始游戏数据数组,step以及grade为游戏开始时的步数和分数。

利用一个while

(1)循环,每次利用judge函数检查游戏是否结束,如果结束根据返回值1或者2判断游戏获胜或失败并调用save_rank函数将信息加入排行榜;

如果没有结束,嵌套一个while

(1),出口为有wasd或者表示存档的i按下,每当有wasd或者i按下,便执行相应的操作(up函数等)并将w置1,w等于1的情况下将会更新屏幕上的数据并且在空白处产生新的数字(调用create_newpoint和update_menu函数)。

函数原型19 intaverage()

根据数据文件求玩家纪录中的平均水平

以读的方式打开数据文件,读进相应的数组,调用quntity函数求出文件中数据的个数,计算出平均值,结果直接输出在屏幕上。

下面是intgame(inta[4][4],intstep,intgrade)函数的流程图。

开始

Judge==2

create_newpoint(a)

Judge==1

(key==119)&

&

(flag[1]==1)

N

up(a)

Y

N

(key==115)&

(flag[2]==1)

down(a)

Y

left(a)

(key==97)&

(flag[3]==1)

(key==100)&

(flag[4]==1)

N

right(a)

key==105

save_record

Y

save_rank

结束

(3)个性化设计说明

①遇到的问题:

控制台游戏大多依赖于system(“cls”),但清屏会闪烁影响游戏。

在update_menu函数中,没有采用清屏的方式,而是用gotoxy函数直接输出数字,只修改变化的部分。

②使用的数据结构:

在up等函数中,运用了循环队列,通过元素依次入队判断捕捉到相应的键值后的元素位置变化,节省空间。

③使用API函数。

比如SetConsoleTextAttribute设置字体颜色、SetConsoleCursorPosition移动光标、GetStdHandle获取标准输出设备句柄等。

三、设计效果

(原程序是彩色的,报告需要打印时打成黑白的)

四、对本课程学习体会及建议

最深的体会就是学到的知识要学会用,比如数据结构与算法中的查找算法、队列等等完全可以运用在平时的程序中提高效率;

还有就是要不断的学习,这个2048我几个月前就开始写的,但之前的版本中游戏算法中一直有bug并且屏幕有闪烁界面不友好,之后为了一个一个解决这些问题通过百度学习了一点API等,一点点的完善这个程序。

学习就是需要这样,在完善中进步。

还有这个报告真心没办法在五页内完成,请老师谅解。

五、程序操作说明

程序文件夹中已包含数据文件;

游戏中wasd控制上下左右;

游戏中允许误操作;

游戏中请按说明进行。

游戏规则:

开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4,玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动,玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并,合并所得的所有新生成数字想加即为该步的有效得分,玩家选择的方向行或列前方有空格则出现位移,每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4),棋盘被数字填满,无法进行有效移动,判负,游戏结束,棋盘上出现2048,判胜,游戏结束

-9-

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2