猜数字-C语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
猜数字,又称bulls_and_cows,是一种古老的的密
码破译类游戏。
通常适于两人或多人一起玩。
以两人游戏为例:由一方先设定一个数字,而另一方来猜。
设定数字的人要想好一个没有重复数字的、十进制的四位数(即四数位、十数码、不含重复数字),且不能让猜的人知道。
然后,猜的人就可以开始“猜数字”了。
猜数方每猜一个数字,出数者就要根据对方所猜的数字给出“几a几b”的回应;其中,a前面的数字表示位置正确的数的个数,而b前的数字表示数字正确而位置不对的数的个数。
举例来说——若出数者设定的正确答案为2358,而猜的人猜2485,这时的情况,就是1a2b;其中,第一个2的数字和位置都已经对了,记为1a,而5和8这两个数字对了,位置没对,因此记为2b。
同理——若出数者设定的正确答案是1234,而猜的人猜4321,那结果就是
0a4b,数字全中,但位置全错。
以此类推……
在猜完一轮后,猜的人可再根据上一次猜测时得到的“几a几b”情况接续推理,直到猜中正确答案(即4a0b)为止。
…………
这并不是一个特别复杂的游戏,但它涉及到了记忆、推理、计算和运气等诸多因素,玩起来……也并没有那么简单。
因此,当主办者说出“猜数字”这三个字后,底下的人也都各自在心里打起了算盘。
而他们的反应,自然也都在主办者的意料之中……
主办者并没有停顿太久,便接着说道:“当然了,不可能是普通的猜数字,因为那太容易了……无论是采用标准规则(四数位、十数码、不含重复数字),还是mastermind规则(四数位、六数码、含重复数字),只要掌握了正确的解法。
七次左右就一定能猜出来,运气好的五次以内就行……”他顿了顿,“所以……我稍稍提高了难度,改为了——六数位、十数码、含重复数字。
”
提示答案换算
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
int red[8]={0};
void zdy();
void record();
void mode();
void ccc(int wei,int ma,int chong,int mod);
//标准规则(四数位、十数码、不含重复数字)
//mastermind规则(四数位、六数码、含重复数字)
//六数位、十数码、含重复数字。
int main()
{
int keep=0;
printf("木有教程:请按空格+回车跳过。
\n");
while(getchar()!=' ');
getchar();
while(keep!=-1)
{
printf("猜猜猜数字\n(1)、新游戏\n(2)、最新纪录\n(3)、退出\n(输入括弧中的序号并确定)\n");
scanf("%d",&keep);
//getchar();
switch(keep)
{
case 1:mode();keep=0;break;
case 2:record();keep=0;break;
case 3:keep=-1;break;
default :printf("抱歉,没有这个选项,请重新输入
\n\n\n\n");keep=0;break;
}
}
return 0;
}
void mode()
{
int keep=0;
while(keep!=-1)
{
printf("(1)、标准规则(四数位、十数码、不含重复数字)\n(2)、mastermind规则(四数位、六数码、含重复数字)\n(3)、六数位、十数码、含重复数字。
\n(4)、自定义\n(5)、返回\n");
scanf("%d",&keep);
switch(keep)
{
case 1:ccc(4,10,0,0);keep=-1;break;
case 2:ccc(4,6,1,2);keep=-1;break;
case 3:ccc(6,10,4,4);keep=-1;break;
case 4:zdy();keep=-1;break;
case 5:keep=-1;break;
default :printf("抱歉,没有这个选项,请重新输入\n\n");keep=0;break;
}
}
}
void zdy()
{
int wei,ma,chong;
printf("请依次输入位数(1~9),进制数(1~10),和是否含重复数字(1、是,0、否)\n(各数字间用空格或回车隔开)\n");
scanf("%d%d%d",&wei,&ma,&chong);
ccc(wei,ma,chong,6);
}
void ccc(int wei,int ma,int chong,int mod)
{
int t,temp=0,number,i,j,k=0,a,b,ture[wei],cai[wei];
char ch;
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样t=time(NULL);
for(i=0;i<wei;i++)
{
number = rand() % ma; //产生0-ma的随机数
if(chong==0)
{
for(j=0;j<i;j++)
{
if(number==ture[j])
{
i--;
k=1;
}
}
if(k==1)
{
k=0;
continue;
}
}
ture[i]=number; ch=number+'H'; printf("%c ",ch); }
putchar('\n'); while(1)
{
scanf("%d",&k);
for(i=wei-1;i>=0;i--) {
cai[i]=k%10;
k=k/10;
}
for(a=b=j=0;j<wei;j++) {
if(cai[j]==ture[j]) {
a++;
}
else
for(i=0;i<wei;i++) {
if(cai[j]==ture[i])
{
b++;
break;
}
}
}
temp++;
printf("第%d次猜测结果为%dA%dB\n",temp,a,b);
if(a==wei&&b==0)
{
t=time(NULL)-t;
red[mod]=temp;
red[mod+1]=t;
printf("共猜测了%d次,用时%d秒。
\n\n",temp,t); break;
}
}
}
void record()
{
printf("\t\t模式\t\t次数\t\t用时\n");
printf("\t\t模式1\t\t%d\t\t%d\n",red[0],red[1]); printf("\t\t模式2\t\t%d\t\t%d\n",red[2],red[3]); printf("\t\t模式3\t\t%d\t\t%d\n",red[4],red[5]); printf("\t\t自定义\t\t%d\t\t%d\n",red[6],red[7]); }。