24 点游戏

//*********24点纸牌游戏***********
//版本:v1.0
//创建时间:2017年4月1日
//主要功能:系统随机生成1~13的4张牌(1用A代替,11用J代替,12用Q代替,13用K代替),要求将四张牌用加减乘除混合运算求得出24
//主要原理:系统通过对随机生成的四张扑克牌进行运算,如果结果为24,则输出结果及结果个数
//************************************

#include <stdio.h>  
#include <stdlib.h>  
#include <math.h>  
#include <time.h>  
int main()  
 {   
     int p[4],c;   
     void Random(int p[4]);//函数声明
     void printResult(int p[4]);//函数声明
     printf("--------------------------------------------\n*******24点纸牌游戏******\n");  
     printf("0代表扑克牌中的10\n");
     printf("--------------------------------------------\n");
     do  
     {  
         printf("随机生成的纸牌为:\n"); 
         Random(p);//函数调用
         printf("\n");
         printResult(p);//函数调用 
         printf("1.继续游戏 2.结束\n");
         scanf("%d",&c);        
     }while(c==1);         
     return 0;  
 }  
利用系统时间作为种子生成四个随机数并输出
void Random(int p[4])  
 {  
     int i;  
     char Card(int x);
    srand((unsigned)time(NULL));  
    for(i=0;i<4;i++)  
    {  
        p[i]=rand()%13+1;       
        printf("%c ",Card(p[i]));  
    }  
 }  

 //如果随机出现的数字为1,则输出A;同样,输出为J,Q,K;  
 char Card(int x)  
 {  

     if(x==1)  
     {  
         return 'A';  
     }  
    else if(x<10)  
    {  
        return x+'0';  
    }
     else if(x==10)  
    {  
        return '0';  
    }
    else if(x==11)  
    {  
        return 'J';  
    }  
    else if(x==12)  
    {  
        return 'Q';  
    }  
    else if(x==13)  
    {  
        return 'K';  
    }  
 }  
 //加减乘除四种运算符的运算  
  double ys(double num1,double num2,char o)  
 {  
     double result;  
      switch(o)  
     {  
         case '+':  
         result=num1+num2;  
         break;  
        case '-':  
         result=fabs(num1-num2);  
         break;  
        case '*':  
         result=num1*num2;  
         break;  
        case '/':
         result=num1/num2;  
         break;  
        default :  
            break;  
     }       
     return result;  
 }  
//穷举运算次序  
 int Result(int p[4],char o[3])  
 {  
     double t;  
     int a=p[0];  
     int b=p[1];  
     int c=p[2];  
     int d=p[3];        

    //1.((A*B)*C)*D  
    t=0;  
    t=ys(ys(ys(a,b,o[0]),c,o[1]),d,o[2]);       
    if(fabs(t-24)==0)  //如果计算结果的绝对值与24相等,输出结果
    {  
       printf("((%c%c%c)%c%c)%c%c\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));   
        return 1;  
    }        
    //2.(A*(B*C))*D  
    t=0;  
    t=ys(ys(a,ys(b,c,o[1]),o[0]),d,o[2]);      
    if(fabs(t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
    {  
       printf("(%c%c(%c%c%c))%c%c\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3])); 
        return 1;  
    }  
    //3.(A*B)*(C*D)  
    t=0;  
    t=ys(ys(a,b,o[0]),ys(c,d,o[2]),o[1]);       
    if(fabs(t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
    {  
        printf("(%c%c%c)%c(%c%c%c)\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3])); 
        return 1;  
    }        
    //4.A*(B*(C*D))  
    t=0;  
    t=ys(a,ys(b,ys(c,d,o[2]),o[1]),o[0]);          
    if(fabs(t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
    {  
       printf("%c%c(%c%c(%c%c%c))\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3])); 
       return 1;  
    }  
    //5.A*((B*C)*D)   
    t=0;  
     t=ys(a,ys(ys(b,c,o[1]),d,o[2]),o[0]);        
    if(fabs(t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
    {  
         printf("%c%c((%c%c%c)%c%c)\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));  
        return 1;  
    }       
     return 0;  
 }  
 //输出可以用几种方法解出答案
 void printResult(int p[4])  
 {  
     char O[4]={'+','-','*','/'};  
     char o[3];  
     int i,j,k;  
     int count=0;        
     for(i=0;i<4;i++)//三层for循环列出了所有运算符可能出现的情况
     {
        for(j=0;j<4;j++) 
        {
           for(k=0;k<4;k++)  
           {  
             o[0]=O[i];  
             o[1]=O[j];  
             o[2]=O[k];  
             if(Result(p,o)==1)  
                count++;
           }
        }
     } 
     printf("共%d种方法\n",count);     
 } 

程序运行结果截屏

这里写图片描述

总结及心得体会:
通过一次一次上机自己动手写程序,使我更加扎实的掌握了知识,在写程序过程中虽然遇到了一些问题,但经过一次又一次的思考、查阅、讨论,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我知识欠缺和经验不足。实践 出真知,通过亲自动手上机,使我掌握的知识不再是纸上谈兵。我相信在这学期的一次次编写程序的过程中,不仅会培养我独立思考、动手操作的能力,在各种其它能力上也都会有提高。更重要的是,在编写代码时,我学会了很多学习的方法,而这是日后最实用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值