//本程序是您想一个四位数字,然后让电脑(也就是我这个程序)来给你猜的
//比如,您脑子里想了个四位数(2486)(注意:四位数不能有重复数字:例如1224就不可以)
//然后电脑就开始猜,电脑每猜一次,您就需要给它一个反馈信息,格式为 X Y,例如(电脑猜0123)
//您的反馈信息就是 0 1 如此反复,直到您输入4 0,也就是说电脑猜中了你的数字了
#define NULL 0
#include <iostream>
#include <string>
using namespace std;
struct Data//定义一个结构体,用来存放所有可能的四位数字的组合
{
char Num1;//定义成char类型,主要是为了节省空间
char Num2;
char Num3;
char Num4;
Data *next;
};
int compareA(Data *a,Data *b)//返回比较的数值
{
int m;
m=0;
if (a->Num1==b->Num1) m=m+1;
if (a->Num2==b->Num2) m=m+1;
if (a->Num3==b->Num3) m=m+1;
if (a->Num4==b->Num4) m=m+1;
return m;
}
int compareB(Data *a,Data *b)//同上
{
int n;
n=0;
if (a->Num1==b->Num4||a->Num1==b->Num2||a->Num1==b->Num3) n=n+1;
if (a->Num2==b->Num1||a->Num2==b->Num3||a->Num2==b->Num4) n=n+1;
if (a->Num3==b->Num1||a->Num3==b->Num2||a->Num3==b->Num4) n=n+1;
if (a->Num4==b->Num1||a->Num4==b->Num2||a->Num4==b->Num3) n=n+1;
return n;
}
int main()
{
Data *head;//head是整个链表的头接点
Data *p;
Data *p1;
Data *Store;//Store用来存放电脑所猜的四位数字
head=new Data;
Store=new Data;
p=head;
head->Num1='a';
head->Num2='b';
head->Num3='c';
head->Num4='d';//对头节点赋值
int check1,check2;
int num1,num2,num3,num4;
for (num1=48;num1<=57;num1++)
for (num2=48;num2<=57;num2++)
for (num3=48;num3<=57;num3++)
for (num4=48;num4<=57;num4++)
{if (!(num1==num2||num1==num3||num1==num4||num2==num3||num2==num4||num3==num4))
{p1=new Data;
p1->Num1=num1;
p1->Num2=num2;
p1->Num3=num3;
p1->Num4=num4;
p->next=p1;
p=p1;
}
}//利用for循环,来建立链表,并把所有可能的四位数字组合存放到链表的节点中去
p->next=NULL;
p=head;
p1=p->next;//完成链表建立,p,head指向头节电,p1指向第一个存放数据的节点(数据为0 1 2 3)
cout<<"欢迎使用电脑猜数字游戏程序,谢谢!请您想任意一个四位数字,然后根据我猜的数字给我反馈信息。"<<endl;
do{
Store->Num1=head->next->Num1;
Store->Num2=head->next->Num2;
Store->Num3=head->next->Num3;
Store->Num4=head->next->Num4;
cout<<"我猜的数字是:";
cout<<Store->Num1<<' '<<Store->Num2<<' '<<Store->Num3<<' '<<Store->Num4<<' '<<endl;
cout<<"请输入验证信息:";
cin>>check1>>check2;
// cout<<"数组"<<Store->Num1<<Store->Num2<<Store->Num3<<Store->Num4<<' ';
if(check1!=4)
{
while(p1->next!=NULL)//用Store里的数据和P1节点的数据比较,如果比较的结果和check1,check2均相同
//那就说明该节点有可能是所要猜的数字,如果不同,则从链表中删除该节点
{
if ((compareA(Store,p1)==check1)&&(compareB(Store,p1)==check2))
{p=p->next;
p1=p1->next;}//保留节点, 指针后移一位
else
{ p1=p1->next;
delete p->next;
p->next=p1;}//删除P1节点,P1后移,并使得p->next指向P1
}//while语句结束
}//if语句结束
p1=head->next;
p=head;
}while(check1!=4);//do...while用来实现大循环,只要chechk1!=4,则说明还没有猜测到正确答案
cout<<"您所想的数字是:";
cout<<Store->Num1<<' '<<Store->Num2<<' '<<Store->Num3<<' '<<Store->Num4<<' '<<endl;
return 0;
}