C语言实现24点游戏

#include<stdio.h>
#include<math.h>
int Trial(float,float,float,float);     //对四个数进行试算
float Calc(int,float,float);             //计算
void Output(int,int,int,int,float,float,float,float);//输出结果
int iCount=0;                           //求解计数

int main()
{
 int i,j,k,t,result,flag;
 float num[4];   //保存输入的4个数
 char again='y';
 while(again=='y'||again=='Y')
 {
  iCount=0;
  printf("输入四个数(1--13):");
  i=0;
  flag=0;
  while(flag==0)
  {
   i++;
   for(i=0;i<4;i++)
   {
    scanf("%f",&num[i]);
    if(num[i]<1||num[i]>13||num[i]!=(int)num[i])
     flag++;
   }
   if(flag!=0)
   {
    printf("数据输入错误,请重新输入\n");
    flag=0;
   }
   else
    flag=1;
  }

  //循环将四个数代入表达式进行计算
  for(i=0;i<4;i++)
  {
   for(j=0;j<4;j++)
   {
    if(i==j)
     continue;
    for(k=0;k<4;k++)
    {
     if(i==k||j==k)
      continue;
     for(t=0;t<4;t++)
     {
      if(i==t||j==t||k==t)
       continue;
      else
       result=Trial(num[i],num[j],num[k],num[t]);
     }
    }
   }
  }
  if(result==0)
   printf("这四个数无解\n");
  printf("继续(y/n)?");
  getchar();
  again=getchar();
 }
 return 0;
}

int Trial(float data1,float data2,float data3,float data4) //对四个数进行试算
{
 int o1,o2,o3;
 float temp1,temp2,temp3;
 for(o1=0;o1<4;o1++)  //4种运算符
 {
  for(o2=0;o2<6;o2++)  //6种运算符
  {
   for(o3=0;o3<6;o3++)
   {
    //处理第一种表达式 (((data1_data2)_data3)_data4)=24
    if((!(o1==3&&data2==0))&&(!(o2==3&&data3==0)&&(!(o3==3&&data4==0))))
    {
     temp1=Calc(o1,data1,data2);
     temp2=Calc(o2,temp1,data3);
     temp3=Calc(o3,temp2,data4);
     if(fabs(temp3-24)<0.1)
     {
      iCount++;
      Output(1,o1,o2,o3,data1,data2,data3,data4);
     }
    }
    //'*'
    if(o3==2)  //将乘法作为中间运算符 (data1_data2)*(data3_data4)=24
    {
    
     temp1=Calc(o1,data1,data2);
     temp2=Calc(o2,data3,data4);
     temp3=temp1*temp2;
     if(fabs(temp3-24)<0.1)
     {
      iCount++;
      Output(2,o1,o2,o3,data1,data2,data3,data4);
     }
    }
    // '/'
    if(o3==3)  //将除法作为中间运算符  (data1_data2)/(data3_data4)=24
    {
     temp1=Calc(o1,data1,data2);
     temp2=Calc(o2,data3,data4);
     if(temp2)
     {
      temp3=temp1/temp2;
      if(fabs(temp3-24)<0.1)
      {
       iCount++;
       Output(2,o1,o2,o3,data1,data2,data3,data4);
      }
     }
    }
   }
  }
 }
 return iCount;
}

float Calc(int oper,float data1,float data2)
{
 if(oper==0)
  return (data1+data2);
 if(oper==1)
  return (data1-data2);
 if(oper==2)
  return (data1*data2);
 if(oper==3)
 {
  if(data2==0)
   return 32767;
  else
   return (data1/data2);
 }
 if(oper==4)
  return (data2-data1);
 if(oper==5)
 {
  if(data1==0)
   return 32767;
  else
   return (data2/data1);
 }
 return 0;
}

void Output(int type,int o1,int o2,int o3,float data1,float data2,float data3,float data4)
{
 char oper[6]={'+','-','*','/','-','/'};//六种运算符

 if(type==1)
 {
  // '-' 或'/'
  if(o2==4||o2==5)
  {
   // '-' 或 '/'
   if(o3==4||o3==5)
   {
    printf("解%d:",iCount);
    printf("%2.0f%c(%2.0f%c(%2.0f%c%2.0f))=24\n",data4,oper[o3],data3,oper[o2],data1,oper[o1],data2);
   }
   else
   {
    printf("解%d:",iCount);
    printf("(%2.0f%c(%2.0f%c%2.0f))%c%2.0f=24\n",data3,oper[o2],data1,oper[o1],data2,oper[o3],data4);
   }
  }
  //'-' '/'
  else if(o3==4||o3==5)
  {
   printf("解%d:",iCount);
   printf("%2.0f%c((%2.0f%c%2.0f)%c%2.0f)=24\n",data4,oper[o3],data1,oper[o1],data2,oper[o2],data3);
  }
  else
  {
   printf("解%d:",iCount);
   printf("((%2.0f%c%2.0f)%c%2.0f)%c%2.0f=24\n",data1,oper[o1],data2,oper[o2],data3,oper[o3],data4);
  }
 }
 if(type==2)
 {
  if(o2==4||o2==5||o3==4||o3==5)
  {
   iCount--;
   return;
  }
  printf("解%d:",iCount);
  printf("(%2.0f%c%2.0f)%c(%2.0f%c%2.0f)=24\n",data1,oper[o1],data2,oper[o3],data3,oper[o2],data4);
 }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值