关于集合思想,人机猜数

来源:互联网 发布:2017非农数据公布时间 编辑:程序博客网 时间:2024/04/30 10:03

     这次程序设计的题目是: 由计算机“想”一个四位数,请人猜这个四位数是多少。人输入这个四位数后,计算机首先判断这四个数中有几个猜对了,称之为B,并且在猜对的数字中又有几位位置也是对的,称之为A,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数为止。请编程实现该游戏,游戏结束时,显示人猜一个数用了几次。

    第一个问题是:如何让计算机想一个四位数,因为没有明确要求所以可以是重复的四位数,并且要是随机的,不能每次都是一样的数字,此时想到的是srand和rand(),调用了所谓的“种子”,头文件是<time.h>,如何使用如下:

       srand((unsigned)time(NULL));
for(i=0;i<4;i++)
{
z=rand();
str[i]=z%10;
}

    为什么是用for循环存储进数组呢,这就是第二个问题:如何让玩家猜的数与系统想的数做比较?我太菜了所以想不出好办法,所以选择了用数组的形式,把计算机的数存进数组,也让玩家输入的数存进数组,数组与数组间比较,还是比较简单的,运用两个for循环,

for(i=0;i<4;i++)                                  //  这里面的数组cai里的4位数是玩家所猜的,数组str里的4位数是计算机所给的;
{
if(cai[i]==str[i])                 // 这里面的a,就是题目所说的A,数字对且位置对,b是题目所说的B,数字对但位置错;
{
a++;                          // 将数组里的每个数与另一个数组比较,完全一样就可以让a加1;
}
for(j=0;j<4;j++)
{
if(cai[i]==str[j])
{

b++;                   //  同理,b的加1法则也是一样;

str[j]=-1;          // 为何得出b加1后,将计算机所给的那个比较过的数字变成-1?  
break;        //  因为不这么做,会导致之后一样的数字也能让b加1,从而结果不准确,所以变成-1可以避免出现这样状况

}

}

}

b=b-a;                 // 这里因为b和a的计算方式相同,在没变数组的情况下,所以要先减掉a的值;

    在那之后,是要恢复计算机数组str的,此处调用memcpy库函数, 即memcpy(s1,s2,sizeof(int)*4)这个格式的意思是将s2数组的前四位整型数字复制给s1数字,我们在这里面随便给第三个数组s3,先存进str数组的4位数,等循环结束就将s3的给还str;

     问题三,如何实现多次循环猜数,而不是只猜一次就结束游戏?设定好a!=4的情况不停止循环就ok,如下:

   while(a!=4)

……

    至于一些菜单界面和保护程序,就看图就ok(这个自己设计不麻烦),下面给出全部代码:

     对了,这其中的system(”cls“);是清屏作用,纯粹好看,system(”color 0A“);是改变背景颜色和字体颜色,0-9是变背景颜色,A-F是变字体颜色,纯粹是为了醒目;

     本次使用的是C语言,是在vc6环境下运行的,所以没有调用random库函数(vc不认识!)

1 0
原创粉丝点击