1.游戏简介

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1).用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。

2.主要算法

利用栈来计算表达式的值,在与24进行比较.

2.1数据结构

LinkedList 相当于一个栈,其pop(),push()函数,就是弹栈,入栈的功能.

 //用于记录操作符private static LinkedList<String> operators = new LinkedList<>();//用于展示后缀表达式private static StringBuilder sb = new StringBuilder();

2.2 中缀表达式转后缀表达式

2.2.1规则

中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f + g * +。

转换过程需要用到栈,具体过程如下:

1)如果遇到操作数,我们就直接将其输出。

2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。

3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。

4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) “的情况下我们才弹出” ( “,其他情况我们都不会弹出” ( "。

5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

2.2.2 代码实现

 //中缀表达式转为后缀表达式private static int transferToPostfix(LinkedList<String> list) {Iterator<String> it = list.iterator();while (it.hasNext()) {String s = it.next();if (isOperator(s)) {//1.操作符的栈为空直接入栈if (operators.isEmpty()) {operators.push(s);} else {//A1:如果读入的操作符为非")"且优先级比栈顶元素的优先级高或一样,则将操作符压入栈if (priority(operators.peek()) <= priority(s) && !s.equals(")")){//peek():检索但不删除此列表的头(第一个元素)。operators.push(s);}//A2:如果读入的操作符为非")"且优先级比栈顶元素的优先级低,则弹出栈顶运算符else if (!s.equals(")")  && priority(operators.peek()) > priority(s)) {while (operators.size() != 0 && priority(operators.peek()) >= priority(s)&& !operators.peek().equals("(")) {if (!operators.peek().equals("(")) {String operator = operators.pop();sb.append(operator).append(" ");}}operators.push(s);}//如果读入的操作符是")",则弹出从栈顶开始第一个"("及其之前的所有操作符else if (s.equals(")")) {while (!operators.peek().equals("(")) {String operator = operators.pop();sb.append(operator).append(" ");}//弹出"("operators.pop();}}}//读入的为非操作符else {sb.append(s).append(" ");}}if (!operators.isEmpty()) {Iterator<String> iterator = operators.iterator();while (iterator.hasNext()) {String operator = iterator.next();sb.append(operator).append(" ");iterator.remove();}}
//        System.out.println("后缀: " + sb);int flag=calculate();return flag;}

2.3 计算后缀表达式的值

简单来讲,后缀表达式的计算就是从左到右扫描表达式,遇到数字就将其压入栈,遇到操作符表示可以计算,这时取出栈顶的两个元素进行操作,然后再次将结果压入栈,最后栈里会留下一个元素,该元素就是运行结果.

 //根据后缀表达式计算结果private static int calculate() {int flag=0;LinkedList<String> mList = new LinkedList<>();String[] postStr = sb.toString().split(" ");for (String s : postStr) {//字符则进行相应计算if (isOperator(s)) {if (!mList.isEmpty()) {int num1 = Integer.valueOf(mList.pop());int num2 = Integer.valueOf(mList.pop());if (s.equals("/") && num1 == 0) {System.out.println("除数不能为0");return 0;}int newNum = cal(num2, num1, s);//计算出弹出来的两个数的结果mList.push(String.valueOf(newNum));}} else {//数字则压入栈中mList.push(s);}}//if (!mList.isEmpty()) {if(Integer.parseInt(mList.pop())==24){++score;flag=2;System.out.println("真棒! 加一分");}else{flag=1;System.out.println("可惜!");}//System.out.println("result: " + mList.pop());//int result= Integer.parseInt(mList.pop());}return flag;}

2.4 通过线程控制输入的时间

 private void  show() {int a = 0;System.out.println("请在输60秒内输入表达式(每个字符之间空一格):");new Thread() {public void run() {flag=stack.m();if(Stack.live<1){System.exit(0);}}}.start();new Thread() {public void run() {for (int i = 0; i < 10; ) {try {Thread.sleep(1000);i++;} catch (InterruptedException e) {e.printStackTrace();}}if(flag==2){Stack.live++;flag=1;}Stack.live--;System.out.println("时间到!,进入下一题(当前生命值:"+Stack.live+"    分数:"+Stack.score+")");show();if(Stack.live<1){fileOut= new File("D://TopList.txt");try {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式bufferedWriter=new BufferedWriter(new FileWriter(fileOut,true));bufferedWriter.write(String.valueOf(df.format(new Date())+"-score:"+Stack.score+"\n"));bufferedWriter.close();} catch (IOException e) {e.printStackTrace();}System.out.println("您当前生命值已用完,拜拜啦您嘞!!");System.exit(0);}}}.start();}

3.运行结果

谢谢!

java实现24点经典游戏相关推荐

  1. java怒之铁拳,经典游戏《怒之铁拳》那些有趣的设定,资深玩家们表示白玩了...

    原标题:经典游戏<怒之铁拳>那些有趣的设定,资深玩家们表示白玩了 说到<怒之铁拳>系列,相信很多小伙伴都玩过的.而最近让玩家们最振奋的则是<怒之铁拳4>发行了.新版 ...

  2. 【Java】24点扑克牌游戏

    [Charloe原创] [前言] 这是学Java以来写的第一个比较有意思的东西--GUI界面的24点扑克牌游戏.大概是这个样子: [功能介绍] 一.随机生成四张扑克牌,按下Refresh按钮可以刷新牌 ...

  3. 【Java】十款经典游戏的Java版本(开源)

    转自 http://blog.csdn.net/qq_32353771/article/details/53899167 开源Java小游戏 前言 看到标题可能有人要笑我,用Java写游戏?没办法,毕 ...

  4. 【Java】三款经典游戏 java版本(开源)提升代码水平

    前言 看到标题可能有人要笑我,用Java写游戏?没办法,毕竟无论学什么语言我们都希望它能做出好玩有趣的应用.对于初学者来说,能做出个小游戏玩玩也是很大的学习动力嘛. java基础学习(初学者) 适合准 ...

  5. java怒之铁拳,经典游戏《怒之铁拳》那些有趣的设定,资深玩家也未必都见过...

    说到<怒之铁拳>系列,相信很多小伙伴都玩过的.而最近让玩家们最振奋的则是<怒之铁拳4>发行了.新版本的出现,让早已对动作过关游戏失去兴趣的我们,重新燃起战斗的欲望. 话说当年刚 ...

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

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

  7. Java语言实现经典游戏俄罗斯方块

    使用Java语言编写的经典游戏俄罗斯方块,能够调整游戏难度.加快下落速度.左右旋转方块等全部功能.(代码已集成在一个class内,如下所示,点击即可运行.内容水平有限,欢迎指正批评.) 演示视频 ht ...

  8. java 24点经典纸牌益智游戏

    java 24点经典纸牌益智游戏 内容 算法分析 概要设计 代码 测试 心得体会 内容 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢. ...

  9. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

最新文章

  1. java freemarker 模版_Java模板引擎-FreeMarker
  2. 【ARM-Linux开发】【CUDA开发】【深度学习与神经网络】Jetson Tx2安装相关之二
  3. 异常处理程序和软件异常——Windows核心编程学习手札之二十四
  4. 利用python下载网页到本地(python3)
  5. 对象属性之间的相互赋值
  6. Spring系列(二):Bean注解用法介绍
  7. mysql 启动_mysql安装、启动
  8. [shell] while read line 与for循环的区别
  9. 计算机编程竞赛怎么入门,acm编程比赛入门题目集..pdf
  10. 为什么我的计算机无法评分,高手看看我的电脑鲁大师怎么评分这么低啊
  11. 读书:梭罗的《瓦尔登湖》
  12. 在窗体创建时显示窗体
  13. 拓端tecdat|R语言分层线性模型案例
  14. jtopo实现左键框选,右键拖拽(拓扑图),以及设置成不能拖动
  15. far html 制作chm,CHM格式制作软件Far使用技巧
  16. 数学分析(2): 数列极限
  17. 软件工程毕业设计课题(40)基于JAVA毕业设计JAVA电子商务购物商城系统毕设作品项目
  18. fastadmin表格操作
  19. 互联网变迁-真实化信息的转移
  20. 程序员怒批996背后的支持者,刘强东和马云哑口无言!

热门文章

  1. xmanager5连接CENTOS6
  2. java+url+空格转码_Web里URL空格的转换方法
  3. js下载文件防止白屏
  4. bzoj2565(manacher)
  5. 2021全国特种设备-Q2桥式起重机司机模拟考试题库一[安考星]
  6. CSS 笔记——定位尺寸
  7. LaTeX期刊论文写作
  8. 数学之路(4)-数学基础-幂函数图像与函数平移
  9. 工程师的基本功是什么?如何练习?—学习心得分享
  10. Python运维开发(CMDB资产管理系统)——环境部署(下)