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

本文介绍了一个猜数字游戏程序的设计与实现。程序通过随机生成四位不重复数字,玩家尝试猜测该数字,系统根据猜测提供反馈,直至猜中或用尽机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

        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日星期五

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值