飞奔的炮台 发表于 2021-10-5 18:29:03

Java实现24点小游戏

这篇文章主要为大家详细介绍了Java实现24点小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了java实现24点小游戏的具体代码,供大家参考,具体内容如下
程序设计要求:
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,j代表11,q代表12,k代表13,a代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(c/c++/java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
算法设计思路:
算法采用了穷举的方法,对所有数字和操作符进行组合,从而找到所有的情况。
刚开始将四个数进行分组排序。
算法中我采用了将四个数分为1种的,两种的(在两种中又分为两种数的个数分别为1和3的,个数分别为2和2的),三种的和四种的,将所有情况排序排了出来。
每次只运算2个数,然后将结果拿去进行下一次运算。刚开始有4个数,拿出两个数进行第一次运算,运算后得出三个数,然后在这三个数中再拿出两个进行第二次运算,运算后就有两个数了,第三次运算就是将这两个数进行计算,得出最后值,判断最后这个值是否为24,若为24,则输出表达式,若不是,则输出提示消息。
现在在这4个数确定位置的情况下,再来改变操作符,即每次2个数进行运算的时候,有4种情况。在下一次计算的时候同样有4种情况,最后一次计算(第3次)同理。这样就找到了所有解的情况。
算法流程图为:

下面是代码:


package game;

import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import java.util.random;

public class compute {
//定义随机产生的四个数
static int number[] = new int;
//转换后的num1,num2,num3,num4
static int m[]=new int ;
static string n[] = new string;
//用来判断是否有解
static boolean flag = false;
//存放操作符
static char[] operator = { '+', '-', '*', '/' };
private static object key;

public static void main(string[] args){
random rand = new random();
system.out.println("下列给出四个数字,使用+,-,*,/进行计算使最后计算结果为24");
for(int i=0;i<4;i++){
number=rand.nextint(13)+1;//随机生成四个int型数

if(number==1){
system.out.println("a");//如果随机生成的数为1,则显示为扑克牌牌面中的a
}
else if(number==11){
system.out.println("j");//如果随机生成的数为11,则显示为扑克牌牌面中的j
}
else if(number==12){
system.out.println("q");//如果随机生成的数为12,则显示为扑克牌牌面中的q
}
else if(number==13){
system.out.println("k");//如果随机生成的数为13,则显示为扑克牌牌面中的k
}
else
system.out.println(number);
}
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) == null){
map.put(number, 1);
}
else {
map.put(number, map.get(number) + 1);
}
}
if(map.size() == 1){
//如果只有一种数字,此时只有一种排列组合,如5,5,5,5
calculation(number, number,number,number);
}
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=number=number,
//将不同的那个放到number,方便计算
number = key;
state = 1;
}
else if(map.get(key)==2){
//如果是两两相同的情况,将number变为number=number,number=number的情况
number=key;
number=key;
}
else{
number=key;
}
}
//列出2种情况的所有排列组合,并分别计算
if(state == 1){
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
}
if(state==0){
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
}
}
else if(map.size()==3){
//有3种数字的情况
int index = 0;
for (integer key : map.keyset()) {
if(map.get(key) == 2){
//将相同的2个数字放到number=number
number = key;
number = key;
}
else {
number = key;
}
}
//排列组合,所有情况
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
}
else if(map.size() == 4){
//4个数都不同的情况
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
calculation(number,number,number,number);
}
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;
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;
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;
//在以上的计算中num1,num2,num3,num4都是整型数值,但若要输出为带有a,j,q,k的表达式,则要将这四个数都变为string类型,下同
if(calcute(firstmidresult, num4, operator3) == 24){
m=num1;
m=num2;
m=num3;
m=num4;
for(int p=0;p<4;p++){
if(m==1){
n="a";}
if(m==2){
n="2";}
if(m==3){
n="3";}
if(m==4){
n="4";}
if(m==5){
n="5";}
if(m==6){
n="6";}
if(m==7){
n="7";}
if(m==8){
n="8";}
if(m==9){
n="9";}
if(m==10){
n="10";}
if(m==11){
n="j";}
if(m==12){
n="q";}
if(m==13){
n="k";}
}
system.out.println("((" + n + operator1 + n + ")" + operator2 + n + ")" + operator3 + n);
flag = true;//若有表达式输出,则将说明有解,下同
}
if(calcute(firstresult, firsttailresult, operator3) == 24){
system.out.println("(" + n + operator1 + n + ")" + operator3 + "(" + n + operator2 + n + ")");
flag = true;
}
if(calcute(midfirstresult, num4, operator3) == 24){
m=num1;
m=num2;
m=num3;
m=num4;
for(int p=0;p<4;p++){
if(m==1){
n="a";}
if(m==2){
n="2";}
if(m==3){
n="3";}
if(m==4){
n="4";}
if(m==5){
n="5";}
if(m==6){
n="6";}
if(m==7){
n="7";}
if(m==8){
n="8";}
if(m==9){
n="9";}
if(m==10){
n="10";}
if(m==11){
n="j";}
if(m==12){
n="q";}
if(m==13){
n="k";}
}
system.out.println("(" + n + operator2 + "(" + n + operator1 + n + "))" + operator3 + n);
flag = true;
}
if(calcute(num1,midtailresult, operator3) == 24){
m=num1;
m=num2;
m=num3;
m=num4;
for(int p=0;p<4;p++){
if(m==1){
n="a";}
if(m==2){
n="2";}
if(m==3){
n="3";}
if(m==4){
n="4";}
if(m==5){
n="5";}
if(m==6){
n="6";}
if(m==7){
n="7";}
if(m==8){
n="8";}
if(m==9){
n="9";}
if(m==10){
n="10";}
if(m==11){
n="j";}
if(m==12){
n="q";}
if(m==13){
n="k";}
}
system.out.println(" " + n + operator3 + "((" + n + operator1 + n + ")" + operator2 + n + ")");
flag = true;
}
if(calcute(num1,tailmidresult,operator3) == 24){
m=num1;
m=num2;
m=num3;
m=num4;
for(int p=0;p<4;p++){
if(m==1){
n="a";}
if(m==2){
n="2";}
if(m==3){
n="3";}
if(m==4){
n="4";}
if(m==5){
n="5";}
if(m==6){
n="6";}
if(m==7){
n="7";}
if(m==8){
n="8";}
if(m==9){
n="9";}
if(m==10){
n="10";}
if(m==11){
n="j";}
if(m==12){
n="q";}
if(m==13){
n="k";}
}
system.out.println(" " + n + operator3 + "(" + n + operator2 + "(" + n + operator1 + n + "))");
flag = true;
}
}
}
}
}
}
运行及测试截图:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://blog.csdn.net/WendyRay/article/details/82891624

http://www.zzvips.com/article/175780.html
页: [1]
查看完整版本: Java实现24点小游戏