纸牌游戏

24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。

package zuoye;
import java.util.Scanner;
/**
 * 具体做法是:
 *  1.先随机拿出2个数
 *  2.先将这两个数进行+ - * /运算,得到的结果放在一个新的数组,再将这个数和第三个数进行运算
 *  3.以此类推,运用递归运算,直到四个数运算结束
 *  4.当四个数运算结束(即n = 1)时,判断结果是否是24,是返回"可以组成24",否则"不能组成24"
 * @author 
 *
 */
public class TfPointGame {
    private static int COUNT = 4; //抽取的扑克牌数量
    private static double[] number = new double[COUNT]; //定义扑克牌的数组
    private static String[] expressformula = new String[COUNT]; //定义表达式数组
    
    public static void main(String[] args) {
    	
        Scanner scanner = new Scanner(System.in);  //从键盘输入
        System.out.println("请输入1-13之间的"+COUNT+"个正整数");
        for (int i = 0; i < COUNT; i++) {          //连续输入1-13之间的4个数
            number[i] = scanner.nextInt();
            int x = (int)number[i];
            expressformula[i] = String.valueOf(x);
        }
        if(checkCondition(COUNT))
            System.out.println("可以组成24!");
        else
            System.out.println("不能组成24!");
    }
    
    
    /**
     * 先对随机产生的两个数进行运算,这两个数计算的结果和第三个数组成两数计算,
     * 以此类推,直到四个数经过运算组合成一个数(即n = 1)时,判断这个数是否等于24
     * 若等于24,输出这四个数的运算,否则返回false
     * @param n
     * @return
     */
    public static boolean checkCondition(int n){
    	
        //当递归到只有一个数时,判断是否满足等于24的条件
        if(n == 1){
            if(number[0] == 24){
            	/*
            	 * 输出可以构成24的表达式
            	 * substring(x)   是从字符串的的第x个字符截取
            	 * substring(x,y)是从x到y前的位置停止
            	 */
                System.out.println(expressformula[0].substring(1, expressformula[0].length()-1));
                return true;
            }
            else
                return false;
        }
        
        
        for (int i = 0; i < n - 1; i++) {
            for(int j = i + 1; j < n; j++){
            	
            	//首先对两个数进行运算,定义两个变量,和两个表达式
                double num1 = number[i];
                double num2 = number[j];
                //两个表达式
                String express1 = expressformula[i];
                String express2 = expressformula[j];
                number[j] = number[n-1];
                expressformula[j] = expressformula[n-1];
                
                //做加法运算
                expressformula[i] = "("+express1+"+"+express2+")";
                number[i] = num1+num2;
                if(checkCondition(n-1))
                    return true;
                
                /*减法运算:
                 * (1)num1-num2
                 * (2)num2-num1
                 */
                expressformula[i] = "("+express1+"-"+express2+")";
                number[i] = num1-num2;
                if(checkCondition(n-1))
                    return true;
                expressformula[i] = "("+express2+"-"+express1+")";
                number[i] = num2-num1;
                if(checkCondition(n-1))
                    return true;
                
                //乘法运算
                expressformula[i] = "("+express1+"*"+express2+")";
                number[i] = num1*num2;
                if(checkCondition(n-1))
                    return true;
                
                /*除法运算两种情况(分母不为0)
                 * (1)num1/num2
                 * (2)num2/num1
                 */
                //第一种
                if(num2 != 0){//分母不为0
                	expressformula[i] = "("+express1+"/"+express2+")";
                    number[i] = num1/num2;
                    if(checkCondition(n-1))
                        return true;
                }
                //第二种
                if(num1 != 0){//分母不为0
                	expressformula[i] = "("+express2+"/"+express1+")";
                    number[i] = num2/num1;
                    if(checkCondition(n-1))
                        return true;
                }
                number[i] = num1;
                number[j] = num2;
                expressformula[i] = express1;
                expressformula[j] = express2;
            }
        }
        return false;
    }
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值