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文件中。

一. 算法思路

输入四个数n1,n2,n3,n4,求解目标数T=24,以及一组计算操作符"+" "-" "*" "/" ,求所有由该组数字及操作符组成的多项式表达式集合,其值等于目标数T ,即T = 24。
    算法思路如下:
       1.在集合{n1,n2,n3,n4}中,首先取两个数字,如n1,n2,与操作符集合进行组合,分别得到一组表达式:n1*n2,n1+n2,n1-n2,n1/n2,n2-n1,n2/n1.(其中由于"-"和"/"操作符,左右互换会导致计算结果不同,所以在该组合中,包含"-"和"/"操作符的表达式各有两个,操作数先后顺序不同);
        2.对于新得到的每个表达式,都可以和原集合中剩下的元素,组合成新的集合组,同时,我将每次得到的表达式,都用"()"包住,以保证计算先后顺序:
{(n1*n2),n3,n4},{(n1+n2),n3,n4},{(n1-n2),n3,n4},{(n1/n2),n3,n4},{(n2-n1),n3,n4},{(n2/n1),n3,n4};
       3.基于以上方法,对集合中所有元素进行两两组合,并与剩余元素形成新的集合。由此,我们得到了一组元素为k-1个的集合组
      4.对新集合组中的每一个集合,重复以上1-3步,可得到一组包含k-2个元素的集合组...以此类推,最后会得到一组集合,其中每个集合都只包含一个元素,这个就是我们合成的最终表达式
      5.对第四步得到的表达式集合进行求解,判断其是否等于目标数24,将符合条件的过滤出来,即得到所有满足条件的表达式。

package TwentyfourGame;import java.util.ArrayList;
import java.util.Scanner;public class TfGame {public static void main(String[] args) {//输入提示System.out.println("—————————欢迎进入24点游戏———————————");System.out.println("请随机输入四个1-13之间的整数(以空格隔开):");ArrayList<Integer> list = inputNum();   //调用输入函数tfCal(list, new ArrayList<String>());   //计算24点方法, 实参list为输入的数据, new ArrayList<String>()用来 表示计算过程System.out.println("——————————————end———————————————");}//输入方法,将输入的四个数存入数组队列list中,并返回private static ArrayList<Integer> inputNum() {ArrayList<Integer> alist = new ArrayList<Integer>();  //ArrayList<Integer>表示只能接收整型数据Scanner scanner = new Scanner(System.in);for (int i = 0; i < 4; i++) {         //将四个数添加到数组队列中alist.add(scanner.nextInt());}return alist;  //返回值为数组队列中的四个数}//计算24点游戏的方法public static boolean tfCal(ArrayList<Integer> list, ArrayList<String> str) {int length = list.size();    if (length > 1) {/**利用双重循环取出两个数的计算所有情况* 若list的长度为4,那么第一个数的下标和第二个数的下标分别为* 0  1* 1  2* 2  3*/for (int i = 0; i < length - 1; i++) {     for (int j = i + 1; j < length; j++) {//加法运算int b = list.remove(j);  //移除list中的下标为j的元素,并将此数赋值给bint a = list.remove(i);  //同上,将值赋给alist.add(0, a + b);      //将两数的计算结果添加到原队列str.add(a + "+" + b + "=" + (a + b));//此处是保存计算的过程tfCal(list, str);    //递归调动//下面四句话是为了还原list队列,特别强调进栈和出栈的顺序list.remove(0);list.add(i, a);list.add(j, b);str.remove(str.size() - 1);//减运算(a-b),原理与上面加法计算相同b = list.remove(j);a = list.remove(i);list.add(0, a - b);str.add(a + "-" + b + "=" + (a - b));tfCal(list, str);list.remove(0);list.add(i, a);list.add(j, b);str.remove(str.size() - 1);//减运算(b-a)b = list.remove(j);a = list.remove(i);list.add(0, b - a);str.add(b + "-" + a + "=" + (b - a));tfCal(list, str);list.remove(0);list.add(i, a);list.add(j, b);str.remove(str.size() - 1);//乘运算b = list.remove(j);a = list.remove(i);list.add(0, a * b);str.add(a + "*" + b + "=" + (a * b));tfCal(list, str);list.remove(0);list.add(i, a);list.add(j, b);str.remove(str.size() - 1);//除运算(a/b)b = list.remove(j);a = list.remove(i);if (b != 0 && a % b == 0) {list.add(0, a / b);str.add(a + "/" + b + "=" + (a / b));tfCal(list, str);list.remove(0);list.add(i, a);list.add(j, b);str.remove(str.size() - 1);} else {list.add(i, a);list.add(j, b);}//除运算(b/a)b = list.remove(j);a = list.remove(i);if (a != 0 && b % a == 0) {list.add(0, b / a);str.add(b + "/" + a + "=" + (b / a));tfCal(list, str);list.remove(0);list.add(i, a);list.add(j, b);str.remove(str.size() - 1);} else {list.add(i, a);list.add(j, b);}}}} else {if (str.get(str.size() - 1).endsWith("=24")) {   //endsWith()方法用于测试字符串是否以指定后缀结束for (String temp : str) {System.out.print(temp + " ");}  System.out.println();}               }}
}

二.运行结果

三.学习心得

自己的算法学习有待提高,需要不断锻炼逻辑思维能力。

Java利用递归算法实现24点游戏相关推荐

  1. [Java]利用面向对象知识来完成“游戏代练场景”

    package gametest;public class Game {public void star() {System.out.println("开机开机准备上线!");}p ...

  2. 24点游戏——C语言纯代码及MFC风格

    1.实验目的 a.24点游戏是经典的纸牌益智游戏,请完成它. 2.题目描述 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表10),按照 ...

  3. java实现24点游戏

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

  4. Java:做一个自动生成24点游戏,并能自主解决的程序

    我们首先利用random函数,随机从1-13中挑选数字,挑选四次. public static void main(String[] args) {Random r = new Random();in ...

  5. 24点游戏 java实现_java实现24点纸牌游戏

    本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢 ...

  6. JAVA 利用ASCII码偏移(来自IDEA免费激活码游戏)

    前言 最近idea风风光光激活码失效,于是官方推出了一系列游戏,DD大哥也给我们解析了很多 20/03/13 JetBrains 第二轮:再为免费全家桶续命三个月 20/03/12 免费获取 Jetb ...

  7. 24点游戏---java编写

    24点游戏 前言 1. 算法分析  1 .1 接收玩家结果输入与结果判定.  1.2 工具类TimeUtils.CardUtils.  1.3 数据生成与结果计算. 2. 概要设计 2.1 结构设计 ...

  8. Java黑皮书课后题第3章:**3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小、花色

    **3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小.花色 题目 题目概述 运行示例 破题 代码 题目 题目概述 **3.24(游戏:抽牌)编写程序,模拟从一副52张 ...

  9. 24点游戏java代码 中国开源社区_编程之美 1.16 24点游戏

    24点游戏大家都知道:4张牌,可以进行+ - * / 四种运算,可以使用括号,每个牌用一次,任意组合构造表达式使结果为24. 扩展问题:n个整数,四种运算,可使用括号,每个数字使用一次,使表达式结果为 ...

  10. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏

    基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文 ...

最新文章

  1. NHibernate从入门到精通系列(7)——多对一关联映射
  2. 循序渐进Python3(七) -- 2-- 面向对象进阶
  3. App架构设计经验谈:展示层的设计
  4. php 单元测试分享,今日分享:代码整洁之道- 单元测试
  5. EIGENVECTORS FROM EIGENVALUES论文结论举例验证
  6. 强化学习-动态规划_强化学习-第5部分
  7. fread函数和fwrite函数,read,write
  8. 25岁男生要有多少存款才能让女友满意?
  9. 恢复IE8自带的源代码查看器
  10. Python中 类和对象调用其他类中的变量和方法
  11. J2EE实现发送邮件功能
  12. linux php文件,Linux php文件安装目录在哪
  13. 实用工具类APP,海外大有可为
  14. 使用 Python 进行双重退火优化
  15. 学习DX编程中的一个很丢脸,但是不知道是为什么的问题
  16. STM32串口调试一直打印 00 00
  17. 怎么用python下载网易云_使用Python实现下载网易云音乐的高清MV
  18. 计算机应用u盘解释,U盘速度测试和参数解释
  19. 计算机原理 · 全加器
  20. 页面设计如何进行颜色搭配

热门文章

  1. 军哥独家QCIE(囊括CCIE和HCIEv3.0)的全新课程。请大家参阅
  2. 小红书 x DorisDB:实现数据服务平台统一化,简化数据链路,提升高并发极速查询能力...
  3. STM32单片机热敏打印自助排队叫号系统银行医院柜台DY-SV17F语音播报
  4. 什么是BI、什么是ETL?一篇文章告诉你
  5. [渝粤教育] 西南科技大学 语文教材教法 在线考试复习资料2021版
  6. OneZero第四周第五次站立会议(2016.4.15)
  7. ValueError: y contains previously unseen labels: ‘103125‘
  8. 中国电视、广播产业运营状况及收入规模调研报告2021-2027年
  9. 艾永亮:从小公司到行业龙头,一路披荆斩棘,最后输给了电商
  10. php单元测试入门教程phpunit详解