Java实现24点小游戏
作者:WendyRay 发布时间:2023-07-26 07:34:55
标签: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[4];
//转换后的num1,num2,num3,num4
static int m[]=new int [4];
static String n[] = new String[4];
//用来判断是否有解
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[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 + n[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;
}
}
}
}
}
}
运行及测试截图:
来源:https://blog.csdn.net/WendyRay/article/details/82891624
0
投稿
猜你喜欢
- 1、通过查找API文档:2、Map.Entry是一个接口,所以不能直接实例化。3、Map.entrySet( )返回的是一个collecti
- 在我们实现某些功能时,可能会有倒计时的需求。比如发送短信验证码,发送成功后可能要求用户一段时间内不能再次发送,这时候我们就需要进行倒计时,时
- 前言JAVA缓存实现方案有很多,最基本的自己使用Map去构建缓存,或者使用memcached或Redis,但是上述两种缓存框架都要搭建服务器
- 一、准备工作mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直
- Java实现PC微信扫码支付做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付。微信支付官方网站业务流程:开发指引文档支付服务开发
- 具体详细介绍请看下文:在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Common
- 1,添加依赖在project的build.gradle文件中添加dependencies { classpath 'co
- java中javaBean与Bean的深入理解JavaBean 是Java中的一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点
- SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密。传
- 把三状态转换图放在这,方便分析方法的作用:1.Session的save()方法Session是Hibernate所有接口中最重要的接口,提供
- 前情提要我们上节内容学习了如何创建\注册\读取bean我们发现bean对象操作十分的繁琐!所以我们这个章节,就带大家来了解更加简单的bean
- 1、 namenode启动在本系列文章三中分析了hadoop的启动文件,其中提到了namenode启动的时候调用的类为org.apache.
- 目录1、两阶段终止模式介绍2、Terminator代码演示3、TerminationRequester4、模拟客户端或者服务端都可能终止服务
- 0-1背包的问题背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重
- 开发 Web 应用的思路实现一个简单的 JSP/Servlet。搭建创建 Web 应用工程的环境。创建 Web 应用工程。Web 应用工程的
- 1. 为什么要进行参数校验在后端进行工作时,需要接收前端传来的数据去数据库查询,但是如果有些数据过于离谱,我们就可以直接把它pass掉,不让
- 1)打开idea,开始创建SpringBoot项目2)选择 Spring Initializr ,选择合适的jdk版本,点击Next在操作到
- java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。静态方法是属于类的,不是属于类的对象。所以可以直接使用类名加
- 异常日志[com.alibaba.dubbo.rpc.filter.TimeoutFilter] - [DUBBO] invok
- Vector的基本介绍1.:Vector类的定义:public class Vector<E> ext