猜数字游戏课程设计报告
鹤花-岑文本初仕萧铣
学校
《C程序设计》
课程设计报告
设计题目:猜数字游戏
附录完整源代码
专
业:
班 级:
学 生:
学 号:
指导教师:
起止时间: xxx.x.x -xxx.x.x
xxxx-xxxx年 xx 学期
1
录
1 、
程序设计描述
1.1 程序设计目的:
1.2 程序设计要求:
1.3、猜数字游戏的简介:
2 、程序设计内容:
2.1、游戏主要框架图:
2.2、开始游戏框架:
2.3、最佳排行框架:
2.4、游戏操作说明模块:
2.5、退出游戏系统:
2.6、游戏系统总流程图:
3、猜数字游戏源代码:
3.1、void
main()函数函数功能:
3.2、void game();双人游戏
void
pgame();单人游戏
3.4、排行榜模块函数功能:
3.5、继续游戏模块函数功能:
3.6、操作说明模块函数功能:
4、调试与测试:
4.1、调试方法
4.2、测试结果的分析与讨论
4.3、测试过程中遇到的主要问题及采取的解决措施
5、程序具体说明书:
6、程序设计心得:
7、参考文献
2
、 程序设计描述
1.1 程序设计目的:
综合使用所学过的C语
言程序设计知识,掌握结构化程序设计的基本思路和
方法,利用所学的基本知识和技能,发挥自学能力和
查找资料的能力,解决稍微
复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自
己
所学知识解决实际问题的能力,为以后的程序开发打下基础。
1.2 程序设计要求:
1、巩固和加强《C语言程序设计》课程的理论知识。
2、掌握C语言的基本概念、语法、语义和数据类型的使用特点。
3、掌握C语言程序设计的方法及编程技巧,能正确使用C语言编写程序。
4、进一步理解和运用结构化程设计的思想和方法;学会利用流程图。
5、掌握调试程序的基本方法及上机操作方法。
6、掌握书写程设计开发文档的能力,学会撰
写课程设计总结报告。课程设计
的思想和方法还可以作为做毕业论文时的参考资料。
7、通过查阅手册和文献资料,培养独立分析问题和解决问题的能力。为做毕
业设计打好基础。
8、培养自己的创新能力和创新思维。可以根据指导书和相关文献上的参考算
法,自己设计出相
应的应用程序。
9、培养自己良好的程序设计风格。在实际编程中,为了提高编程质量,对空
行、空格和注释均有要求。在课程设计书写代码时,应该严格按要求处理,以便
建立良好的程序设计风格
。
1.3、猜数字游戏的简介:
猜数字游戏(又称 Bulls and Cows )是
一种大概于20世纪中期兴起于英
国的益智类小游戏。一般由两个人玩,也可以由一个人和电脑玩,在纸
上、在网
上都可以玩。这种游戏规则简单,但可以考验人的严谨和耐心。
2
、程序设计内容
:
2.1、游戏主要框架图:
该模块为玩家提供猜数字游戏的主体
功能,即开始游戏、继续游戏、最佳排
行、操作说明、退出游戏。给用户一个清晰明了的操作界面!流程
图如下:
3
系统模块结构图
2.2、开始游戏框架:
开始游戏
双
人
游
戏
单
人
游
戏
返
回
主
菜
单
①单人游戏由系统产生4个随机数,
并按任意顺序排列,作为游戏的原始数
字供玩家进行猜数字游戏。
②双人游戏有主用户知己定义输入输入,再用另一用户猜测!
4
p>
单人、双人游:提示用户数值和位置全对的数字个数,和只有数值但位置
不对的数字
个数。
④原始数字显示:当用户在8次之内仍未能猜出原始数字和顺序时,系统提
示玩家失败
,并给玩家显示出原始数字和顺序。
2.3、最佳排行框架:
进入该界面后,进行提示由于技术问题此项有待解决!
个人认为最佳排行的应有的功能想法(有待改进)
该模块为玩家提供排行榜的浏览和清除功能
,包括按玩家成绩顺序浏览、按
玩家姓名浏览和清除排行榜功能。
2.4、游戏操作说明模块:
进入该界面后,进行提示由于技术问题此项有待解决!当玩家选
项为帮助功
能对应的选项数字时,进入帮助模块,给出用户猜数字的游戏规则和游戏中相关
提示
的含义和简单提示。
5
2.5、退出游戏系统:
该功能主要是在主界面操作,为方便用户退出游戏功能
2.6、游戏系统总流程图:
6
开始
功能选择
继最操
开
续
佳作
始
游排说
新
戏 行 明
游戏
输入0
输入0
输入0
单人
双人
主完家输入
系统内部随机出
0
0
输入数字
是否有
是
输出第一次结果
效四位
否
是否大达
是
输出结果
不输出结果
到3此?
并返回
否
提示再输
结束游戏
7
退
出
游
戏
输入0
、猜数字游戏源代码:
游戏主程序调用的函数如下:
#include
#include
#include
#include
#define N
4 随机抽N个数
#define NUM 8 NUM次猜数的机会
void
mainmenu();游戏主菜单
void bestmenu();最佳排行子菜单Best
ranking
void continumenu();继续游戏子菜单Continue to
game
void operationmenu();操作说明子菜单operation
explanation
void playgame();新游戏子菜单
void
game();双人游戏
void pgame();单人游戏
void
gotoxy(int x,int y)
{
COORD c;
c.X = x - 1;
c.Y = y -
1;
SetConsoleCursorPosition
(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
3.1、void main()函数函数功能:
功能:软件执行的入口,在函数所在
的程序头部包含可部分系统必须的
头文件和完成其他功能的源文件。在该函数中还提供了系统功能选择的
平
台,提示用户系统可用的功能有哪些和这些功能的选项代码。并给用户提供
输入功能选项代码
的接口,当用户输入选项代码后,即显示给用户相应的功
能处理界面或结果。
欢迎界面
8
while(1)
{ system(颜色代码
mainmenu();调用游戏主菜单
printf(请输入序号:
choose
=getchar();switch(choose)
{case '1':
do
{ int x;
playgame();调用开始新游戏子菜单
printf(请输入序号:
editch=getchar();
switch(editch)
{
case '1':game();
loop1:{printf( |****按0键返回两人游戏菜单
*****|n
scanf(
switch(x)
{
case 2:
printf(按0键返回
两人游戏菜单*****|n
goto loop1;
}break;
case '2':pgame();
loop2:{printf(按0返回两人
游戏菜单*********|n
scanf(
9
switch(x)
{
case 2: printf(按0返回两人
游戏菜单********|n
case '0':
system(清屏函数
printf(
goto loop2;
} break;
操作结束,返回主菜单!
getch();system(
}while(editch!='0');break;
case '2':
do
{
continumenu();调用继续游戏子菜单
printf(按“0”返回上一级菜单:
editch=getchar();switch(editch)
{case
'0':
system(清屏函数
printf(
操作结束,返回主菜单!
getch();system(break; }
}while(editch!='0');break;
case '3':
do{bestmenu();调用最佳排行子菜单
printf(按“0”返回上一级菜单:
editch=getchar();swit
ch(editch)
10
{ case '0':
system(
printf(操作结束,返回主菜单!
}
getch();system(
}while(editch!='0');break;
case '4': do
{
operationmenu();调用操作说明菜单
printf(按“0”返回上一级菜单:
editch=getchar();
switch(editch)
{ case '0':
system(
printf(操作结束,返回主菜单!
getch();system(
}
}while(editch!='0');break;
case
'0':退出猜数字游戏系统
system(printf(
游戏结束,退出系统!getch(); system(
exit(0);}}}
3.2、void game();双人游戏
11
单人游戏
功能:开始猜数字游戏和进行游戏过程
,调用系统内部以随机给出的数
字,提示用户输入猜数字,每次再输入完整后自动给出答案,在8次之内
未
猜出者提示失败,如果成功,进行提示。
3.3、#define N 4 随机抽N个数
#define NUM 8 NUM次猜数的机会
getnumber()函数
功能:由系统产生4个按任意顺序排列的随机整数。
3.4、排行榜模块函数功能:
void bestmenu();最佳排行子菜单
功能:主要是起调用作用,显示排行界面!(提示数据技术原因未制作)
void
bestmenu()猜数字游戏最佳排行子菜单函数
{
system(
printf(
printf(最佳排行 * * * *
|n
3.5、继续游戏模块函数功能:
void
continumenu();继续游戏子菜单Continue to game
功能:主要是起调用作用,显示继续游戏子菜单界面!(提示数据技术原因
未制作)
void continumenu()猜数字游戏继续游戏子菜单函数
{
getchar();
system(
printf(
printf(继续游戏 * * * * |n
3.6、操作说明模块函数功能:
void
operationmenu();操作说明子菜单operation explanation
功能:主要是起调用作用,显示操作说明子菜单界面!输出显示帮助系统。
12
双人游戏,由一方出数字,一方猜。出
数字的人要想好一个没有重复
数字的4位数,不能让猜的人知道。猜的人
就可以开始猜。每猜一个数字,出数者就要根据这个数字给出
几A几B,
其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确
而位置不对
的数的个数 如正确答案为 5234,而猜的人猜 5346,则是
1A2B,其中有一个5的位
置对了,记为1A,而3和4这两个数字对了,而
位置没对,因此记为 2B,合起来就是 1A2B,
在本软件中,在用户输入数
字后自动给出答案!猜数字次数限制:本猜数字游戏软件设有猜测次数的上<
br>限。根据计算机测算,采用严谨的猜测策略,任何数字最低8次就可猜出。
最快取胜的简单策略
:一是保证在猜测次数限制下赢得游戏,二是使用尽量少
的猜测次数。以目标追求的是最坏情况下的猜测
次数最少。 如启发式策略:这
类策略是猜数字游戏最常用的解法。其算法步骤如下:
甲、 首先猜 1234,得到第一个反馈(xAyB)。
乙、
从所有数字中,筛选出满足已知反馈的所有可能数字,称之为“可能
集”。
丙、 对于所
有数字(而不仅限于筛选出来的可能集),逐一评估每个数字的
“好坏”,并给其打分。选取得分最高的
那个数字猜。如果有多个数字的评分一
样高,则优先选取可能集中的数字。
丁、
重复乙、丙、丁步骤,直到猜出 4A0B 为止。
void
operationmenu()猜数字游戏操作说明子菜单函数
{
system(
printf(
printf(操作说明* * * *
* * |n
4、调试与测试:
4.1、调试方法:先运行游戏软件,按照提示进行操作,
对输出地数据进行判
断,并参考书籍进行查阅!
4.2、测试结果的分析与讨论:通过查找资料和同学讨论,测试正常。
13
4.3、测试过程中遇到的主要问题及采取的解决措施:同学讨论、上网查阅资
料对错误进行改
进!
5、程序具体说明书:
程序的功能说明:猜数字游戏是一个运行
在Windows平台下的小型游戏软
件,依据猜数字游戏的基本规则,给用户进行娱乐。游戏用户可以
选择开始游、
排行榜查看、帮助等主要功能。如果用户猜数字的次数超过8次,则提示用户游
戏
失败,如果在8次之内猜出4个数字和正确的顺序,则提示用户猜数字成功,
在帮助模块,用户可以查看
游戏规则,当熟悉规则后可以退出帮助模块。 本游
14
基本功能:新游戏:玩家可以在游戏区逐次猜数字,系统给
出玩家每次猜数字后的提示,包括数值、位
置均正确的数字个数和数值正确但位
置不正确的数字个数;查看排行榜:(待改进);清除排行榜:(待
改进); 帮助:
玩家通过帮助功能了解游戏规则和排行榜设置规则。
6、程序设计心得:
通过猜数字游戏课程设计了解其典型功能:即系统产生4个不重复的随机数
字、提供给玩家8次
猜测机会、提供给玩家每次猜数字后的正确数字和位置,让
玩家根据这些信息继续下一次的猜测。简单的
设计蕴涵了多种功能,简单而又全
面。
实验过程中,通过查询各资料基本掌握数字游戏功能的
实现步骤,并且熟练
了解流程图设计与编画过程。能够次实验的设计成功完成游戏,准确猜出所须的4位数。感觉对所学的知识有更进一步的了解。
附:完整代码,VS建工
程,COPY运行就OK
#include
#include
#include
#include
#define N
4 随机抽N个数
#define NUM 8 NUM次猜数的机会
15
游戏主菜单
void
bestmenu();最佳排行子菜单Best ranking
void
continumenu();继续游戏子菜单Continue to game
void
operationmenu();操作说明子菜单operation explanation
void playgame();新游戏子菜单
void game();双人游戏
void pgame();单人游戏
void gotoxy(int x,int y)
{
COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition
(GetStdHandle(STD_OUTPUT_HANDLE),
}
void main()
{
char
choose='0';
char editch='0';
char
continu='0';
char operation='0';
char
sortch='0';
char play='0';
system(颜色代码
system(清屏函数
gotoxy(20,3);
printf(
gotoxy(20,4);
16
c);
printf(欢 | | 迎 |
gotoxy(20,5);
printf(
gotoxy(20,6);
printf( | *
* | 1 |
gotoxy(20,7);
printf( |
*** *** | 0 |
gotoxy(20,8);
printf( | ** * * ** | 1 |
gotoxy(20,9);
printf( |
| 0 |
gotoxy(20,10);
printf( | *
* | 1 |
gotoxy(20,11);
printf( |
** ** | 0 |
gotoxy(20,12);
printf( | **** | 1 |
gotoxy(20,13);
printf( | 猜数字游戏 |
0 |
gotoxy(20,14);
printf(
|__________________________| 0 |
gotoxy(20,15);
printf(使 | 0101010 01 | 用
|
gotoxy(20,16);
printf(
gotoxy(20,18);
printf( 尊敬的用户你好!n
gotoxy(20,19);
printf(
你首先感谢你使用本软件!使用本软件请n
17
gotoxy(20,20);
printf(你注意以下事项!避免对你造成不必要的麻烦n
gotoxy(20,21);
printf(敬请谅解!n
gotoxy(20,22);
printf(一、请使用正版软件,如使用盗版造成的后n
gotoxy(20,23);
printf(果请自负!n
gotoxy(20,24);
printf(二、本软件是试用版本.如有疑问,请你联系n
gotoxy(20,25);
printf(作者,为你提供技术服务!n
gotoxy(20,26);
printf(三、本软件严格遵守国家关于软件相关的隐n
gotoxy(20,27);
printf(私法律!n
gotoxy(20,28);
printf(四、本软件完美兼容WIN7、XP!n
gotoxy(20,29);
printf( 更多精彩内容,请关注官网! n
gotoxy(20,30);
printf( 如果你同意以上内容,请进行下一步,
gotoxy(20,31);
printf(否则请你退出游戏!
gotoxy(20,33);
printf(按任意键进入猜数字游戏主菜单****
getch();
while(1)
18
{
system(颜色代码
mainmenu();调用游戏主菜单
printf(
请输入序号:
choose=getchar();
switch(choose)
{
case '1':
do
{ int x;
playgame();调用开始新游戏子菜单
printf(
请输入序号:
editch=getchar();
switch(editch)
{
case '1':game();
loop1:{printf(
|****按0键返回两人游戏菜
单*****|n }
scanf(
switch(x)
{
case 2:
printf( |****按0键返回两人游戏
菜单*****|n
goto loop1;
}break;
case '2':pgame();
loop2:{printf(
|******按0返回两人游戏菜
19
*********|n }
scanf(
switch(x)
{
case 2: printf(
|******按0返回两人游戏
菜单********|n
goto
loop2;
} break;
case
'0':
system(清屏函数
printf(
束,返回主菜单!
getch();
system(
break;
}
}while(editch!='0');
break;
case '2':
do
{
continumenu();调用继续游戏子菜单
printf(
单:
editch=getchar();
switch(editch)
{
20
操作结
按“0”返回上一级菜
case '0':
system(清屏函数
printf(
操作结
束,返回主菜单!
getch();
system(
break;
}
}while(editch!='0');
break;
case
'3':
do
{
bestmenu();调用最佳排行子菜单
printf(
editch=getchar();
switch(editch)
{
case
'0':
system(
printf(
束,返回主菜单!
getch();
system(
break;
21
按“0”返回上一级菜单:
操作结
}
}while(editch!='0');
break;
case '4':
do
{
operationmenu();调用操作说明菜单
printf(
按“0”返回上一级菜单:
editch=getchar();
switch(editch)
{
case '0':
system(
printf(
操作结束,返回主菜单!
case '0':退出猜数字游戏系统
system(
printf(
游戏结束,退
}
getch();
system(
break;
}while(editch!='0');
break;
出系统!
22
}
}
}
getch();
system(
exit(0);
void
mainmenu()猜数字游戏主菜单函数
{
}
void playgame()猜数字游戏开始游戏子菜单函数
{
system(清屏函数
printf(
printf(
|* * * * * 猜数字游戏 * * * * *|n
printf(
|..............................|n
23
system(清屏函数
printf(
printf(
|* * * * * 猜数字游戏 * * * * *|n
printf(
|..............................|n
printf(
| 请选择菜单序号(0~4) |n
printf(
|..............................|n
printf(
| 1----开始游戏 |n
printf(
| 2----继续游戏 |n
printf(
| 3----最佳排行 |n
printf(
| 4----游戏规则 |n
printf(
| 0----退出系统 |n
printf(
|..............................|n
printf
( | 请选择菜单序号(0~2) |n
printf(
|..............................|n
printf(
| 1----双人游戏 |n
printf(
| 2----单人游戏 |n
}
void continumenu()猜数字游戏继续游戏子菜单函数
{
getchar();
system(
printf(
printf(
|* * * * * * * 继续游戏 * * * * |n
printf(
|...............................|n
printf(
| 尊敬的用户你好! 首 |n
printf(
| 先感谢你使用本游戏 ,由 |n
printf(
| 于此功能处于研发中 ,如 |n
printf(
| 0----退出系统 |n
printf(
|..............................|n
printf(
| 对你造成不便, 敬请谅解 |n
printf(
| 感谢你的关注! 谢谢! |n
printf(
| 祝你游戏愉快 ! |n
}
void bestmenu()猜数字游戏最佳排行子菜单函数
{
system(
printf(
24
printf(
|...............................|n
print
f( |* * * * * * * 最佳排行 * * * *
|n
printf(
|...............................|n
printf(
| 尊敬的用户你好! 首 |n
printf(
| 先感谢你使用本游戏 ,由 |n
printf(
| 于此功能处于研发中 ,如 |n
printf(
| 对你造成不便, 敬请谅解 |n
printf(
| 感谢你的关注! |n
printf(
| 祝你游戏愉快 ! |n
}
void operationmenu()猜数字游戏操作说明子菜单函数
{
system(
printf(
printf( |* * * *
* * * 操作说明* * * * * * |n
printf(
|..................................|n
printf(
| 尊敬的用户你好! |n
printf(
| 首先感谢你使用本游戏,在 |n
printf(
| 户登陆游戏后,请选择“数字” |n
printf(
|...............................|n
printf(
| 并确定,进入新游戏!再更具统 |n
printf(
| 给出的提示,用户进行数据输入 |n
printf(
| ,进行猜测!感受猜字游戏的魅 |n
printf(
| 力! |n
printf( | 感谢你的关注!
|n
printf( |
祝你游戏愉快 ! |n
printf(
|..................................|n
25
void
game()双人游戏
{
int i,j,m;
int n;
int a[4];
int tar[4];
int A;
int B;
printf(
|*******主玩家输入完毕**********|
for(m=0;m
if(m==(NUM-1))
{
printf(
|**你还有最后一次机会哟!加
printf(
|******请输入4位阿拉伯数字******|n
for(i =0;i<4;i++)
{tar[i]=getch();输入任意数字
tar[i]=tar[i]-0x30;自己输入数字(主玩家输入数字,另一玩家再猜)
printf(保密数字用
油!**|n
26
}
printf(
|****请输入第%d 次猜测的数
字:
for(i=0;i<4;i++)
{
a[i]=getch();
a[i]=a[i]-0x30;
printf(
}
A=0;
B=0;
for(i=0;i
if(a[i]==tar[i])
A++;
}
for(i=0;i
for(j=0;j
if(a[i]==tar[j]&&i!=j)
B++;
}
}
printf(
printf(
printf(
|****猜测的游戏结果是:
27
printf(
if(A==N)
{
m=NUM;
printf(
n
}
else
if(m==7)
{
printf(
厉!**|n
printf(
for(i=0;i<4;i++)
printf(
printf(
}
}
}
void pgame()单人游戏
{
int i,j,m;
int tar[4];
int
A;
int B;
|*******恭喜你猜对啦!********|
|**真遗憾!你失败了,请再接再
|******正确答案是:
28
int n;
int a[4];
for(i=0;i
tar[i]=(int)rand()%10;
}
for(m=0;m
if(m==(NUM-1))
{
printf(
油!**|n
}
printf(
字:
for (i=0;i<4;i++)
{
a[i]=getch();
a[i]=a[i]-0x30;
printf(
}
printf(
|**你还有最后一次机会哟!加
|***请输入第%d 次猜测的数
29
A=0;
B=0;
for(i=0;i
if(a[i]==tar[i])
A++;
}
for(i=0;i
for(j=0;j
if(a[i]==tar[j]&&i!=j)
B++;
}
}
printf(
printf(
printf(
printf(
if(A==N)
{
m=NUM;
printf(
n
}
30
猜测的游戏结果是:
|*******恭喜你猜对啦!********|
|***
else if(m==7)
{
printf(
|****真遗憾!你失败了,请再接再
厉!**|n
}
}
}
printf(
|*********正确答案是:
for(i=0;i<4;i++)
printf(
printf(
参考文献
参考文献格式示例:
1、专著著录格式
<1>谭浩强.书名[C程序设计].版本(第四版).出版社:清华大学
出版社出
版日期:2010 年6月
<2>武爱平.书名[C语言程序设计].版本(第一
版).出版社:吉林大学出版
社出版日期:2010 年1月
2、名词注释
网站来源:http:
31
、部分代码来源
http:
32