程序设计训练大作业报告控制台游戏.docx
- 文档编号:389392
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:11
- 大小:71.44KB
程序设计训练大作业报告控制台游戏.docx
《程序设计训练大作业报告控制台游戏.docx》由会员分享,可在线阅读,更多相关《程序设计训练大作业报告控制台游戏.docx(11页珍藏版)》请在冰豆网上搜索。
大连理工大学程序设计训练总结报告
装
订
线
控制台游戏——2048
学生姓名:
刘阳
院系班级:
电计1203
学号:
201281303
联系电话:
188-4085-1891
Email:
rick@
完成日期:
2014年7月1日
-3-
控制台小游戏——2048
一、设计任务
设计目标:
完成一个控制台小游戏,其中包括游戏、排名、存档和读档等功能。
选题意义:
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
出口参数(实参):
void
算法描述(即实现步骤):
函数原型2 intgotoxy(intx,inty)
函数功能:
隐藏光标,减少游戏中的闪烁。
入口参数:
intx,inty
出口参数:
实际点的坐标。
算法描述:
运用api函数,GetStdHandle获取标准输出设备句柄,SetConsoleCursorPosition设置控制台光标位置并输出。
函数原型3 intdraw_map()
函数功能:
绘制游戏地图以及提示信息。
入口参数:
void
出口参数:
void
算法描述:
利用for循环以及gotoxy函数绘制边框,再通过对文件的操作读取当前最高分显示在屏幕上。
函数原型4 intdraw_cover(intx)
函数功能:
绘制游戏中出现的各级菜单(通过参数x控制具体绘制哪一种)。
入口参数:
intx
出口参数:
数字1~3
算法描述:
同样利用for循环和gotoxy函数,绘制出菜单边框,通过参数x的值决定绘制的内容。
函数原型5 intquntity(intx)
函数功能:
获取数据文件中记录个数。
入口参数:
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(下)之后数组元素的运算
入口参数:
inta[4][4]
出口参数:
a[4][4]为游戏数据数组
算法描述:
与up函数算法相同,只是读取元素的方向相反,将temp写入二维数组的方向也相反。
函数原型1 3 intleft(inta[4][4])
函数功能:
控制按下a(左)之后数组元素的运算
入口参数:
inta[4][4]
出口参数:
a[4][4]为游戏数据数组
算法描述:
定义一个循环队列,以行为单位,将该列元素依次入队列。
元素入队列时判断队列是否已满,如果满了判断队列中元素是否相同,如果相同将二者相加后存入temp[4],如果不同头元素出队列,将新元素入队;如果没满,直接入队。
如果以上的操作后队列不空,重负之前的判定步骤,直到元素全部出队。
再按顺序将temp中的元素重新写入二维数组。
函数原型1 2 intdown(inta[4][4])
函数功能:
控制按下d(右)之后数组元素的运算
入口参数:
inta[4][4]
出口参数:
a[4][4]为游戏数据数组
算法描述:
与left函数算法相同,只是读取元素的方向相反,将temp写入二维数组的方向也相反。
函数原型15 intcreate_newpoint(inta[4][4])
函数功能:
在随机的空白位置随机的产生2或者4
入口参数:
inta[4][4]
出口参数:
a[4][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])
函数功能:
完成新的游戏的初始化
入口参数:
inta[4][4]
出口参数:
a[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()
函数功能:
根据数据文件求玩家纪录中的平均水平
入口参数:
void
出口参数:
void
算法描述:
以读的方式打开数据文件,读进相应的数组,调用quntity函数求出文件中数据的个数,计算出平均值,结果直接输出在屏幕上。
下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 训练 作业 报告 控制台 游戏