C趣味编程百例(30)人机猜数游戏(2)

文章作者 100test 发表时间 2007:03:10 17:35:09
来源 100Test.Com百考试题网


92.人机猜数游戏(2)
将以上游戏双方倒一下,请人想一个四位的整数,计算机来猜,人给计算机提示信息,最终看计算机用几次猜出一个人“想”的数。请编程实现。
*问题分析与算法设计
解决这类问题时,计算机的思考过程不可能象人一样具完备的推理能力,关键在于要将推理和判断的过程变成一种机械的过程,找出相应的规则,否则计算机难以完成推理工作。
基于对问题的分析和理解,将问题进行简化,求解分为两个步聚来完成:首先确定四位数字的组成,然后再确定四位数字的排列顺序。可以列出如下规则:
1)分别显示四个1,四个2,......,四个0,确定四位数字的组成。
2)依次产生四位数字的全部排列(依次两两交换全部数字的位置)。
3)根据人输入的正确数字及正确位置的数目,进行分别处理:
(注意此时不出现输入的情况,因为在四个数字已经确定的情况下,若有3个位置正确,则第四个数字的位置必然也是正确的)
若输入4:游戏结束。
判断本次输入与上次输入的差值
若差为2:说明前一次输入的一定为0,本次输入的为2,本次交换的两个数字的位置是正确的,只要交换另外两个没有交换过的数字即可结束游戏。
若差为-2:说明前一次输入的一定为2,本次的一定为0。说明刚交换过的两个数字的位置是错误的,只要将交换的两个数字位置还原,并交换另外两个没有交换过的数字即可结束游戏。
否则:若本次输入的正确位置数<=上次的正确位置数
则恢复上次四位数字的排列,控制转3)
否则:将本次输入的正确位置数作为“上次输入的正确位置数”,控制转3)。
*程序与程序注释
#include
#include
void bhdy(int s,int b).
void prt().
int a[4],flag,count.
void main()
{
int b1,b2,i,j,k=0,p,c.
printf("Game guess your number in mind is # # # #.\n").
for(i=1.i<10&.&.k<4.i ) /*分别显示四个1~9确定四个数字的组成*/
{
printf("No.%d:your number may be:%d%d%d%d\n", count,i,i,i,i).
printf("How many digits have bad correctly guessed:").
scanf("%d",&.p). /*人输入包含几位数字*/
for(j=0.j a[k j]=i. /*a[]:存放已确定数字的数组*/
k =p. /*k:已确定的数字个数*/
}
if(k<4) /*自动算出四位中包的个数*/
for(j=k.j<4.j )
a[j]=0.
i=0.
printf("No.%d:your number may be:%d%d%d%d\n", count,a[0],a[1],a[2],a[3]).
printf("How many are in exact positions:"). /*顺序显示四位数字*/
scanf("%d",&.b1). /*人输入有几位位置是正确的*/
if(b1==4){prt().exit(0).} /*四位正确,打印结果。结束游戏*/
for(flag=1,j=0.j<3&.&.flag.j ) /*实现四个数字的两两(a[j],a[k]交换*/
for(k=j 1.k<4&.&.flag.k )
if(a[j]!=a[k])
{
c=a[j].a[j]=a[k].a[k]=c. /*交换a[j],a[k]*/
printf("No.%d:Your number may be: %d%d%d%d\n", count,a[0],a[1],a[2],a[3]).
printf("How many are in exact positins:").
scanf("%d",&.b2). /*输入有几个位置正确*/
if(b2==4){prt().flag=0.} /*若全部正确,结束游戏*/

相关文章


专家指迷:计算机等级考试证书的有效期是几年
C趣味编程百例(31)汉诺塔
NCRE每年考几次?各次考试是什么日期?
C趣味编程百例(30)人机猜数游戏(2)
2006年全国计算机等级考试二级Access考试-大纲
全国计算机等级考试机试须知
二级(Access数据库程序设计)考试-大纲
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛