这是一个比较经典的益智游戏,叫做猜数字,很多人从小都在文曲星里玩过这游戏。
游戏规则:文曲星内部会产生四个不同的有序的一位数(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,那么下面是执行的一个界面(比较粗糙,没好好做界面):
// a test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
# include <math.h>
#include <stdio.h>
# 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) i++;
for(j[0]=0;j[0]<4;j[0]++)
for(j[1]=0;j[1]<4;j[1]++)
for(j[2]=0;j[2]<4;j[2]++)
for(j[3]=0;j[3]<4;j[3]++)
{
if(b[i-1][1]!=4)
{
d[0]=c[j[0]]; d[1]=c[j[1]]; d[2]=c[j[2]]; d[3]=c[j[3]];
if(little(d)&&Judje(a,b,d))
{
a[i][0]=d[0];a[i][1]=d[1];a[i][2]=d[2];a[i][3]=d[3];
Putout(a[i]);
Read(b[i][0],b[i][1]);
i++;
}
}
else
{
printf("Right Answer! Thank You To Play!\n");
return;
}
}
printf("Your Input is wrong!\n");
return;
}
int _tmain(int argc, _TCHAR* argv[]){
int j,i=0,b[10][2]={0};
int a[10][4]={0};
int sum=0,c[4]={0};
char w;
printf("think about 4 ordered and different digits and enter 's' to start:");
scanf_s("%c",&w);
a[0][0]=1;a[0][1]=2;a[0][2]=3;a[0][3]=4;
Putout(a[0]);
Read(b[0][0],b[0][1]);
if(b[0][0]==4&&b[0][1]==4)
{
printf("Right Answer! Thank You To Play!\n");
return 0;
}
if(b[0][0]==4&&b[0][1]!=4)
{
for(i=0;i<4;i++) c[i]=a[0][i];
Produce(c,a,b);
return 0;
}
sum=sum+b[0][0];
a[1][0]=2;a[1][1]=1;a[1][2]=5;a[1][3]=6;
Putout(a[1]);
Read(b[1][0],b[1][1]);
if(b[1][0]==4&&b[1][1]==4)
{
printf("Right Answer! Thank You To Play!\n");
return 0;
}
if(b[1][0]==4&&b[1][1]!=4)
{
for(i=0;i<4;i++) c[i]=a[1][i];
Produce(c,a,b);
return 0;
}
sum=sum+b[1][0];
a[2][0]=7;a[2][1]=8;a[2][2]=1;a[2][3]=2;
Putout(a[2]);
Read(b[2][0],b[2][1]);
if(b[2][0]==4&&b[2][1]==4)
{
printf("Right Answer! Thank You To Play!\n");
return 0;
}
if(b[2][0]==4&&b[2][1]!=4)
{
for(i=0;i<4;i++) c[i]=a[2][i];
Produce(c,a,b);
return 0;
}
sum=sum+b[2][0];
//do logical judgement according to the 3 results above
switch(sum)
{
case 3:
c[0]=9;
if(b[0][0]==b[1][0]&&b[1][0]==b[2][0])
{
a[3][0]=9;a[3][1]=3;a[3][2]=5;a[3][3]=7;
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4) break;
a[4][0]=3;a[4][1]=4;a[4][2]=5;a[4][3]=8;
Putout(a[4]);
Read(b[4][0],b[4][1]);
if(b[3][0]-b[4][0]==2&&b[3][0]==3)
{
c[1]=3;c[2]=6;c[3]=7;
}
if(b[3][0]-b[4][0]==1&&b[3][0]==3)
{
c[1]=4;c[2]=5;c[3]=7;
}
if(b[3][0]-b[4][0]==1&&b[3][0]==2)
{
c[1]=4;c[2]=6;c[3]=7;
}
if(b[3][0]-b[4][0]==0&&b[3][0]==3)
{
c[1]=3;c[2]=5;c[3]=8;
}
if(b[3][0]-b[4][0]==0&&b[3][0]==2)
{
c[1]=4;c[2]=6;c[3]=7;
}
if(b[3][0]-b[4][0]==-1&&b[3][0]==2)
{
c[1]=4;c[2]=5;c[3]=8;
}
if(b[3][0]-b[4][0]==-1&&b[3][0]==1)
{
c[1]=4;c[2]=6;c[3]=8;
}
}
else{
a[3][0]=9;
for(j=0;j<3;j++)
{
if(b[j][0]==2)
{
a[3][1]=c[1]=2*j+3; a[3][2]=c[2]=2*j+4;
}
if(b[j][0]==1) a[3][3]=c[3]=2*j+3;
}
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==3)
{
c[3]=c[3]+1;
break;
}
}
break;
case 4:
i=0;
for(j=0;j<3;j++)
if(b[j][0]==2)
{
c[i]=2*j+3; c[i+1]=2*j+4;i=i+2;
}
if(i==4) break;
a[3][1]=c[0];a[3][0]=c[1];
for(j=0;j<3;j++)
if(b[j][0]==1)
{
a[3][i]=c[i]=2*j+3;
i=i+1;
}
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4) break;
if(b[3][0]==2)
{
c[3]=c[3]+1;
c[2]=c[2]+1;
break;
}
c[2]=a[4][0]=a[3][2]+1;a[4][1]=a[3][3];a[4][2]=a[3][1];a[4][3]=a[3][0];
Putout(a[4]);
Read(b[4][0],b[4][1]);
if(b[4][0]==4) break;
else
{
c[2]=c[2]-1;c[3]=c[3]+1;
break;
}
case 5:
c[0]=a[3][0]=9;i=1;
for(j=0;j<3;j++)
{
if(b[j][0]==3)
{
c[i]=a[3][i]=2*j+3; c[i+1]=a[3][i+1]=2*j+4;
a[3][3]=1;
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4) break;
if(b[3][0]==3)
{
c[3]=2;
break;
}
}
if(b[j][0]==2)
{
c[i]=a[3][i]=2*j+3;
i=i+1;
}
}
c[3]=a[3][3]=1;
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4) break;
a[4][0]=a[3][2]+1;a[4][3]=a[3][1];a[4][1]=1;a[4][2]=2;
Putout(a[4]);
Read(b[4][0],b[4][1]);
if(b[3][0]-b[4][0]==2&&b[3][0]==3)
{
c[1]=1;c[2]=a[3][1]+1;c[3]=a[3][2];
}
if(b[3][0]-b[4][0]==1&&b[3][0]==3)
{
c[1]=2;c[2]=a[3][1];c[3]=a[3][2]; ;
}
if(b[3][0]-b[4][0]==1&&b[3][0]==2)
{
c[1]=2;c[2]=a[3][1]+1;c[3]=a[3][2];
}
if(b[3][0]-b[4][0]==0&&b[3][0]==3)
{
c[1]=1;c[2]=a[3][1];c[3]=a[3][2]+1;
}
if(b[3][0]-b[4][0]==0&&b[3][0]==2)
{
c[1]=2;c[2]=a[3][1]+1;c[3]=a[3][2];
}
if(b[3][0]-b[4][0]==-1&&b[3][0]==2)
{
c[1]=2;c[2]=a[3][1];c[3]=a[3][2]+1;
}
if(b[3][0]-b[4][0]==-1&&b[3][0]==1)
{
c[1]=2;c[2]=a[3][1]+1;c[3]=a[3][2]+1;
}
break;
case 6:
i=0;
for(j=0;j<4;j++)
if(b[j][0]==2) i++;
if(i==3)
{
c[0]=a[3][0]=9;c[1]=a[3][1]=3;c[2]=a[3][2]=5;c[3]=a[3][3]=7;
Putout(a[3]);
Read(b[3][0],b[3][1]);
a[4][0]=3;a[4][1]=4;a[4][2]=5;a[4][3]=8;
Putout(a[4]);
Read(b[4][0],b[4][1]);
if(b[3][0]-b[4][0]==1&&b[3][0]==2)
{
c[1]=3;c[2]=6;c[3]=7;
}
if(b[3][0]-b[4][0]==0&&b[3][0]==1)
{
c[1]=4;c[2]=5;c[3]=7;
}
if(b[3][0]-b[4][0]==0&&b[3][0]==1)
{
c[1]=4;c[2]=6;c[3]=7;
}
if(b[3][0]-b[4][0]==-1&&b[3][0]==2)
{
c[1]=3;c[2]=5;c[3]=8;
}
if(b[3][0]-b[4][0]==-1&&b[3][0]==1)
{
c[1]=4;c[2]=6;c[3]=7;
}
if(b[3][0]-b[4][0]==-2&&b[3][0]==1)
{
c[1]=4;c[2]=5;c[3]=8;
}
if(b[3][0]-b[4][0]==-2&&b[3][0]==0)
{
c[1]=4;c[2]=6;c[3]=8;
}
c[0]=1;
for(j=0;j<4;j++)
a[5][j]=c[j];
Putout(a[5]);
Read(b[5][0],b[5][1]);
if(b[5][0]==4)
break;
else
{
c[0]=2;
break;
}
}
else{
for(j=0;j<3;j++)
if(b[j][0]==3)
{
a[3][1]=c[1]=2*j+3; a[3][2]=c[2]=2*j+4;
}
for(j=0;j<3;j++)
if(b[j][0]==2)
a[3][3]=c[3]=2*j+3;
a[3][0]=c[0]=1;
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4)
break;
if(b[3][0]==2)
{
c[0]=2;c[3]=c[3]+1;
break;
}
a[4][0]=c[0]=a[3][0]+1; a[4][3]=a[3][1]; a[4][1]=a[3][2]; a[4][2]=a[3][3];
Putout(a[4]);
Read(b[4][0],b[4][1]);
if(b[4][0]==4)
break;
if(b[4][0]==2)
{
c[0]=1;c[3]=c[3]+1;
break;
}
}
case 7:
c[0]=a[3][1]=1;c[1]=a[3][2]=2;c[2]=a[3][0]=9;
for(j=0;j<3;j++)
if(b[j][0]==3)
a[3][3]=c[3]=2*j+3;
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4)
break;
if(b[3][0]==3)
{
c[3]=c[3]+1;
break;
}
case 8:
c[0]=a[3][3]=1;c[1]=a[3][2]=2;
for(j=0;j<3;j++)
if(b[j][0]==4)
{
a[3][3]=c[2]=2*j+3;a[3][0]=c[3]=2*j+4;
break;
}
i=0;
for(j=0;j<3;j++)
if(b[j][0]==3)
{
a[3][i]=c[i+2]=2*j+3;
i=i+1;
}
Putout(a[3]);
Read(b[3][0],b[3][1]);
if(b[3][0]==4)
break;
if(b[3][0]==2)
{
c[3]=c[3]+1;
c[2]=c[2]+1;
break;
}
c[2]=a[4][2]=a[3][0]+1; a[4][1]=a[3][3]; a[4][0]=a[3][1]; a[4][3]=a[3][2];
Putout(a[4]);
Read(b[4][0],b[4][1]);
if(b[4][0]==4)
break;
else
{
c[2]=c[2]-1;c[3]=c[3]+1;
break;
}
default:printf("ERROR input!"); break;
}
Produce(c,a,b);
scanf_s("%d",&j);
}
分享到:
相关推荐
标题中的“猜数字”游戏算法破解,通常是指一种基于逻辑推理和概率分析的解谜方法。这类游戏的目标是猜测一个预设的数字序列,玩家每次可以输入一组数字进行尝试,系统会给出提示,如“猜对了几个数字”或者“位置...
猜数字游戏是一个经典的编程...通过分析这个猜数字游戏的源代码,我们可以深入理解基础的编程概念,如控制流程、数据类型、函数和类的设计,以及特定环境下的用户交互。同时,这也是提升编程技巧和逻辑思维的好例子。
游戏名称:简单猜数字游戏 游戏描述: 这是一个简单的猜数字游戏,玩家需要在限定的次数内猜出计算机随机生成的一个1到100之间的数字。每次猜测后,程序会提示玩家猜的数字是太大、太小还是正确。玩家有10次机会来...
《VC++实现的猜数字游戏源代码解析》 在编程世界中,开发一款简单的猜数字游戏是学习和熟悉编程语言的常见练习。本项目“vc++基于对话框的猜数字游戏源代码.rar”提供了一个使用Microsoft Visual C++(简称VC++)...
标题中的“猜数字源代码”指的是一个基于Java编程语言实现的猜数字游戏的源代码。这个游戏通常是一个人或计算机生成一个随机数,然后玩家需要通过一系列的猜测来确定这个数字。这种类型的程序可以帮助初学者理解如何...
《C语言实现猜数字游戏详解》 在编程学习过程中,编写简单有趣的游戏代码是一种极好的实践方式,可以加深对编程语言的理解。本文将详细介绍利用C语言实现的猜数字游戏,包括其核心功能模块和排行榜系统。 猜数字...
【Android Bing 猜数字游戏】是一款基于Android平台的简单猜数字游戏,旨在帮助初学者了解和学习Android应用开发的基本知识。在这个游戏中,系统会随机生成一个数字,玩家需要通过一系列猜测来找到这个数字。游戏的...
【标题】:“猜数字游戏网页版c#代码”是一个基于C#编程语言开发的在线猜数字游戏项目。这个游戏通常被称为“数字谜”,玩家需要在限定次数内猜出系统随机生成的数字。C#是一种广泛应用于桌面应用、游戏开发、Web...
在这个Java实现的猜数字游戏中,我们有以下关键知识点: 1. **Java编程基础**:此游戏展示了Java的基础语法,包括变量声明、条件语句(if-else)、循环结构(for或while)、函数定义和调用等。 2. **图形用户界面...
《文曲星猜数字游戏与Delphi筛选法破解解析》 在编程的世界里,游戏开发是一种常见的实践方式,尤其对于初学者来说,它既有趣又能锻炼编程技能。今天我们要探讨的是一个特别的游戏——文曲星猜数字游戏,以及如何...
标题中的“VB做的猜数字游戏,有源代码”指的是一个基于Visual Basic(VB)编程语言开发的猜数字游戏。这个游戏通常包含一个简单的算法,让用户在指定范围内猜测一个随机生成的数字,然后根据用户输入提供反馈,如...
《猜数字游戏:编程实践与算法解析》 猜数字游戏是一种经典的计算机编程练习,它不仅简单易懂,而且能够帮助初学者理解基础的编程逻辑、条件判断和循环控制。在这个游戏中,计算机生成一个随机数,然后玩家需要在...
【C语言猜数字游戏】是基于C编程语言开发的一个简单互动游戏,它的设计灵感来源于经典的数字猜测游戏。这个游戏的核心逻辑是计算机随机生成一组特定数量(在这个案例中是4个)的不重复数字,然后玩家尝试猜测这些...
总结,这个“源代码:猜数字游戏”项目是学习和练习Java基础、控制流程和用户交互的好例子。通过分析和理解这个游戏,开发者可以进一步掌握面向对象编程、类的设计以及如何处理用户输入等核心概念。同时,这个游戏还...
《文曲星猜数字游戏(源代码)》是一款基于数字推理的小型游戏,它在文曲星电子词典等平台上流行。游戏的核心是让玩家在有限的尝试次数内猜出系统随机生成的一个秘密数字。本游戏的源代码揭示了其背后的逻辑和算法,...
在这个名为“电脑猜数字(人工智能)”的项目中,我们探讨了一个基于人工智能的猜数字游戏。这个游戏的传统玩法是计算机设定一个数字,然后由用户尝试猜测,但在这个版本中,角色互换,用户设置一个数字,而计算机的...
【Java猜数字游戏】是一款基于Java SE 1.8开发的桌面应用程序,它提供了一个简单而有趣的互动体验,让用户在计算机生成的一个秘密数字范围内进行猜测。这个游戏的核心是算法设计和用户界面的实现,通过Java Swing库...
在猜数字游戏中,我们可以把可能的数字范围(0到100)视为一个有序集合。每次猜测后,根据系统的反馈(过高、过低或正确),我们可以将搜索范围一分为二,从而快速定位目标数字。 首先,我们需要生成一个0到100之间...
《ModernUI猜数字游戏》是一款基于Modern User Interface (ModernUI)设计风格的数字猜测游戏,旨在为玩家提供一种趣味性的休闲娱乐方式,同时也为新手开发者提供了学习和实践ModernUI技术的平台。在这个游戏中,...
在编程世界中,开发一款简单的猜数字游戏是学习新语言或技术的常见练习。本项目是一个基于C#语言的猜数字小游戏,它采用了一种高效的算法——“二分法”,使得游戏过程更加智能化,能够在最短的时间内得出正确答案。...