24点游戏

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

基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。

  • 1.程序风格良好(使用自定义注释模板)
  • 2.列出表达式无重复。

思路:
24点游戏的算法,其中最主要的思想就是穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,,/,(,)。其中有效的表达式有a(b-c/b),ab-cd,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量。我们用a,b,c,d代替4个数字。考虑每种可能,总的算法就有5种可能。分别是:

  • 1.((A*B)*C)*D
  • 2.(A*(B*C))*D
  • 3.(AB)(C*D)
  • 4.A*(B*(C*D))
  • 5.A*((B*C)*D)

接下来就是对每一种进行分析判断。

流程图

在这里插入图片描述
源代码:

import java.util.Random;
import java.util.Scanner;
public class Game
{

    public static void main(String[] args)
    {
        int[] p=new int[4];//声明数组
        int c;
        Scanner scn=new Scanner (System.in);
        System.out.println("--------------------------------------------");
        System.out.println("*******24点纸牌游戏******");  
        System.out.println("0代表扑克牌中的10");
        System.out.println("--------------------------------------------");
         do  
         {  
             System.out.println("随机生成的纸牌为:\n"); 
             Random( p) ;//函数调用
             printResult(p);//函数调用 
             System.out.println("1.继续游戏 2.结束\n");                           
             c=scn.nextInt();  
         }while(c==1);          
    }
//如果x在2~10之间,返回10,同样,返回J,Q,K
    public static char Card(int x)
    {
        if(1<x&&x<11)
            return (char)(x+'0');
        else if(x==1)
            return 'A';
        else if(x==11)
            return 'J';
        else if(x==12)
            return 'Q';
        else if(x==13)
            return 'K'; 
        return 0;
    }
    //随机生成四个数
    public static void Random(int[] p)  
    {
        int i; 
        Random random=new Random();
        for(i=0;i<4;i++)  
        {  
            p[i]=(int)(Math.abs(random.nextInt())%13+1);
            System.out.println(Card(p[i])+" ");         
        }

    }
    //四个运算符的运算
    public static  double ys(double num1,double num2,char o) 
    {
        double result=0;  
          switch(o)  
         {  
             case '+':  
             result=num1+num2;  
             break;  
            case '-': 
            {
                if(num1>=num2)
                    result=num1-num2;
                else
                    result=num2-num1;
            }

             break;  
            case '*':  
             result=num1*num2;  
             break;  
            case '/':
             result=num1/num2;  
             break;  
            default :  
                break;  
         }       
         return result;         
    }
    //如果通过运算算得的结果为24,则输出结果
    public static  int Result(int[] p,char[] o)  
    {
        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((t-24)==0)  //如果计算结果的绝对值与24相等,输出结果
        {  
            System.out.println("("+"("+"("+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((t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
        {  
            System.out.println("("+"("+Card(p[0])+o[0]+"("+Card(p[1])+o[1]+Card(p[2])+")"+")"+Card(p[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((t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
        {  
            System.out.println("("+"("+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((t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
        {  
            System.out.println("("+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((t-24)==0)   //如果计算结果的绝对值与24相等,输出结果
        {  
            System.out.println("("+Card(p[0])+o[0]+"("+"("+Card(p[1])+o[1]+Card(p[2])+")"+o[2]+Card(p[3])+")"+")1");  
            return 1;  
        }       
         return 0;  
     }
     //输出结果的数目
    public static void printResult(int[] p)
    {
         char[] O={'+','-','*','/'};  
         char[] o =new char[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++;
               }
            }
         } 
         System.out.println("共"+count+"种方法");    
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值