24点游戏

24点游戏

1.问题描述

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,列出表达式无重复。

2.解题思路

首先用random函数随机产生4个整数,接下来要完成整数相加是否等于24的判断。定义一个calculate函数实现运算操作,这4个数分为4种:4个数是一种,是两种,是三种,是四种。两种的分为两两相同或三个一样。三种的则是两个一样两个不一样。 4个数是一种时,直接实现calculation函数。选择其中两个数先进行+ - * /运算,再将计算的结果和第三个数+ - * /,继续将结果和第四个数+ - * /。4个数两两相同时,根据calculation函数列举出6种情况;三个相同时,列举出4种情况。4个数是三种时,列举出共12种情况。4个数是四种时,列举24种情况。最后返回计算的结果,经过计算能否为24并列出所有结果为24的表达式。

3.算法构造

在这里插入图片描述
在这里插入图片描述
4.实现代码

package game24; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Random;
public class Game24 {  

//定义随机产生的四个数   
static int number[] = new int[4]; 
//转换后的num1,num2,num3,num4
static int m[]=new int [4];    
static String n[] = new String[4];     
//用来判断是否有解  
static boolean flag = false;   
//存放操作符    
static char[] operator= { '+', '-', '*', '/' };   
public static void main(String[] args){        
    Random rand = new Random();        
    System.out.println("下列给出四个数字,使用+,-,*,/进行计算使最后计算结果为24");   
    for(int i=0;i<4;i++){

        number[i]=rand.nextInt(13)+1;//随机生成四个int型数             
        if(number[i]==1){              
            System.out.println("A");//如果随机生成的数为1,则显示为扑克牌牌面中的A
            } 
	else if(number[i]==11){
            System.out.println("J");//如果随机生成的数为11,则显示为扑克牌牌面中的J           
        } 
        else if(number[i]==12){            
            System.out.println("Q");//如果随机生成的数为12,则显示为扑克牌牌面中的Q       
        }
else if(number[i]==13){      
            System.out.println("K");//如果随机生成的数为13,则显示为扑克牌牌面中的K       
        }   
        else            
            System.out.println(number[i]);       
        }       

    System.out.println("可能的结果有:");       
    calculate();               
    }  
    
//给定2个数和指定操作符的计算    

	 public static int calcute(int count1, int count2, char operator) {    
   	 if (operator == '+') {      
     	   return count1 + count2;    
    } 
    else if (operator == '-') {     
        return count1 - count2;     
    }
    else if (operator == '*') {     
        return count1 * count2;    
    }   
    else if ((operator == '/' )&& (count2 != 0) && (count1%count2==0)) {  
        return count1 / count2; 
        }

    else {      
            return -1;      
        }   
    }
   
//计算生成24的函数 

 public static void calculate(){        

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();      

    //存放数字,用来判断输入的4个数字中有几个重复的,和重复的情况        

    for (int i = 0; i < number.length; i++) {                  

        if(map.get(number[i]) == null){                            

            map.put(number[i], 1);         
   
        } 

        else {             

               map.put(number[i], map.get(number[i])+ 1);           
            }               
        }

        if(map.size() == 1){       

            //如果只有一种数字,此时只有一种排列组合,如5,5,5,5       
            
            calculation(number[0], number[1],number[2],number[3]);    
        }

	else if(map.size()==2){        

            //如果只有2种数字,有2种情况,如1,1,2,2和1,1,1,2        

            int index = 0;//用于数据处理            

            int state = 0;//判断是哪种情况          

            for (Integer key : map.keySet()) {             

               if(map.get(key) == 1){                 

                   //如果是有1个数字和其他3个都不同,将number变为
		     number[0]=number[1]=number[2],            

                   //将不同的那个放到number[3],方便计算               

                   number[3] = key;               
                   state = 1;             
               } 
               else if(map.get(key)==2){      
               
                   //如果是两两相同的情况,将number变为number[0]=number[1],number[2]=number[3]的情况      

                   number[index++]=key;               
                   number[index++]=key;               
               }   
               else{                  
                       number[index++]=key;       
                   }           
               }

//列出2种情况的所有排列组合,并分别计算      

               if(state == 1){            

                   calculation(number[3],number[1],number[1],number[1]);  

                   calculation(number[1],number[3],number[1],number[1]);     

                   calculation(number[1],number[1],number[3],number[1]);         

                   calculation(number[1],number[1],number[1],number[3]);         

                   } 

		if(state==0){              

                   calculation(number[1],number[1],number[3],number[3]);     

                   calculation(number[1],number[3],number[1],number[3]);         

                   calculation(number[1],number[3],number[3],number[1]);         

                   calculation(number[3],number[3],number[1],number[1]);         

                   calculation(number[3],number[1],number[3],number[1]);             

                   calculation(number[3],number[1],number[1],number[3]);     

                   }       

               } 

		else if(map.size()==3){        

                   //有3种数字的情况           

                   int index = 0;        
     
                   for (Integer key : map.keySet()) {     
                   
                       if(map.get(key) == 2){     

                           //将相同的2个数字放到number[2]=number[3]    

                           number[2] = key;                   

                           number[3] = key;               
  
                       } 
                       else {             
                               number[index++] = key;                 
                           }       
                       }

//排列组合,所有情况        

                       calculation(number[0],number[1],number[3],number[3]);  

                       calculation(number[0],number[3],number[1],number[3]);      

                       calculation(number[0],number[3],number[3],number[1]);      

                       calculation(number[1],number[0],number[3],number[3]);      

                       calculation(number[1],number[3],number[0],number[3]);      

                       calculation(number[1],number[3],number[3],number[0]);          

                       calculation(number[3],number[3],number[0],number[1]);      

                       calculation(number[3],number[3],number[1],number[0]);      

                       calculation(number[3],number[1],number[3],number[0]);          

                       calculation(number[3],number[0],number[3],number[1]);          

                       calculation(number[3],number[0],number[1],number[3]);          

                       calculation(number[3],number[1],number[0],number[3]);      

	  } 
		else if(map.size() == 4){      

			//4个数都不同的情况         

                          calculation(number[0],number[1],number[2],number[3]);         

                          calculation(number[0],number[1],number[3],number[2]);         

                          calculation(number[0],number[2],number[1],number[3]);         

                          calculation(number[0],number[2],number[3],number[1]);         

                          calculation(number[0],number[3],number[1],number[2]);         

                          calculation(number[0],number[3],number[2],number[1]);             

                          calculation(number[1],number[0],number[2],number[3]);             

                          calculation(number[1],number[0],number[3],number[2]);             

                          calculation(number[1],number[2],number[3],number[0]);             

                          calculation(number[1],number[2],number[0],number[3]);             

                          calculation(number[1],number[3],number[0],number[2]);         

                          calculation(number[1],number[3],number[2],number[0]);         

                          calculation(number[2],number[0],number[1],number[3]);         

                          calculation(number[2],number[0],number[3],number[1]);             

                          calculation(number[2],number[1],number[0],number[3]);             

                          calculation(number[2],number[1],number[3],number[0]);             

                          calculation(number[2],number[3],number[0],number[1]);         

                          calculation(number[2],number[3],number[1],number[0]);             

                          calculation(number[3],number[0],number[1],number[2]);             

                          calculation(number[3],number[0],number[2],number[1]);         

                          calculation(number[3],number[1],number[0],number[2]);             

                          calculation(number[3],number[1],number[2],number[0]);         

                          calculation(number[3],number[2],number[0],number[1]);             

                          calculation(number[3],number[2],number[1],number[0]);         

                       }       

                       if(flag==false)            

                           System.out.println("这四张牌面数字无法经过运算得到24!");     

                   }

 	public static void calculation(int num1, int num2, int num3, int num4){   

        for (int i = 0; i < 4; i++){

        //第1次计算,先从四个数中任意选择两个进行计算    

            char operator1 = operator[i];  
            int firstResult = calcute(num1, num2, operator1);//先选第一,和第二个数进行计算 
            int midResult = calcute(num2, num3, operator1);//先选第二和第三两个数进行计算    
            int tailResult = calcute(num3,num4, operator1);//先选第三和第四俩个数进行计算    
	    for (int j= 0; j < 4; j++){               

            //第2次计算,从上次计算的结果继续执行,这次从三个数中选择两个进行计算 

               char operator2 = operator[j];  
               int firstMidResult = calcute(firstResult, num3, operator2); 
                int firstTailResult = calcute(num3,num4,operator2);    
               int midFirstResult = calcute(num1, midResult, operator2);  
               int midTailResult= calcute(midResult,num4,operator2);  
               int tailMidResult = calcute(num2, tailResult, operator2);  
               for (int k = 0; k < 4; k++){

//第3次计算,也是最后1次计算,计算两个数的结果,如果是24则输出表达式     

                   char operator3 = operator[k]

                   //在以上的计算中num1,num2,num3,num4都是整型数值,但若要输出为带有A,J,Q,K的表达式,则要将这四个数都变为String类型,下同 

if(calcute(firstMidResult,num4, operator3) == 24){ 

                       m[0]=num1;  
                       m[1]=num2;  
                       m[2]=num3;  
                       m[3]=num4;  
                       for(int p=0;p<4;p++)

                           if(m[p]==1){    
                               n[p]="A";}  
                           if(m[p]==2){    
                               n[p]="2";}  
                           if(m[p]==3){    
                               n[p]="3";}  
                           if(m[p]==4){                           
                               n[p]="4";}                     
                           if(m[p]==5){                           
                               n[p]="5";}                     
                           if(m[p]==6){                       
                               n[p]="6";}                     
                           if(m[p]==7){                           
                               n[p]="7";}                     
                           if(m[p]==8){                       
                               n[p]="8";}                     
                           if(m[p]==9){                       
                               n[p]="9";}                     
                           if(m[p]==10){                          
                               n[p]="10";} 

			   if(m[p]==11){              
                               n[p]="J";}                     
                           if(m[p]==12){                  
                               n[p]="Q";}                         
                           if(m[p]==13){                   
                               n[p]="k";}          
                           }                   
                           System.out.println("((" + n[0] + operator1 + n[1] + ")"+ operator2 + n[2] + ")"+ operator3 + [3]);          
                           flag = true;//若有表达式输出,则将说明有解,下同                 
                       }

			if(calcute(firstResult, firstTailResult, operator3) == 24){ 
                           System.out.println("(" + n[0] + operator1 + n[1] + ")"+ operator3 + "(" + n[2] + operator2 + n[3] + ")");   
                           flag = true;                   
                       }                   
                       if(calcute(midFirstResult, num4, operator3) == 24){ 

			m[0]=num1;                     

                           m[1]=num2;                 

                           m[2]=num3;                 

                           m[3]=num4;                     
           
                           for(int p=0;p<4;p++){
                

                               if(m[p]==1){                       

                                   n[p]="A";}                     

                               if(m[p]==2){                       

                                   n[p]="2";}                          

                               if(m[p]==3){                           

                                   n[p]="3";}                         

                               if(m[p]==4){                           

                                   n[p]="4";}                         

                               if(m[p]==5){                           

                                   n[p]="5";}                         

                               if(m[p]==6){       

				n[p]="6";}
                    

                               if(m[p]==7){                           

                                   n[p]="7";}                         

                               if(m[p]==8){                           

                                   n[p]="8";}                         

                               if(m[p]==9){              

				n[p]="9";}
                    

                               if(m[p]==10){                              

                                   n[p]="10";}                            

                               if(m[p]==11){                              

                                   n[p]="J";}                         

                               if(m[p]==12){                          

                                   n[p]="Q";}                         

                               if(m[p]==13){                          

                                   n[p]="k";}                     

                               }                      

                           System.out.println("(" + n[0] + operator2 + "(" + n[1] + operator1 + n[2] + "))"+ operator3 + n[3]);         
                           flag = true;               
                       }

			if(calcute(num1,midTailResult, operator3) == 24){  

                           m[0]=num1;  

                           m[1]=num2;  

                           m[2]=num3;  

                           m[3]=num4;  

                           for(int p=0;p<4;p++){

                               if(m[p]==1){    

                                   n[p]="A";}  

                               if(m[p]==2){                           

                                   n[p]="2";}                         

                               if(m[p]==3){                           

                                   n[p]="3";}                         

                               if(m[p]==4){                           

                                   n[p]="4";}                         

                               if(m[p]==5){                           

                                   n[p]="5";}                         

                               if(m[p]==6){                           

                                   n[p]="6";}                     

                               if(m[p]==7){                           

                                   n[p]="7";}                     

                               if(m[p]==8){                           

                                   n[p]="8";}                         

                               if(m[p]==9){                           

                                   n[p]="9";}                         

                               if(m[p]==10){
                    
                                   n[p]="10";} 

				if(m[p]==11){                              

                                   n[p]="J";}                         

                               if(m[p]==12){                          

                                   n[p]="Q";}                     

                               if(m[p]==13){                          

                                   n[p]="k";}                 

                               }                   

                           System.out.println(" " + n[0] + operator3 + "((" + n[1] + operator1 + n[2] + ")"+ operator2 + n[3] + ")");   
                           flag = true;                   
                       }

			if(calcute(num1,tailMidResult,operator3) == 24){          

                           m[0]=num1;                 

                           m[1]=num2;                 

                           m[2]=num3;                     

                           m[3]=num4;                     

                           for(int p=0;p<4;p++){
             

                               if(m[p]==1){                       

                                   n[p]="A";}                     

                               if(m[p]==2){                           

                                   n[p]="2";}                         

                               if(m[p]==3){                           

                                   n[p]="3";}                         

                               if(m[p]==4){                           

                                   n[p]="4";}                         

                               if(m[p]==5){                           

                                   n[p]="5";}                     

                               if(m[p]==6){                           

                                   n[p]="6";}                     

                               if(m[p]==7){                           

                                   n[p]="7";}                         

                               if(m[p]==8){
                      

                                   n[p]="8";}                         

                               if(m[p]==9){                               

                                   n[p]="9";}                         

                               if(m[p]==10){                              

                                   n[p]="10";}                        

                               if(m[p]==11){                              

                                   n[p]="J";}

				if(m[p]==12){                              

                                   n[p]="Q";}                     

                               if(m[p]==13){                          

                                   n[p]="k";}                     

                               }                      

                           System.out.println(" " + n[0] + operator3 + "(" + n[1] + operator2 + "(" + n[2] + operator1 + n[3] + "))");          
                           flag = true;               
                           }                       

                       }           

                   } 

               }

            }

    }

5.测试结果

随机生成的两组数字,列举出的所有结果为24的表达式。

在这里插入图片描述在这里插入图片描述

6.经验归纳

此次的24点游戏开始真的没有头绪,随机产生4个整数,java种用random函数可以解决,但是4个数对应不同排序从± * /四个运算符中找3个运行计算结果并将等于24的表达式列举出来,是真的不知道怎样来实现。因此,此次代码主要借鉴网上其他网友的代码实现。
对应着代码,我找到了解决问题的方法。

1.四个数如何运算。用两个数运算结果与下一个数继续运算的方法。先是四个数中选2个根据operator1运算,再是其结果和剩下的两个数中一个根据operator2运算,最后是第二次的结果和剩下一个数根据operator3运算得出最终结果,看是否为24。注意的是每两个数运算时运算符有4种,即进行4次循环才可算全。还应注意四个数据中如果随季节产生了A
J Q K这几个字符串的运算。

2.四个数的4种情况。每个数可以重复4次,所有存在不同的重复情况:重复4次即一种数,重复两次或三次即两种数,重复一次即三种数,无重复的数即四个数均不相同。将重复的数在数组中用相同下标表示,并列出不同的组合形式,带入运算calculate函数直接运算。简化程序的重点在于相同的数下标相同。例如三个数相同,排序有以下4种:

calculation(num[1],num[1],num[1],num[3]),calculation(num[1],num[1],num[3],num[1])

calculation(num[3],num[1],num[1],num[1]),

calculation(num[1],num[3],num[1],num[3])

3.程序中用了HashMap的方法,在内部用链接列表来存储键值对。这个我不是特别了解,只是看到在程序中用map.put()存储数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值