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

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

{

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

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;} /*若全部正确,结束游戏*/

else if(b2-b1==2)bhdy(j,k); /*若上次与本次的差为2,则交换两个元素即可结束*/ else if(b2-b1==-2) /*若上次与本次的差为-2,则说明已交换的(a[j],a[k])是错误的将(a[j],a[k]还原后,只要交换另外两个元素即可结束游戏*/

{

c=a[j];a[j]=a[k];a[k]=c;

bhdy(j,k);

}

else if(b2<=b1)

{

c=a[j];a[j]=a[k];a[k]=c; /*恢复交换的两个数字*/

}

else b1=b2; /*其它情况则将新输入的位置信息作为上次的位置保存*/

}

if(flag) printf("You input error!\n"); /*交换结果仍没结果,只能是人输入的信息错误*/

}

void prt() /*打印结果,结束游戏*/

{

printf("Now your number must be %d%d%d%d.\n",a[0],a[1],a[2],a[3]);

printf("Game Over\n");

}

void bhdy(int s,int b)

{

int i,c=0,d[2];

for(i=0;i

if(i!=s&&i!=b) d[c++]=i;

i=a[d[1>;a[d[1>=a[d[0>; a[d[0>=i; /*交换除a[s]和a[b]以外的两个元素*/

相关文档
最新文档