程序设计之四:猜数字(C)

来源:互联网 发布:jira 7源码 编辑:程序博客网 时间:2024/06/06 05:10

         近来整理硬盘,偶然找到去年冬天写的猜数字程序,运行时,依旧会出现问题。重新修改后,将它整理于此,供自己日后复习。

         首先,我们先来看看这个程序的设计要求:

        1、游戏开始,电脑随机产生一个数字不重复的四位数;2、将您猜的数填在框内按回车或者确定按钮提交;3、电脑会将您提交的数与它自动产生的数进行比较,结果显示成"*A*B"。A代表位置正确数字也正确,B代表数字正确但位置不正确,比如:"2A2B"表示您有2个数字的位置正确且数值也正确,除此以外,您还猜对了2个数字,但位置不对;4、您共有15次机会,在15次内,如果结果为“4A0B”,游戏成功。如果15次里您都没有猜对游戏失败。

         在了解了规则以后,我考虑了如下的算法:

         首先应当由计算机随机生成一个4位的随机数,我给它的约束是每一位都不重复,将这个数载入内存。接着,再定义一个函数Compare,判断玩家输入的数字与随机数每一位的相同情况,并以*A*B的形式将这个值返回玩家。系统自动判断,如果A前面的系数为4,游戏结束,否则,继续前面的过程。

在明白了算法之后,我编写了如下的程序。当然,由于本人能力有限,本程序中仍会存在漏洞。

程序清单如下:

// 猜数字.cpp : 定义控制台应用程序的入口点。///////////////////////////////////////////////////////////////////////作者:钩鸿踏月//版本:2010年2月24日 Ver 1.0//      2011年4月21日 Ver 1.1///////////////////////////////////////////////////////////////////#include <stdlib.h>  #include <stdio.h>  #include <time.h>   /////////////////////////////////////////////////////////////////////函数名:ProduceRandomNumber()//功能:四位随机数的产生,并依次将四个位上的数保存下来void ProduceRandomNumber(int data[4]){    int RandomNumber;    do    {       srand(    (unsigned)time(    NULL    )    );         RandomNumber=(rand()%100)*(rand()%100);       data[3]=RandomNumber%10;       data[2]=RandomNumber/10%10;       data[1]=RandomNumber/100%10;       data[0]=RandomNumber/1000%10;    }while(RandomNumber<1000||data[0]==data[1]||data[0]==data[2]           ||data[0]==data[3]||data[1]==data[2]||data[1]==data[3]||           data[2]==data[3]||data[0]==0);    return ;} /////////////////////////////////////////////////////////////////////函数名:Compare()//统计每一次的数字和随机数匹配的结果,并返回int Compare(int Data1[4],int Data2[4]) {    int i=0,Count=0; //设置循环变量i和计数变量Count    int RIGHT=0,WRONG=0;    for(i=0;i<4;i++)    {       {           if(Data1[i]==Data2[i])              RIGHT++;//统计RIGHT的值,即m       }       for(Count=0;Count<4;Count++)           if(Count!=i)           {              if(Data1[i]==Data2[Count])                  WRONG++;//统计WRONG的值,即n           }    }    printf("%dA%dB\n",RIGHT,WRONG); //输出mAnB的结果    return(RIGHT); /返回RIGHT的值} /////////////////////////////////////////////////////////////////////主函数,程序开始执行int main(){    int data[4],i; //定义data[4],用于保存随机数    int CHOOSE,RIGHT;    int Count=0,Guess[4];    ProduceRandomNumber(data); //生成随机数    printf("猜数字游戏,Release 2011.4.21,Ver:1.1\n");    printf("欢迎进入猜数字游戏,现在请输入您的答案:\n");    for(i=0;i<4;i++)       scanf("%1d",&Guess[i]); //玩家输入    while(Count<8)    {//判断输入的数字每一位是否相同,给出相应的操作       if(Guess[0]==Guess[1]||Guess[0]==Guess[2]||Guess[0]==Guess[3]           ||Guess[1]==Guess[2]||Guess[1]==Guess[3]||Guess[2]==Guess[3])       {           Count++;           printf("您的输入不合法,并且您浪费了一次机会,请继续输入:\n");           for(i=0;i<4;i++)               scanf("%1d",&Guess[i]);           continue;       }       else       {           RIGHT=Compare(data,Guess);           if(RIGHT==4)           {              printf("恭喜,你猜对了!);break;           }           else           {              Count++;              printf("很遗憾,您没有猜对。请输入您的答案:\n");              for(i=0;i<4;i++)                  scanf("%1d",&Guess[i]);           }           continue;       }    }    if(Count==8) //当猜了8次后,提示    {       printf("你已经猜了8次了,还要继续吗?(1:yes/0:false)");       scanf("%d",&CHOOSE);    }    if(CHOOSE==1) //选择1,则继续,反之,退出程序    {       for(i=0;i<4;i++)           scanf("%1d",&Guess[i]);       while(Count<15) //当次数小于15次时,继续进行游戏       {//判断输入的数字每一位是否相同,给出相应的操作           if(Guess[0]==Guess[1]||Guess[0]==Guess[2]||Guess[0]==Guess[3]              ||Guess[1]==Guess[2]||Guess[1]==Guess[3]||Guess[2]==Guess[3])           {              Count++;              printf("您的输入不合法,并且您浪费了一次机会,请继续输入:\n");              for(i=0;i<4;i++)                  scanf("%1d",&Guess[i]);               continue;           }           else           {              RIGHT=Compare(data,Guess);              if(RIGHT==4)              {                  printf("恭喜,你猜对了!\n");break;              }              else              {                  Count++;                  printf("很遗憾,您没有猜对。请输入您的答案:\n");                  for(i=0;i<4;i++)                     scanf("%1d",&Guess[i]);              }              continue;           }       }       if(Count==15) //15次满后,自动结束游戏           printf("你已经猜了15次啦,是不是方法不对啊?休息一会再来玩吧!\n");    }    else       printf("游戏结束!n");    system("pause");}

2011年4月22日星期五

原创粉丝点击