用Java实现24点游戏

一、常见游戏规则

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。

基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。

1.程序风格良好(使用自定义注释模板)

2.列出表达式无重复。

提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。

1. 程序风格良好(使用自定义注释模板)

2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。

3.所有成绩均可记录在TopList.txt文件中。

二、算法分析

用户需要提前输入4个数,作为凑成24点的基数,构成arr数组,从而求解目标数T=24。

在数arr中,首先取两个数与操作符集合进行组合,分别得到一组表达式,对于新得到的每个表达式,都可以和原集合中剩下的元素,组合成新的集合组,将每次得到的表达式,都用"()"包住,以保证计算先后顺序。

对集合中所有元素进行两两组合,并与剩余元素形成新的集合。由此,我们得到了一组元素为k-1个的集合组

对新集合组中的每一个集合,重复以上1-3步,可得到一组包含k-2个元素的集合组...以此类推,最后会得到一组集合,其中每个集合都只包含一个元素,这个就是我们合成的最终表达式.对第四步得到的表达式集合进行求解,判断其是否等于目标数24,将符合条件的过滤出来,即得到所有满足条件的表达式。

三、概要设计

主函数程序流程图

四、代码

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;
					}
				}
			}
		}
	}
}

五、测试

测试用例:2 8 10 4

测试结果:

可以看到,程序成功的生成了对应测试用例的结果,结果是正确的。

测试无法组成24点的数据:7 13 1 6

经过多次运行, 7,13,1,6这四个数据,无法组成24点,程序输出No answer运行正确。

到此这篇关于用Java实现24点游戏的文章就介绍到这了,更多相关Java24点游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java编写的24点纸牌游戏

    任意4个1-13数字,加减乘除计算24点. 实现原理: 1)排列组合4个数字 2)计算每次排列组合的可能性 Cal24.java import java.util.HashSet; import java.util.Set; public class Cal24 { private static final double precision = 0.00001; private static final int target = 24; public String[] execute(Strin

  • 利用Java编写24点小游戏的实例代码

    话不多说直接给大家上代码 package com.company; import java.util.*; /** * 24点小游戏 * 游戏规则:系统自动生成4个1-10的随机整数,玩家通过加减乘除操作,得到结果为24,每个数字只能使用一次 */ public class Game24Player { final String[] patterns = {"nnonnoo", "nnonono", "nnnoono", "nnnono

  • java实现24点游戏

    游戏规则 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式 列出表达式无重复 用户初始生命值为一给定值(比如3),初始分数为0.随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局. 使用计时器要求用户在规定时间内输入表达式,如

  • java实现24点纸牌游戏

    本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题. 分析 用穷举法列出四个数加上三个运算符号所构成的表达式所有

  • Java实现的迷宫游戏

    完整项目地址: https://github.com/richenyunqi/Maze-game 软件总体框架 该软件主要分为如下三个模块: 参数设置模块 按钮功能模块按钮功能模块 迷宫主界面模块迷宫主界面模块 软件各模块介绍 参数设置模块 1.迷宫大小相关参数: ROWS(即迷宫行数,默认设置为奇数,最小值为11,最大值为99,默认值为11): COLS(即迷宫列数,默认设置为奇数,最小值为11,最大值为99,默认值为11): Lattice's width(即组成迷宫的格子的宽度,迷宫格子默

  • Java实战入门之双色球彩票小游戏

    一.项目需求 二.项目思路 1.菜单制作 2.中奖号码生成 getNumber (随机数 Math.random) 3.购买号码和中奖号码比对 生成中奖等级 package com.test.mxl; import java.util.Scanner; public class Test { public static void main(String[] args) { int[] balls = new int[7]; int count = 0; boolean isBuy = false

  • Java实战之贪吃蛇小游戏(源码+注释)

    一.工程文件 二.Main.java package com.company; import javax.swing.*; public class Main { public static void main(String[] args) { //创建窗体对象 JFrame frame = new JFrame(); //创建窗体参数() frame.setBounds(10,10,900,720); //设置不允许更改大小 //frame.setResizable(false); //设置关

  • Java实现五子棋游戏

    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 一.功能分析 五子棋的实现还是较为简单的,通过下期的流程我们可以知道大概要实现一下功能: 1.格界面 2.点击下棋 3.悔棋 4.判断输赢 二.功能实现 根据之前的功能分析,要有网格先要有窗体,我们先重新写一个类,来继承JFrame类,以便在窗口变动的情况下,对窗口进行重绘(防止在窗口大小发生改变的时候,之前的绘画会消失),这里我们重写paint方法,画出网格线 public class MyFrame extend

  • Java Swing实现坦克大战游戏

    一.引言 90坦克大战,很经典的一款游戏,当年与小伙伴一人一个手柄,搬上小板凳坐在电视机前,身体时不时跟随手柄摇晃着,时而表情严肃.眉头紧锁,时而欢呼雀跃.喜笑颜开,全身心投入到游戏中,在消灭一只只坦克.守住关卡.坦克升级.晋级通关的时候,更是手舞足蹈.击掌庆祝,如今想想也是记忆犹新.回味无穷!于是乎就我就自己用java写了一个,找一下当年的感觉,顺便虐一下电脑,嘻嘻嘻嘻嘻(ming式笑声). 二.效果图 三.实现 绘图时将这个鹰的图标用 g.drawImage 的方式绘制在界面中央最下方,然后

  • Java实现24点小游戏

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

  • Java实战之飞翔的小鸟小游戏

    前言 一个简单的单机小游戏:flypybird ,用来巩固java基础. 涉及主要知识点:JFrame . JPanel . 继承. 键盘/鼠标监听 . 多线程 . 工具类设计 提示:这是大致的实现过程,实际实现过程有一定的修改,具体以源码为准. 一.大体思路 1.首先要有一个框架,作为主程序入口,这里使用 JFrame  类. 2.然后需要有一个画布,用来把游戏场景画上去,然后在上面添加键盘/鼠标监听来控制,这里使用的是 JPenal 类. 3.需要创建几个类:小鸟.地面.障碍物柱子.一个获取

随机推荐