猜数字游戏的分析与实现

别妄想泡我
507次浏览
2021年01月01日 02:37
最佳经验
本文由作者推荐

植树造林-不翼而飞的意思

2021年1月1日发(作者:薛贻矩)


















课程设计名称:猜数字游戏的分析与实现




















目录


一 游戏说明

二 总体设计

三 程序代码

四 运行结果

五 附录文档
一 游戏说明
1使用说明
(1)开始功能键选择
1:开始游戏
2:查看排行榜
3:查看帮助
4:清除排行榜
5 :等级设定
(2)系统将提交的数与 它自动产生的数进行比较,输出结果“*A*B”形式。其中A代表数
字正确相应位置也正确,B代表数 字正确但位置不正确。如:1A3B表示游戏者有1个数字的
位置正确且数值也正确,除此以外,游戏者 还猜对了3个数字,但位置不对,即游戏者已经
猜出4位数据,但有3个数据位置不对


2程序说明书
(1)程序的功能说明:猜数字游戏是一个运行在W indows平台下的小型游戏软件,依据猜
数字游戏的基本规则,给用户进行成绩排行,并可以随着玩 家的游戏记录进行更新。游戏用
户可以选择开始游、排行榜查看、帮助等主要功能。当用户选择开始游戏 时,系统会让用户
逐次猜数字,用户每次猜数字后系统会给出本次猜数字的结果提示,如位置和数字都正 确的
数字个数、数字正确但位置不正确的数字个数。如果用户猜数字的次数超过10次,则提示
用户游戏失败,如果在10次之内猜出4个数字和正确的顺序,则提示用户猜数字成功,并
到排行榜中进 行比较,如果排名在前一名,则计入排行榜中,以便其他用户查看。在排行榜
查看功能中,用户可以查看 当前的游戏排行,如有新的记录产生,则插入到排行榜中,并把
排行榜中位次最末的记录挤出排行榜。在 帮助模块,用户可以查看游戏规则,当熟悉规则后
可以退出帮助模块。
(2)程序的设计说明 :排行榜中存放玩家信息和成绩,排行榜对应record文件。如删除该
文件,则调用系统后,会初始 化排行榜,重新建立该文件,并设置初始的玩家姓名和游戏记
录。


3 软件可以实现的基本功能
(1)游戏区:玩家可以在游戏区逐次猜数字,系统给出玩家每次猜数字后的 提示,包
括数值、位置均正确的数字个数和数值正确但位置不正确的数字个数。
(2)刷新排 行榜:当玩家成功完成一轮猜数字游戏后,可通过和排行榜中相应记录的
比较判断玩家是否可以进入排行 榜,进入排行榜的资格游戏成绩在前五名的玩家。
(3)查看排行榜:玩家可以查看当前排行榜中的排 名顺序,从而确定自己的游戏目标。
排行榜的查看按一定顺序显示给用户,便于查看。
(4) 清除排行榜:玩家可以选择清除排行榜功能,使得排行榜上的玩家姓名和玩家游
戏记录从系统中清除,只 留下系统默认的玩家名(player)和系统默认记录10次。
(5)帮助:玩家通过帮助功能了解游戏规则和排行榜设置规则。


4模块设计说明
(1).游戏区模块
该模块为玩家提供猜数字游戏的主体功能, 由系统自动产生4个随机排列的整数,并
给用户10次机会猜测数字的数值和排列顺序。如果用户在10 次之内没有猜出正确的结果,
则提示用户游戏失败,否则提示用户猜数字成功,并调用产生新记录模块对 玩家游戏成绩进
行处理。流程图如下:



系统模块结构图
①产生原始数字:由系统产生4个随机数,并按任意顺序排列,作为游戏的原始数字供
玩家进行猜数字游 戏。
②游提示:提示用户数值和位置全对的数字个数,和只有数值但位置不对的数字个数。
③原始数字显示:当用户在10次之内仍未能猜出原始数字和顺序时,系统提示玩家失
败,并给玩家显示 出原始数字和顺序。

游戏区模块功能图
(2)、排行榜模块
该模块 为玩家提供排行榜的浏览和清除功能,包括按玩家成绩顺序浏览、按玩家姓名
浏览和清除排行榜3个子功 能。
①按玩家成绩顺序浏览子功能中,将玩家的姓名、游戏成绩按猜数字次数从少到多的顺
序 列表显示,即将玩家记录从高到底显示。
②按玩家姓名浏览的子功能中,为了玩家便于查找到自己的游 戏成绩,将玩家的姓名和
猜数字次数记录按照玩家姓名的字母顺序列表显示。
③清除排行榜: 当用户选择清除排行榜功能时,系统会将所有玩家的历史游戏记录和玩
家姓名一起从排行榜中清除,在排 行榜中只留下默认的游戏记录和默认的玩家姓名,即系统
默认玩家姓名player和系统默认记录10 次。

游戏控制模块功能图
(3)新记录模块
该模块的功能是当玩家成 功完成游戏时,判断用户可否进入排行榜,如果可以进入,则
刷新排行榜中的记录,将当前玩家的游戏记 录写入排行榜,并将排行榜目前结果显示给用户。


产生新记录模块功能图
(4)读取最好记录模块
读取最好记录模块的主要功能是当用户选择游戏开始选项时,首先提 示用户目前排行榜
中的最游戏记,如果目前没有排行的玩家记录,则初始化排行榜,给出系统默认的玩家 姓名
和默认的游戏记录。如果目前排行榜中有玩家记录,则判断出最好记录显示给用户。

产生新记录模块功能图
(5)帮助模块
帮助模块提供的功能是当玩家选项为帮助功 能对应的选项数字时,进入帮助模块,给
出用户猜数字的游戏规则和游戏中相关提示的含义。
(6)系统总流程图:


















二 总体设计
1 要求
(1)要求使用多文件方式实现设计;
(2)要求在各个文件内实现结构化设计;
(3)每个模块作为一个单独的文件。


2 文件及函数组成
源文件
record.h

game_ control.c
game_ register.c
game.c
函数名或其他成分
ASK
结构声明
库函数及函数原型声明
Game_rank
Game_explain
Tiptop_record
Tiptop_output
Game_main
Build_number
Game_in_out
Time_command
Game_result
record.c main
Menu_select
manage_menu


功能
宏定义
结构声明

设置游戏等级
输出游戏说明
记录最高分
输出最佳排行
开始游戏中心
获取系统随机数字
获取游戏者数据和输出结果
时间控制
游戏结果处理输出
主函数
选择菜单
处理菜单
3函数设计
(1) 输出游戏说明函数

函数原型:void Game_ explain()
功 能:输出游戏规则说明
参 数:void
返 回 值:void
要 求:说明游戏相应的按键,保证游戏者按照说明。
(2)记录最高分函数:
函数原型:void Tiptop_register(int)
功 能:把从Ge t_player函数得到的游戏者信息和游戏的积分信息一同保存到指定
路径的Tiptop_文件中
参 数:int S;S为游戏积分
返 回 值:void
要 求:要求把原来有的信息替换为现在的信息,并且只有积分大于原有信息的第
十名,才会被以替换的方式记录;并且是降序的方式排列的。
(3)输出最佳排行函数:
函数原型:void Tiptop_out()
功 能:输出最佳排行信息
参 数:void
返 回 值:void
要 求:没有信息的时候输出提示,有信息时按降序排列输出全部信息。
(4)开始游戏中心函数
函数原型:void Game_main()


功 能:调用Time_ control 、Build_number等函数,进行游戏的整体控制
参 数:void
返 回 值:void
要 求:注意函数的完整性,保证游戏顺利进行,注意没有设置等级时候,默认C=1!
(5)获取游戏者游戏数据和输出游戏进程结果函数
函数原型:void Course_in_out()
功 能:把游戏者猜的数据读入内存,并且分析得出结果,并输出结果
参 数:void
返 回 值:void
要 求:用A或B的代码表示本次的结果,其中A表示数值对位 置也对,B表示数值
对,但位置错了!每次得到游戏者的猜测数据都要分析得出结果并输出结果,
以便游戏者的下一次猜测。
(6)游戏结果处理输出函数
函数原型:void Game_result(int m )
功 能:计算,得出最后游戏积分
参 数:int m:整个游戏的时间
返 回 值:void
要 求:按照游戏等级,设置不同的游戏积分方式。
(7)时间控制函数
函数原型:int Time_ control()
功 能:利用文件,得到玩游戏的总时间,计算游戏积分。
参 数:void
返 回 值:int Time:游戏前后的时间差异
要 求:得到的时间是以秒为单位,数据是整型数据。


4补充 :函数说明
void Menu_select();
void Tiptop_record(int);
void Tiptop_output();
void Game_explain();
void Game_main();
void Game_in_out();
int Time_command();
void Game_result(int);

选择菜单函数
记录最高分函数
输出最佳排行函数
输出游戏说明函数
开始游戏中心函数
获取游戏数据和输出游戏进程结果函数
时间控制函数
游戏结果处理输出函数
3程序代码
1 主体游戏程序
#include
#include
#include


#define N 4
#define MAX_TIMES 10
* 随机出要猜的数字,四个数字都不相同 *
void create_rand_num ( int * rand_num )
{
int num[10]={0,1,2,3,4,5,6,7,8,9};* 每位数的范围 *
int i;
int rand_n; * 产生的随机数 *
int temp; 整形变量
randomize(); * 随机种子发生器 *
* 产生四个不同随机数 *
for(i=0 i < N; i++)
{
* 对数组的下标来随机,而不是对它的元素,请仔细思考 *
rand_n = rand()%(10-i) + i;
*(rand_num + i) = num[ rand_n ];
temp = num[i]; * 随机到了的数字往前推,以后的随机中它不再出现 *
num[i] = num[ rand_n ];
num[ rand_n ] = temp;
}
}
* 判断输入数据的合法性 *
int input_check ( int * guess )
{
int i=0;
for(;i < N; i++)
{
if(*(guess + i)>9 || *(guess + i)<0)
{
printf(
return 0;
}
}
return 1;
}
* 判断玩家猜的数字,返回猜的次数,超10次返回0 *
int guess_num ( int * rand_num )
{
int guess[N]; * 玩家猜的数字 *
int times = 1;
int i, j;
int A, B; * A表示数值且位置正确的个数,B只表示数值正确的个数 *
for(;times <= MAX_TIMES; times++)* 最多猜可以10次 *
{


printf(
for(i=0 i < N; i++) * 输入要猜的4个数字 *
scanf(
if( !input_check(guess) )
{ times --; continue;} * 非法输入,重输 *
* 判断用户所猜的数字 *
A = B = 0;
for(i=0 i < N; i++)
{
for(j=0 j < N; j++)
{
if(i==j && guess[j] == *(rand_num+i)) * 数值和位置正确 *
{A ++; break; }
else if( guess[j] == *(rand_num+i) ) * 数值正确 *
{B ++; break; }
}
if( i == N-1 ) * 猜对了,返回猜的次数 *
if( A==N ) {printf(
}
printf(
}
return 0; * 10次内没猜对 *
}
* 统计结果 *
void result( int times , int * score )
{
switch( times )
{
case 1:case 2:case 3:
printf(
printf(
*score += 110-times*10; break;
case 4:case 5:case 6:
printf(
printf(
*score += 100-times*10; break;
case 7:
printf(
printf(
*score += 20; break;
default: printf(
}
}
* 是否继续游戏 *


int go_on ()
{
char c;
printf(
getchar();
if((c=getchar()) == 'y' || c == 'Y')
return 1;
return 0;
}
main()
{
int rand_num[N]; * 产生的四个随机数 *
int times; * 猜对结果所用的次数 *
int score = 0; * 得分 *
int flag = 1 * 继续游戏 *
while( flag )
{
clrscr();
printf(
create_rand_num ( rand_num );
times = guess_num(rand_num );
result( times , &score );
flag = go_on ();
}
}


2 游戏控制
#include
**********************
设置游戏等级函数
**********************
void Game_rank()
{
FILE *fp;
printf(
printf(初级************n
printf(中级************n
printf(高级************n
printf(
printf(请选择游戏等级:t


loop:
scanf(
if(C<1||C>3)
{
printf(输入有误!请重新输入:t
goto loop;
}
if((fp=fopen(
{
printf(打开文件失败!
exit(1);
}
fwrite(&C,sizeof(int),1,fp);
fclose(fp);
if(C==1)
printf(等级设置为初级!n
if(C==2)
printf(等级设置为中级!n
if(C==3)
printf(等级设置为高级!n
printf(

}
****************
输出游戏说明函数
****************
void Game_explain()
{
printf(游戏说明:n
printf(
printf(
printf(①:游戏开始,系统随机产生一位不重复的N位数字。N的大小与等级n
printf(有关:n
printf(初级:N=3t中级:N=4t高级:N=5tn
printf(②:游戏者输入所猜的不重复数字,并按回车提交。n
printf(提交的数据位数应与N的大小一致,当数据位数大于N时,只取前N位;n
printf(③:系统将提交的数与它自动产生的数进行比较,输出结果n
printf(“*A*B”形式。其中A代表数字正确相应位置也正确,B代n
printf(表数字正确但位置不正确。如:1A3B表示游戏者有1个数字的位置n
printf(正确且数值也正确,除此以外,游戏者还猜对了3个数字,但位置不n
printf(对,即游戏者已经猜出4位数据,但有3个数据位置不对!n
printf(④:游戏者有限定次数的猜测机会,在规定次数内完成,n
printf(则游戏成功。否则,游戏失败。其中,猜测次n
printf(数与等级有关:n











}
printf(初级:10次t中级:9次t 高级:8次。tn
printf(⑤:按完成游戏所用的时间和次数计算游戏者所得分数,n
p rintf(游戏等级越高,猜测所用的次数越少,得分越高!n
printf(若游戏者得分比系统已 经保存的分数的高,将提示要求n
printf(输入游戏者信息,并且保存在最佳排行之中。n
printf(⑥:游戏者可以自行设置等级!n
printf(
printf(
p rintf(


3Game_ register.c排行榜等相关程序
#include
**************
记录最高分函数
**************
void Tiptop_record(int S)
{
FILE *fp;
tiptop n;
char *week[]={星期天星期一星期二星期三星期四星期五
星期六
time_t timep;
struct tm *t;
printf(恭喜您!n
printf(您获得本游戏的最高分!n
获取名字
printf(请输入您的姓名:
printf(
scanf(
获取时间
time(&timep);
t=gmtime(&timep);
t->tm_year=1900+t->tm_year;
t->tm_mon=1+t->tm_mon;
t->tm_hour=8+t->tm_hour;
=t->tm_year;
=t->tm_mon;
=t->tm_mday;
strcpy(,week[t->tm_wday]);


=t->tm_hour;
=t->tm_min;
=t->tm_sec;
获取等级
if(C==1)
strcpy(,初级
if(C==2)
strcpy(,中级
if(C==3)
strcpy(,高级
获取分数
=S;
if(C==1)
{
if((fp=fopen(
{
printf(打开文件失败!
exit(1);
}
fwrite(&n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==2)
{
if((fp=fopen(
{
printf(打开文件失败!
exit(1);
}
fwrite(&n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==3)
{
if((fp=fopen(
{
printf(打开文件失败!
exit(1);
}
fwrite(&n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
}
****************


输出最佳排行函数
****************
void Tiptop_output()
{
int i;
FILE *fp;
tiptop p,q,r;
if((fp=fopen(
{
printf(还没有最佳排行!
exit(1);
}
fread(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(
{
printf(还没有最佳排行!
exit(1);
}
fread(&q,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(
{
printf(还没有最佳排行!
exit(1);
}
fread(&r,sizeof(struct tiptop),1,fp);
fclose(fp);
if(==0&&==0&&==0)
{
printf(暂无最高分信息!
printf(
printf(是否直接进入游戏?刷新最佳排行信息?n
printf(是t2:否n
printf(
i=0;
scanf(
if(i==1)
{
printf(请设置游戏等级: n
Game_rank();
Game_main();
}
else


Menu_select();
}
else
{
printf(最佳排行:n
printf(等级t姓名t分数t游戏时间n
if(!=0)
{
printf(
printf(—%d—%dt
printf(
}
if(!=0)
{
printf(
printf(—%d—%dt
printf(
}
if(!=0)
{
printf(
printf(—%d—%dt
printf(
}
if(==0)
printf(初级暂无最高分信息!n
if(==0)
printf(中级暂无最高分信息!n
if(==0)
printf(高级暂无最高分信息!n

重置最佳排行榜
if(!=0&&!=0&&!=0)
{
printf(是否重置最佳排行?n
printf(是t2:否t
i=0;
scanf(
if(i==1)
{
=0;
=0;
=0;
if((fp=fopen(


{




















}
}
}
printf(打开文件失败!
exit(1);
}
fwrite(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(
{
printf(打开文件失败!
exit(1);
}
fwrite(&q,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(
{
printf(打开文件失败!
exit(1);
}
fwrite(&r,sizeof(struct tiptop),1,fp);
fclose(fp);
}



四 运行结果





























五 附录文档
1 游戏规则
(1)游戏软件 随机产生4个数字,但不显示,给用户提供输入提示符,让用户猜4个数字的值和位
置顺序。如果数字值 和位置顺序均正确,则猜数字成功。
(2)玩家有10次猜数字的机会,如果在10次之内仍末猜出正 确的数字值和数字位置顺序,则提示
用户游戏失败。
(3) 一旦玩家在10次的次数限制内猜出正确的数字值和位置顺序,则赢得游戏。
(4)当玩家赢得游戏后 ,会与排行榜中的前五名玩家的游戏记录比较,如果排名能够进入前五名,
则更新排行榜,使当前玩家成 为入榜选手。
(5)记分规则:猜数字所用次数即为分数,所以分数越少证明玩家水平越高。


2 工作安排
成员之间如何分配任务:我们根据各自对项目感兴趣的地 方进行合理分工,根据成员各自擅长
的方面进行规划,做自己感兴趣的工作。

每个人在项目中的角色:

3 理论上和技术上的选择
我们选择C语言作 为我们的编程语言,利用WINTC作为我们的编译环境,我们使用函数和
变量作为我们的主要参数,使 用,define 等对游戏进行编


4 我们遇到的困难 以及如何解决
对于初学C语言的我们而言,在这 次设计过程中,首先遇到的就是记忆困哪。因为老师在
课上讲过,所以对一些较基本容易的函数,都可以 记住,但是对于一些没有见过的,有些困难
的函数,我们就容易忘记,但是大家通过在网上查询,克服了 这个困难。程序编写出现困难也
需要查看书籍以及相关的资料,也在大家的共同努力下,克服了所有的困 难。


5.心得体会

一直以为用C语言编写一个程序 是一个十分困难的事情, 但是,通过认真学习,以及同
学之间的相互协作,团队精神。以前也曾认为过 C语言不是很实用, 但是通过小组合作 ,大家
一起学习 , 也充分认识到了C语言编程中的乐趣,也懂得了 , 我们可以更努力 ,去客服一
个个困难。




炖草鱼的做法-我好喜欢你的歌词


卫生条例-新教师述职报告


四年级下册语文教案-听说爱情回来过歌词


ppt动态背景图片-女孩别哭


adsl拨号-访谈节目


汾阳市-写我的作文


空格复制-毕淑敏作品


舟山美食-简历模板下载word格式