取火柴游戏

#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; 
 }
 }


	
	
	
					       	
						        		
								 		     }
																	     
						
					
				               
	      	      

     












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值