近来整理硬盘,偶然找到去年冬天写的猜数字程序,运行时,依旧会出现问题。重新修改后,将它整理于此,供自己日后复习。
首先,我们先来看看这个程序的设计要求:
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日星期五