#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
float num1=0;
float num2=0;
struct treenode
{
int data;
int flag;
treenode*first,*second,*third;
treenode(int d,int fl,treenode*f,treenode*s,treenode*t):data(d),flag(fl),first(f),second(s),third(t){
}
};
class tree
{
public:
tree();
~tree();
void create(int n){ create(root,n); }
float chance(treenode*ptr){return chance(ptr,1) ; }
void run(tree tree1);
protected:
float chance(treenode* ptr,int i);
treenode*root;
void create(treenode*&ptr,int n);
};
tree::tree()
{
}
tree:~tree()
{
}
void tree::create(treenode*&ptr,int n)
{
ptr=new treenode(n,0,NULL,NULL,NULL);
if(n>0)
{
create(ptr->first,n-1);
create(ptr->second,n-2);
create(ptr0>third,n-3);
}
else
{
if(n!=0)
ptr->flag=1;
}
}
float tree:: chance(treenode* ptr,int i)
{
if(ptr!=NULL)
{
chance(ptr->first,++i);
--i;
if(ptr->first==NULL&&ptr->flag==0)
{
if((i+1)%2!=0)
{
++num1;
++num2;
}
else
++num1;
}
chance(ptr->second,++i);
--i;
if(ptr->second==NULL&&ptr->flag==0)
{
if((i+1)%2!=0)
{
++num1;
++num2;
}
else
++num1;
}
chance(ptr->third,++i);
--i;
if(ptr->third==NULL&&ptr->flag==0)
{
if((i+1)%2!=0)
{
++num1;
++num2;
}
else
++num1;
};
}
return num2/num1;
}
void tree::run(tree tree1)
{
treenode* ptr=tree1.root;
cout<<"请选择对战模式(人机对战1or双人对战2)"<<endl;
int i;
int m,total,input1,input2;
treenode*temp=NULL;
char test2;
cin>>i;
switch(i)
{
case 1:
cout<<"是否先手(YorN)"<<endl;
cin>>test2;
if(tolower(test2)=='y')
{
for(;;)
{
for(m=1;m<=3;++m)
{
temp=ptr;
if(m==1)
temp=ptr->first;
else if(m==2)
temp=ptr->second;
else
temp=ptr->third;
if(temp!=NULL&&temp->flag==0)
{
cout<<"取"<<m<<"根火柴获胜概率:";
num1=num2=0;
cout<<tree1.chance(temp)<<endl;
}
}
if(ptr->data<1)
{
cout<<"游戏结束"<<endl;
cout<<"人取得获胜"<<endl;
break;
}
if(ptr->data>=3)
cout<<"请输入要取的火柴数(1~3)"<<endl;
else
cout<<"请输入要取的火柴数(1~"<<ptr->data<<")"<<endl;
cin>>input1;
switch(input1)
{
case 1:
ptr=ptr->first;
break;
case 2:
if(ptr->data<2)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->second;
break;
case 3:
if(ptr->data<3)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->third;
break;
default:break;
}
if(ptr->data<1)
{
cout<<"游戏结束"<<endl;
cout<<"机器取得获胜"<<endl;
break;
}
int record=1;
treenode* record1=ptr->first;
for(m=1;m<=3;++m)
{
temp=ptr;
if(m==1)
temp=ptr->first;
else if(m==2)
temp=ptr->second;
else
temp=ptr->third;
if(temp!=NULL&&temp->flag==0)
{
if(tree1.chance(temp)>tree1.chance(record1))
{
record=m;
record1=temp;
}
}
}
input2=record;
if(ptr->data>3)
{
switch(input2)
{
case 1:
ptr=ptr->first;
break;
case 2:
ptr=ptr->second;
break;
case 3:
ptr=ptr->third;
break;
default:break;
}
}
else
{
ptr=ptr->first;
input2=1;
}
cout<<"机器取了"<<input2<<"根火柴"<<endl;
}
}
else
{
for(;;)
{
if(ptr->data<1)
{
cout<<"游戏结束"<<endl;
cout<<"机器取得获胜"<<endl;
break;
}
int record=1;
treenode* record1=ptr->first;
for(m=1;m<=3;++m)
{
temp=ptr;
if(m==1)
temp=ptr->first;
else if(m==2)
temp=ptr->second;
else
temp=ptr->third;
if(temp!=NULL&&temp->flag==0)
{
if(tree1.chance(temp)>tree1.chance(record1))
{
record=m;
record1=temp;
}
}
}
input2=record;
if(ptr->data>3)
{
switch(input2)
{
case 1:
ptr=ptr->first;
break;
case 2:
ptr=ptr->second;
break;
case 3:
ptr=ptr->third;
break;
default:break;
}
}
else
{
ptr=ptr->first;
input2=1;
}
cout<<"机器取了"<<input2<<"根火柴"<<endl;
for(m=1;m<=3;++m)
{
temp=ptr;
if(m==1)
temp=ptr->first;
else if(m==2)
temp=ptr->second;
else
temp=ptr->third;
if(temp!=NULL&&temp->flag==0)
{
cout<<"取"<<m<<"根火柴获胜概率:";
num1=num2=0;
cout<<tree1.chance(temp)<<endl;
}
}
total=ptr->data;
if(ptr->data<1)
{
cout<<"游戏结束"<<endl;
cout<<"人取得获胜"<<endl;
break;
}
if(ptr->data>=3)
cout<<"请输入要取的火柴数(1~3)"<<endl;
else
cout<<"请输入要取的火柴数(1~"<<ptr->data<<")"<<endl;
cin>>input1;
switch(input1)
{
case 1:
ptr=ptr->first;
break;
case 2:
if(ptr->data<2)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->second;
break;
case 3:
if(ptr->data<3)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->third;
break;
default:break;
}
}
}
break;
case 2:
for(;;)
{
for(m=1;m<=3;++m)
{
temp=ptr;
if(m==1)
temp=ptr->first;
else if(m==2)
temp=ptr->second;
else
temp=ptr->third;
if(temp!=NULL&&temp->flag==0)
{
cout<<"取"<<m<<"根火柴获胜概率:";
num1=num2=0;
cout<<tree1.chance(temp)<<endl;
}
}
if(ptr->data<1)
{
cout<<"游戏结束"<<endl;
cout<<"玩家1取得获胜"<<endl;
break;
}
if(ptr->data>=3)
cout<<"请玩家1输入要取的火柴数(1~3)"<<endl;
else
cout<<"请玩家1输入要取的火柴数(1~"<<ptr->data<<")"<<endl;
cin>>input1;
switch(input1)
{
case 1:
ptr=ptr->first;
break;
case 2:
if(ptr->data<2)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->second;
break;
case 3:
if(ptr->data<3)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->third;
break;
default:break;
}
for(m=1;m<=3;++m)
{
temp=ptr;
if(m==1)
temp=ptr->first;
else if(m==2)
temp=ptr->second;
else
temp=ptr->third;
if(temp!=NULL&&temp->flag==0)
{
cout<<"取"<<m<<"根火柴获胜概率:";
num1=num2=0;
cout<<tree1.chance(temp)<<endl;
}
}
if(ptr->data<1)
{
cout<<"游戏结束"<<endl;
cout<<"玩家2取得获胜"<<endl;
break;
}
if(ptr->data>=3)
cout<<"请玩家2输入要取的火柴数(1~3)"<<endl;
else
cout<<"请玩家2输入要取的火柴数(1~"<<ptr->data<<")"<<endl;
cin>>input2;
switch(input2)
{
case 1:
ptr=ptr->first;
break;
case 2:
if(ptr->data<2)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->second;
break;
case 3:
if(ptr->data<3)
{
cout<<"输入有误"<<endl;
break;
}
ptr=ptr->third;
break;
default:break;
}
}
break;
default:cout<<"输入有误"<<endl;
break;
}
}
int main()
{
tree a;
for(;;)
{
int total;
cout<<"请输入火柴总数"<<endl;
cin>>total;
a.create(total);
a.run(a);
cout<<"是否继续游戏(YorN)"<<endl;
char test;
cin>>test;
if(tolower(test)=='n')
break;
}
}
}
取火柴游戏
最新推荐文章于 2023-10-23 12:38:26 发布