24点纸牌益智小游戏

一.题目要求
经典的纸牌益智游戏:
从扑克中随机抽取4张纸牌,通过加减乘除运算(其中,J代表11,Q代表12,K代表13,A代表1);找出所有满足运算结果为24的表达式并由程序输出;
二.算法分析
要点1:随机生成4个数(这个就很简单了)
利用Random类

/**
     *
     * @param: [num]
     * @return: void
     * @Description:生成4个在[1-13]的随机数
     */
    public static void randomNumber(int[] num){

        for(int i = 0;i < 4;i++){
            int x = new Random().nextInt(13)+1;
            num[i] = x;
            System.out.print(card(num[i])+" ");
        }
    }

要点2:4个数,当然需要3个运算操作符连接喽,那么到底是哪三个呢,我也不知道,哈哈哈,这时候可以运用穷举法,列出所有基本操作符的很多种组合。当然,还要注意括号哦(优先级)

//穷举所有运算符组合形式
        for(int i = 0; i < 4;i++){
            for(int j = 0; j < 4;j++){
                for(int k = 0;k < 4;k++){
                    newOperator[0] = operator[i];
                    newOperator[1] = operator[j];
                    newOperator[2] = operator[k];
                    play(num,newOperator);
                }
            }
        }

三.流程图分析
额额额,这个流程图有点。。。下次争取弄得好看点

在这里插入图片描述
四.程序模块组成
(1)菜单模块
功能:显示菜单,方便用户进行操作

/**
     *
     * @param: []
     * @return: void
     * @Description:菜单模块
     */
    void menu(){
        while(true){
            System.out.println("******1.开始游戏******");
            System.out.println("******2.退出游戏******");
            System.out.println("请输入菜单选项:");
            int input = scanner.nextInt();
            switch (input){
                case 1:
                    //生成随机数
                    randomNumber(num);
                    System.out.println();
                    operatorHandle(num);
                    break;
                case 2:
                    return;
                default:
                    System.out.println("请选择1或者2!!!");
                    break;
            }
        }
    }

(2)随机数生成模块
功能:生成4个随机数,范围:1~13,并保存在数组中

/**
     *
     * @param: [num]
     * @return: void
     * @Description:生成4个在[1-13]的随机数
     */
    public static void randomNumber(int[] num){

        for(int i = 0;i < 4;i++){
            int x = new Random().nextInt(13)+1;
            num[i] = x;
            System.out.print(card(num[i])+" ");
        }
    }

(3)运算符操作模块
功能:实现加减乘除操作

/**
     *
     * @param: [num1, num2, operate]
     * @return: double
     * @Description:运算符计算模块
     */
    public static double operatorCompute(double num1,double num2,char operate){

        double result = 0;
        switch (operate){
            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;
                default:break;
        }
        return result;
    }

(4)数字转换模块
功能:1->A;11->J;12->Q;13->K,完成转换

/**
     *
     * @param: [number]
     * @return: char
     * @Description:将数字转换为纸牌标数
     */
    public static char card(int number){

        if(number == 1)
            return 'A';
        if(number < 10)
            return (char)(number+'0');
        else if(number == 10)
            return '0';
        else if(number == 11)
            return 'J';
        else if(number == 12)
            return 'Q';
        else if(number == 13)
            return 'K';
        return 0;
    }

(5)操作符处理模块
功能:操作符,操作数组成表达式判断,输出符合条件的表达式

/**
     *
     * @param: [num, operator]
     * @return: void
     * @Description:计算判断符合24点条件的表达式
     */
    public static void play(int[] num,char[] operator){

        int a = num[0];
        int b = num[1];
        int c = num[2];
        int d = num[3];
        double result;

        //((A?B)?C)?D
        result = operatorCompute(operatorCompute(operatorCompute(a,b,operator[0]),c,operator[1]),d,operator[2]);
        if(result == 24){
            System.out.println("("+"("+card(a)+operator[0]+card(b)+")"+operator[1]+card(c)+")"+operator[2]+card(d));
        }

        //(A?(B?C))?D
        result = operatorCompute(operatorCompute(a,operatorCompute(b,c,operator[1]),operator[0]),d,operator[2]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+"("+card(b)+operator[1]+card(c)+")"+")"+operator[2]+card(d));
        }

        //(A?B)?(C?D)
        result = operatorCompute(operatorCompute(a,b,operator[0]),operatorCompute(c,d,operator[2]),operator[1]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+card(b)+")"+operator[1]+"("+card(c)+operator[2]+card(d)+")");
        }

        //A?(B?(C?D))
        result = operatorCompute(a,operatorCompute(b,operatorCompute(c,d,operator[2]),operator[1]),operator[0]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+"("+card(b)+operator[1]+"("+card(c)+operator[2]+card(d)+")"+")"+")");
        }

        //A?((B?C)?D))
        result = operatorCompute(a,operatorCompute(operatorCompute(b,c,operator[1]),d,operator[2]),operator[0]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+"("+"("+card(b)+operator[1]+card(c)+")"+operator[2]+card(d)+")"+")"+")"+")");;
        }

    }

五.程序源代码

package Programming;

import java.util.Random;
import java.util.Scanner;

/**
 * @Author:Star
 * @Date:Created in 23:32 2019/4/10
 * @Description:24点纸牌益智游戏,随机生成4个数,程序输出所有符合24点的算术式
 */

class Game{

    Scanner scanner = new Scanner(System.in);
    //存放随机生成数的数组
    int[] num = new int[4];

    /**
     *
     * @param: []
     * @return: void
     * @Description:菜单模块
     */
    void menu(){
        while(true){
            System.out.println("******1.开始游戏******");
            System.out.println("******2.退出游戏******");
            System.out.println("请输入菜单选项:");
            int input = scanner.nextInt();
            switch (input){
                case 1:
                    //生成随机数
                    randomNumber(num);
                    System.out.println();
                    operatorHandle(num);
                    break;
                case 2:
                    return;
                default:
                    System.out.println("请选择1或者2!!!");
                    break;
            }
        }
    }

    /**
     *
     * @param: [number]
     * @return: char
     * @Description:将数字转换为纸牌标数
     */
    public static char card(int number){

        if(number == 1)
            return 'A';
        if(number < 10)
            return (char)(number+'0');
        else if(number == 10)
            return '0';
        else if(number == 11)
            return 'J';
        else if(number == 12)
            return 'Q';
        else if(number == 13)
            return 'K';
        return 0;
    }

    /**
     *
     * @param: [num1, num2, operate]
     * @return: double
     * @Description:运算符计算模块
     */
    public static double operatorCompute(double num1,double num2,char operate){

        double result = 0;
        switch (operate){
            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;
                default:break;
        }
        return result;
    }


    /**
     *
     * @param: [num]
     * @return: void
     * @Description:生成4个在[1-13]的随机数
     */
    public static void randomNumber(int[] num){

        for(int i = 0;i < 4;i++){
            int x = new Random().nextInt(13)+1;
            num[i] = x;
            System.out.print(card(num[i])+" ");
        }
    }

    /**
     *
     * @param: [num]
     * @return: void
     * @Description:运算符处理模块(穷举法列出所有的运算符组合形式)
     */
    public static void operatorHandle(int[] num){

        char[] operator = {'+','-','*','/'};
        char[] newOperator = new char[4];

        //穷举所有运算符组合形式
        for(int i = 0; i < 4;i++){
            for(int j = 0; j < 4;j++){
                for(int k = 0;k < 4;k++){
                    newOperator[0] = operator[i];
                    newOperator[1] = operator[j];
                    newOperator[2] = operator[k];
                    play(num,newOperator);
                }
            }
        }
    }

    /**
     *
     * @param: [num, operator]
     * @return: void
     * @Description:计算判断符合24点条件的表达式
     */
    public static void play(int[] num,char[] operator){

        int a = num[0];
        int b = num[1];
        int c = num[2];
        int d = num[3];
        double result;

        //((A?B)?C)?D
        result = operatorCompute(operatorCompute(operatorCompute(a,b,operator[0]),c,operator[1]),d,operator[2]);
        if(result == 24){
            System.out.println("("+"("+card(a)+operator[0]+card(b)+")"+operator[1]+card(c)+")"+operator[2]+card(d));
        }

        //(A?(B?C))?D
        result = operatorCompute(operatorCompute(a,operatorCompute(b,c,operator[1]),operator[0]),d,operator[2]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+"("+card(b)+operator[1]+card(c)+")"+")"+operator[2]+card(d));
        }

        //(A?B)?(C?D)
        result = operatorCompute(operatorCompute(a,b,operator[0]),operatorCompute(c,d,operator[2]),operator[1]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+card(b)+")"+operator[1]+"("+card(c)+operator[2]+card(d)+")");
        }

        //A?(B?(C?D))
        result = operatorCompute(a,operatorCompute(b,operatorCompute(c,d,operator[2]),operator[1]),operator[0]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+"("+card(b)+operator[1]+"("+card(c)+operator[2]+card(d)+")"+")"+")");
        }

        //A?((B?C)?D))
        result = operatorCompute(a,operatorCompute(operatorCompute(b,c,operator[1]),d,operator[2]),operator[0]);
        if(result == 24){
            System.out.println("("+card(a)+operator[0]+"("+"("+card(b)+operator[1]+card(c)+")"+operator[2]+card(d)+")"+")"+")"+")");;
        }

    }
}
public class TestCardsGame {
    public static void main(String[] args) {
        new Game().menu();
    }
}

六.调试、测试及运行结果
1.调试截屏
1.1程序运行无错误,但在表达式输出时显示错误
在这里插入图片描述
1.2调试过程
在这里插入图片描述
调试结束,发现是括号的问题;
2.测试截图
在这里插入图片描述
3.运行结果
选择不同的菜单项显示不同结果
在这里插入图片描述
七.总结
运用了简单的方法完成了大概模型,目前有些功能还没有实现,比如:计分功能,生命值等等,还没有思考出有效的程序构建思路。争取时间下一次修补。

猜你喜欢

转载自blog.csdn.net/weixin_44369212/article/details/89219967