24点游戏

24点游戏是经典的纸牌益智游戏。

常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。

# include<stdio.h> 
# include <stdlib.h> 
# include <time.h> //需引用的头文件
FILE * fp; 

void main() 
{ 
int fun; 
void play(); //声明函数 
srand((unsigned)time(NULL)); //随机数
fp=fopen("TopList.txt","wb"); 
printf("24点游戏欢迎您!\n\n"); 
while(1)   //主界面    
    { 
        printf("请输入相应选项:1开始游戏,0结束游戏\n"); 
        scanf("%d",&fun); 
        if(fun==1) 
        play(); 
        else 
            break;  
    } 
printf("谢谢使用"); 
} 
//定义play()函数
void play() 
{ 
int k,i,j,x=0,y=0,s[3],m,n,c,q,f=0,e,p[4];//p[4]数组存放输出时的四个运算数,
                                              //s[3]分别存放运算结果 
int a[4],newp[4],b[4]={1,2,3,4};//a[4]数组存放随机生成的四个数 
char p1[3],sign; //定义存储运算符的字符数组 
printf("四个数是:"); 
    for(i=0;i<4;i++) 
    { 
    a[i]=rand()%13+1; //获得随机数 
    printf("%d ",a[i]); 
    } 
    printf("\n"); 
    for(i=0;i<3;i++) 
    { 
    k=i+1; 
        for(n=1;n<=(3-i)*4;n++) 
        { 
        if(((n-1)%4)==0&&n!=1) 
        k++; 
        switch(b[x]) //两个数进行运算 
        { 
        case 1:s[0]=a[i]+a[k];sign='+';break; 
        case 2:s[0]=a[i]-a[k];sign='-';break; 
        case 3:s[0]=a[i]*a[k];sign='*';break; 
        case 4:s[0]=a[i]/a[k];sign='/';break; 
        } 
    if((x=n%4)==0&&a[i]%a[k]!=0&&a[k]%a[i]!=0||a[k]==0||a[i]==0) //当除数是0时退出 
    continue; 
    if(n%4==0&&a[k]%a[i]==0) 
    {
        p[0]=a[k];p1[0]=sign;p[1]=a[i];
    } //满足条件就交换顺序 
    else 
    {
        p[0]=a[i];p1[0]=sign;p[1]=a[k];} 
        for(e=0;e<4;e++) //找出其余两个数 
        { 
        if(e!=i&&e!=k) 
            { 
            f++; 
            newp[f]=a[e]; 
            } 
        } 
        newp[0]=s[0];
        newp[3]=newp[1]; //存放第一次两个数的运算和与剩下两个数 
        for(j=0;j<2;j++) 
        { 
            q=j+1; 
        for(m=1;m<=(2-j)*4;m++) 
        { 
            if(((m-1)%4)==0&&m!=1) 
            q++; 
            switch(b[y]) 
            { 
            case 1:s[1]=newp[j]+newp[q];sign='+';break; 
            case 2:s[1]=newp[j]-newp[q];sign='-';break; 
            case 3:s[1]=newp[j]*newp[q];sign='*';break; 
            case 4:s[1]=newp[j]/newp[q];sign='/';break; 
            } 
        if((y=m%4)==0&&newp[j]%newp[q]!=0&&newp[q]%newp[j]!=0||newp[j]==0||newp[q]==0) 
        continue; 
        else 
        if(m%4==0&&newp[q]%newp[j]==0) 
        s[1]=newp[q]/newp[j]; 
        if(j==0) 
        { 
        p1[1]=sign; 
        p[2]=newp[q]; 
        for(c=0;c<4;c++) 
        {    
            switch(b[c]) 
            { 
            case 1:s[2]=s[1]+newp[q+1];sign='+';break; 
            case 2:s[2]=s[1]-newp[q+1];sign='-';break; 
            case 3:s[2]=s[1]*newp[q+1];sign='*';break; 
            case 4:s[2]=s[1]/newp[q+1];sign='/';break; 
            } 
        if(c==3&&s[1]%newp[q+1]!=0&&newp[q+1]%s[1]!=0||newp[q+1]==0||s[1]==0) 
        continue; 
        else 
        if(c==3&&newp[q+1]%s[1]==0) 
        s[2]=newp[q+1]/s[1];
        if(s[2]==24) 
        { 
            p1[2]=sign; 
            p[3]=newp[q+1]; 
            if((m%4)==0&&newp[q]%newp[j]==0&&c==3&&newp[q+1]%s[1]==0) //控制输出顺序和运算优先级 
            printf("(%d%c(%d%c(%d%c%d)))=%d\n",p[3],p1[2],p[2],p1[1],p[0],p1[0],p[1],s[2]); 
            else 
            if((m%4)==0&&newp[q]%newp[j]==0&&c==3&&s[1]%newp[q+1]==0) 
            printf("(%d%c(%d%c%d))%c%d=%d\n",p[2],p1[1],p[0],p1[0],p[1],p1[2],p[3],s[2]); 
            else 
            if((m%4)==0&&newp[j]%newp[q]==0&&c==3&&newp[q+1]%s[1]==0) 
            printf("%d%c((%d%c%d)%c%d)=%d\n",p[3],p1[2],p[0],p1[0],p[1],p1[1],p[2],s[2]); 
            else 
            printf("(((%d%c%d)%c%d)%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s[2]); 
        } 
    } 
} 
if(j==1) 
{ 
    if((m%4)==0&&(newp[q]%newp[j]!=0)&&(newp[j]%newp[q]!=0)||((newp[j]==0||newp[q]==0)&&s[0]!=24)) 
    continue; 
else 
{ 
    if(m%4==0&&newp[q]%newp[j]==0) //满足条件就交换顺序 
    { 
    p[2]=newp[q]; 
    p1[1]=sign; 
    p[3]=newp[j]; 
    } 
    else 
    { 
    p[2]=newp[j]; 
    p1[1]=sign; 
    p[3]=newp[q]; 
    } 
} 
for(c=0;c<4;c++) 
{ 
    switch(b[c]) 
    { 
    case 1:s[2]=s[1]+s[0];sign='+';break; 
    case 2:s[2]=s[1]-s[0];sign='-';break; 
    case 3:s[2]=s[1]*s[0];sign='*';break; 
    case 4:s[2]=s[1]/s[0];sign='/';break; 
    } 
if(c==3&&s[1]%s[0]!=0&&s[0]%s[1]!=0||s[0]==0||s[1]==0) 
break; 
else 
if(c==3&&s[0]%s[1]==0) 
s[2]=s[0]/s[1]; 
    if(s[2]==24) 
    { 
    p1[2]=sign; 
    if(c==3&&s[0]%s[1]==0) //控制输出顺序和运算优先级 
    {
    printf("(%d%c%d)%c(%d%c%d)=%d\n",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s[2]); 
    fprintf(fp,"(%d%c%d)%c(%d%c%d)=%d",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s[2]);
    }
    else
    {
    printf("(%d%c%d)%c(%d%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s[2]);
    fprintf(fp,"(%d%c%d)%c(%d%c%d)=%d",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s[2]);
    }
    fclose(fp);
        } 
       } 
      } 
     } 
    } 
   } 
  } 
} 

调试截图:
在这里插入图片描述

流程图:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值