一.题目要求
经典的纸牌益智游戏:
从扑克中随机抽取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.运行结果
选择不同的菜单项显示不同结果
七.总结
运用了简单的方法完成了大概模型,目前有些功能还没有实现,比如:计分功能,生命值等等,还没有思考出有效的程序构建思路。争取时间下一次修补。