文曲星猜数字游戏java代码_文曲星猜数字游戏6步算法(含代码)

此文纯属个人爱好,不具任何可推广性,慎入,欢迎玩。

这是一个比较经典的益智游戏,叫做猜数字,很多人从小都在文曲星里玩过这游戏。

游戏规则:文曲星内部会产生四个不同的有序的一位数(1-9),我们对这四个数字进行猜测,每次猜测四个数字(包括了顺序),文曲星会返回A,B两个值,A代表我们猜的数字中正确数字的个数,B代表猜的数字中不仅正确而且处于正确位置上的数字的个数。如文曲星内部产生的是4327,我们猜1324,则A=3,表示3,2,4这3个数字是正确的,B=2,表示2,3这2个数字不仅正确还处于正确的位置。

游戏任务:最少次数地猜出文曲星内部的四个有序数字。

这里给出了一个通过逻辑判断,对任何情况至多6步可以猜出来的算法实现。根据有关资料的说明,6步内猜出所有情况貌似是这个游戏最快的结果。

算法:主要是复杂的逻辑判断。基本的想法是先在六步里判断出是哪4个数字,然后一次性根据前面积累的B值判断出正确的位置(如果此时有多个选择则选择其中之一输出,然后根据这次输出的反馈再判断)。

问题的关键是设置什么算法可以再六步内判断出这四个数字?这里给出的是,前三步总是做固定的猜测,分别是“1,2,3,4”,“2,1,5,6”,“7,8,1,2”, 设每次得到的A反馈分别为A1,A2,A3,然后根据sum=A1+A2+A3的值来做判断。显然sum>=3,因为没被猜得只有9。如果sum为3,那么9必然在其中,1,2必不在其中,然后可跟别根据A1,A2,A3的值来判断3,4,5,6,7,8 (当然还要更一步判断)。如果sum为4,这四个数必然为3,4,5,6,7,8 中的4个。。。当然如果你有兴趣,可以对其他的试着做类似的逻辑判断,建立在这些判断之下然后再进一步决定下面猜测什么。

这里给出一个C++实现的代码,欢迎测试。代码里能看清楚具体怎么根据sum的和来判断,以及怎么根据判断结果继续猜。如果你想让计算机猜的是8327,那么下面是执行的一个界面(比较粗糙,没好好做界面):

1f7242a2f75426b590f6727f43bf1bbb.png

//a test.cpp : Defines the entry point for the console application.//

#include "stdafx.h"

# include

#include

# define TRUE 1

# define FALSE 0

# define OK 1

typedef int Status;

void Read(int &a,int &b){ //读入数据 printf("please input the values of A,B:");

scanf_s("%d%d",&a,&b);

return ;

}

void Putout(int a[4]){ //输出数据 int i;

for(i=0;i<4;i++)

printf("%d",a[i]);

printf("\n");

}

Status Judje(int a[10][4],int b[10][2],int c[4]){

int k=0,i,j,sum=0;

for(j=0;j<10;j++)

{

if(a[j][0]==0)

sum++;

else

{

k=0;

for(i=0;i<4;i++)

if(a[j][i]==c[i]) k++;

if(k==b[j][1])

sum++;

}

}

if(sum==10)

return OK;

else

return FALSE;

}

Status little(int a[4]){ ´

int i,j,k=0;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(a[i]==a[j]) k++;

if(k>4)

return FALSE;

else

return OK;

}

void Produce(int c[4],int a[10][4],int b[10][2]){ //输出最终结果 int i=0,j[4],d[4];

while(a[i][0]!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值