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

运行及测试截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现24点游戏

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

  • 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点小游戏

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

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

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

  • C语言实现纸牌24点小游戏

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

  • Java实现的打地鼠小游戏完整示例【附源码下载】

    本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体代码: Mouse.java: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt

  • 用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFrame = new JFrame(); jFrame.setBounds(100,100,900,720); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON

  • java实现24点纸牌游戏

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

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • Java实现打飞机小游戏(附完整源码)

    写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐.代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习. 效果如下 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy

  • java实现数字猜拳小游戏

    本文编写一个java数字猜拳的小游戏,具体实现很简单 package guenum; import java.util.ArrayList; import java.util.Scanner; public class Demo { // private static Object list; public static void main(String ad[]) { System.out.println("-------------------------------------小游戏---

  • Java实现猜字小游戏

    猜字游戏是一款益智游戏,喜欢玩具有挑战性单词游戏的你就可以来体验一下了,给你一个字母板.尝试通过想象相邻字母的单词.您将获得一个分数,根据您使用的字母,你已经使用了多少个字母,并以这些字母相关联的任何修饰符都可以的. 具体代码如下所示: package test07; import java.util.Scanner; //猜字符游戏 public class Guessing { //主方法 public static void main(String[] args) { Scanner sc

随机推荐