猜数字游戏——复杂版

猜数字游戏:

计算机随机生成没有重复的n个数,用户从键盘输入猜测的数。每猜一次,电脑给出提示信息。如果用户输入的数跟计算机生成的数,数值和位置都完全相等,则胜出。

基本功能要求:(假设n=4)

1.       随机生成没有重复的4个数。(每个数字在0-9范围内)。

2.       用户从键盘输入4个不重复的数,程序能对用户输入的数与随机生成的数进行匹配,并给出提示信息:“有 x个数数值和位置都相同!有 y个数数值相同,但位置不同。”

3.       控制用户的尝试次数为10次。

4.       计算、输出并保存用户的得分,计分规则:总分是100分,每失败一次扣10分。

5.       有操作菜单,能根据不同选择运行不同功能:1:开始游戏!2:查看上次成绩!3:输出帮助信息!0:退出程序!

具体程序:

#include<stdio.h>                                                               //标准输入输出头文件
#include<stdlib.h>                                                              //头文件中系统函数,调用系统自带工具函数
#include<time.h>                                                                //时间函数头文件
void decide(int a[],int b[],int n,int m);                                       //自定义数组
int Rungame();
int Mark();
int Help();
int *p,*q;
int u,r,N=4;                                                                    //定义所需整形函数


int main()                                                                      //定义主函数
{
int a;

system("cls");                                                               //用于清除屏幕
printf("猜数字游戏>>>根目录\n");
printf("┏━━━━━━━━━━━━━━━━━┓\n");
printf("┃************1.开始游戏************┃\n");
printf("┃************2.查看上次成绩********┃\n");
printf("┃************3.输出帮助信息********┃\n");                      //输出初始状态根目录
printf("┃************4.系统设置************┃\n");
printf("┃************0.退出程序************┃\n");
printf("┗━━━━━━━━━━━━━━━━━┛\n");
printf("请选择操作:");
scanf("%d",&a);                                                              //用于地址输入,按格式输入要选择的功能


switch(a)                                                                    //使用switch选择结构,已达到功能选择效果
{
case 1:
system("cls");Rungame();                                             //先清屏后运行游戏
break;
case 2:
system("cls");
printf("你上一次的得分:%d\n\n",r);                                   //输出上一次得分
printf("输入任意整数返回根目录");
scanf("%d",&a);                                                      //用于返回
return(main());
break;
case 3:
system("cls");Help();                                                //输出帮助信息
break;
case 4:
system("cls");
printf("请您输入您需要猜的整数的个数(0-9)\n");                     //系统设置
printf("N=");
scanf("%d",&N);                                                    //输入设置的个数
return(main());
break;
case 0:
printf("**********谢谢使用**********\n(提示:按任意键退出)\n");      //正常退出程序
exit(0);
break;
default:
printf("输入不合法!\n输入任意整数返回根目录!\n");
scanf("%d",&a);                                                      //不正常输入处理
return(main());
break;                                                               //最后default语句带break使正常跳出switch语句
}
printf("\n");
}


int Rungame()                                                                    //运行游戏
{
int a[4],b[4],i,j,k,l,z;
srand(time(0));                                                             //随机函数发生器初始化函数,用以初始化随机数的生成
for(i=0;i<=(N-1);i++)                                                       //使用for语句实现循环
{
a[i]=rand()%10;
for(j=0;j<i;j++)                                                         
if(a[i]==a[j])
{
i--;
break;                                                          //中止该步骤
}
}
for(k=10;k>=1;k--)
{
u=k;                                                                     //游戏剩余次数
decide(a,b,4,4);
if(*p==N&&*q==N)                                                         //对比判断
{
printf("恭喜你,完全正确!!!\n你的分数:%d\n",10*k);
break; 
}
}
if(k==0)                                                                 //游戏终止
printf("您剩余的次数为0,游戏结束!!!\n");
printf("正确答案是:");
for(i=0;i<=(N-1);i++)
printf("%d",a[i]);
printf("\n");
l=10*k;
r=&l;
printf("返回根目录请按1,重新开始游戏请按其他整数");
scanf("%d",&z);
if(z==1)
{
system("cls");                                                      //用以清除屏幕
return(main());                                                     //返回
}
else                                                                    //使用if、else语句实现循环

system("cls");
return(Rungame());                                                     //返回开始游戏
}
}

int Help()                                                                       //输出帮助信息
{
int a;
printf("输入n个不重复的整数,每次输入后,计算机会判断其与系统产生的随机数的匹配程度并给出提示,您可以输入10次,每猜错一次扣10分,开局分数100分,如果用户输入的数组跟计算机生成的数组的数值和位置都完全相等,则胜出\n");
printf("\n\n按任意整数继续");
scanf("%d",&a);                                                              //输入数字返回
return(main());

}

void decide(int a[],int b[],int n,int m)                                     
{
int i,j,c=0,d=0;
printf("请您输入%d个不重复的整数,以空格隔开,剩余%d次:",N,u);
for(i=0;i<=(N-1);i++)
scanf("%d",&b[i]);
for(i=0;i<=(N-1);i++)                                                          //用for语句实现循环
{
for(j=0;j<=(N-1);j++)             
{
if(a[i]==b[j])
{
c++;  
if(i==j)                                                         //if,else语句 
d++;                                                         //判断有数字位置与数字相同
}
}
}


q=&d;
p=&c;
printf("有%d个数数值和位置都相同,有%d个数数值相同但位置不同\n",d,c-d);        //输出游戏提示信息

}




  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
猜数字  猜数字   猜数字可以算是一种益智类小游戏,一般两个人玩,也可以由一个人和电脑玩,可以在纸上、在网上都可以玩。这种游戏规则简单,但可以考验人的严谨和耐心。   目录   1 规则   1.1 次数限制   1.2 含重复数字的猜数字   2 解法   2.1 计算机解   2.2 推理解   2.3 代入解   2.4 其他   3 参看   规则   这个游戏的规则比较简单,一般两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜得人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。   如正确答案为5234,而猜的人猜5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为2B,合起来就是1A2B。   接着猜的人再根据出题者的几A几B继续猜,直到猜中为止。   次数限制   有的时候,这个游戏有猜测次数上的限制。根据计算机测算,这个游戏,如果以最严谨的计算,任何数字可以在7次之内猜出。而有些地方把次数限制为6次或更少,则会导致有些数可能猜不出来。而有些地方考虑到人的逻辑思维难以达到计算机的那么严谨,故设置为8次甚至10次。也有的没有次数上的限制。   含重复数字的猜数字   有一种使用范围比较狭窄的猜数字,是允许重复数字存在的猜数字,但由于其规则较复杂,故没有得到广泛的推广。其规则如下:   除了上面的规则外,如果有出现重复的数字,则重复的数字每个也只能算一次,且以最优的结果为准,   如正确答案为5543,猜的人猜5255,则在这里不能认为猜测的第一个5对正确答案第二个,根据最优结果为准的原理和每个数字只能有一次的规则,两个比较后应该为1A1B,第一个5位子正确,记为1A;猜测数字中的第三个5或第四个5和答案的第二个5匹配,只能记为1B。当然,如果有猜5267中的第一个5不能与答案中的第二个5匹配,因此只能记作1A0B。   解法   对于不同的人,常常会用到不同的解法   计算机解   通常采用的计算机解是通过排除法,即遍历所有可能的数,将不符合要求的数剃掉。   下面是一个计算机处理的例子:   for (int i = 0; i < Array.Count; i++) { if (Array与当前输出数字的比较 != 用户输入的与正确答案对比的结果) { Array.Remove(i); i--; } }      这个代码采用C#的语法,其中Array表示所有可能的数字的集合。这个例子为了方便说明,结合了语言的描述。   这样的方法充分利用了计算机计算速度快的优势,迅速排出不符合要求的数。通常第一次猜测的时间(有的引擎为第二次猜测)会在10秒左右,而随着猜测次数的不断增加,猜测的时间会越来越短,最后几乎不需要时间,这是由于集合中的数越来越少,排除需要的时间也随之减少。   推理解   计算机解释根据这种方法推广的。这种解法的中心思想是假设猜的这个数字是正确答案,即如果它为正确答案,那么这个数应该符合已经猜测的数及其结果。如已经有   1234 0A0B   那么下一步就不能猜含有1234中任一数字的数,因为如果正确答案含1234中任一,结果就不可能为0A0B。   这种解法对猜者要求较高,通常,可能会被定式思维所干扰,导致难以猜出。   基于这个解法,根据个人思维风格和起始数字选择的不同,以及对出题者出数风格的猜测,有时可以把猜测次数控制在5步内,但不总能在5步内猜出。   使用这种解法需要考虑的时间很久,和计算机解正好相反,人使用这种方法,通常随着猜测次数的增加,需要考虑的东西不断增多,反而考虑的时间会变得越来越长。   代入解   还有一种方法,在人的猜测中很常用,即将推理出不可能含有的数字,代入,察看那些数字是有的。   但这种方法其猜测次数难以确定,且通常的猜测次数比推理解多。   其他   可能还有其他的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值