java 24点经典纸牌益智游戏

  • 内容
    • 算法分析
    • 概要设计
    • 代码
    • 测试
    • 心得体会

内容

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

算法分析

创建一个person类存放玩家的分数和生命值;创建一个洗牌类Makepuker实现洗牌和发牌,用Hashmap储存扑克,调用Collctions的suffer方法实现习洗牌;类player实现游戏的运行,其中calculate函数中实现中缀表达式计算,play函数用于中调用Makerpuker中的makerpuker函数洗牌,然后用户根据puker输入表达式,计时器判断是否超时,如果超时则不用比价结果直接进入下一行,否则比较;play类中的make函数对makerpuker函数中的返回值进行判断,并向用户响应相应的结果,main函数调用make函数,并将结果写入文件。

概要设计

代码

package game;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;public class Makepuker {public  String[] makepuker() {List<String> color = List.of("♥", "♠", "♣", "♦");List<String> number = List.of("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "k");//存放扑克HashMap<Integer, String> pai = new HashMap<>();//存放扑克的所引ArrayList<Integer> index = new ArrayList<>();int i = 0;//循环嵌套存放扑克和索引for (String c : color) {for (String n : number) {pai.put(i, n + c);index.add(i);i++;}}//洗牌Collections.shuffle(index);// System.out.println(index);//System.out.println(pai);//取出前4张牌String puker[] = new String[4];for (int j = 0; j <= 3; j++) {puker[j] = pai.get(index.get(j));System.out.println(puker[j]);}return puker;}
}
package game;public class person {private int  life;private int score ;public person(int life, int score) {this.life = life;this.score = score;}public person() {}public int getLife() {return life;}public void setLife(int life) {this.life = life;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}
}
package game;import game.thread.threadpool;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;public class player {public int play(){//获取开始游戏时系统时间long star = System.currentTimeMillis();//洗牌Makepuker makepuker=new Makepuker();makepuker.makepuker();System.out.println("根据扑克输入表达式");Scanner scanner=new Scanner(System.in);String s=scanner.next();BigDecimal a= new BigDecimal(24);person p=new person();//获取系统时间long end = System.currentTimeMillis();if(end-star<20000) {//如果时间小于10秒则进行比较if (calculate(s).equals(a)) {//输入的表达式等于24return 1;} else {//输入的表达式不等于24return 2;}}else {//时间到了return 3;}}//计算加减乘除四则运算public BigDecimal calculate(String str){// 对表达式进行预处理,并简单验证是否是正确的表达式// 存放处理后的表达式List<String> list = new ArrayList<>();char[] arr = str.toCharArray();// 存放数字临时变量StringBuffer tmpStr = new StringBuffer();for (char c : arr) {// 如果是数字或小数点,添加到临时变量中if (c >= '0' && c <= '9') {tmpStr.append(c);} else if (c == '.') {if (tmpStr.indexOf(".") > 0) {throw new RuntimeException("非法字符");}tmpStr.append(c);}// 如果是加减乘除或者括号,将数字临时变量和运算符依次放入list中else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')') {if (tmpStr.length() > 0) {list.add(tmpStr.toString());tmpStr.setLength(0);}list.add(c + "");}// 如果是空格,跳过else if (c == ' ') {continue;} else {throw new RuntimeException("非法字符");}}if (tmpStr.length() > 0) {list.add(tmpStr.toString());}// 初始化后缀表达式List<String> strList = new ArrayList<>();// 运算过程中,使用了两次栈结构,第一次是将中缀表达式转换为后缀表达式,第二次是计算后缀表达式的值Stack<String> stack = new Stack<>();// 声明临时变量,存放出栈元素String tmp;// 1. 将中缀表达式转换为后缀表达式for (String s : list) {// 如果是左括号直接入栈if (s.equals("(")) {stack.push(s);}// 如果是右括号,执行出栈操作,依次添加到后缀表达式中,直到出栈元素为左括号,左括号和右括号都不添加到后缀表达式中else if (s.equals(")")) {while (!(tmp = stack.pop()).equals("(")) {strList.add(tmp);}}// 如果是加减乘除,弹出所有优先级大于或者等于该运算符的栈顶元素(栈中肯定没有右括号,认为左括号的优先级最低),然后将该运算符入栈else if (s.equals("*") || s.equals("/")) {while (!stack.isEmpty()) {// 取出栈顶元素tmp = stack.peek();if (tmp.equals("*") || tmp.equals("/")) {stack.pop();strList.add(tmp);} else {break;}}stack.push(s);} else if (s.equals("+") || s.equals("-")) {while (!stack.isEmpty()) {// 取出栈顶元素tmp = stack.peek();if (!tmp.equals("(")) {stack.pop();strList.add(tmp);} else {break;}}stack.push(s);}// 如果是数字,直接添加到后缀表达式中else {strList.add(s);}}// 最后依次出栈,放入后缀表达式中while (!stack.isEmpty()) {strList.add(stack.pop());}// 2.计算后缀表达式的值Stack<BigDecimal> newStack = new Stack<>();for (String s : strList) {// 若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,// 运算后的结果再进栈,直到后缀表达式遍历完毕if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {BigDecimal b1 = newStack.pop();BigDecimal b2 = newStack.pop();switch (s) {case "+":newStack.push(b2.add(b1));break;case "-":newStack.push(b2.subtract(b1));break;case "*":newStack.push(b2.multiply(b1));break;case "/":newStack.push(b2.divide(b1, 9, BigDecimal.ROUND_HALF_UP));break;}}// 如果是数字,入栈else {newStack.push(new BigDecimal(s));}}// 最后,栈中仅有一个元素,就是计算结果return newStack.peek();}}
package game;import java.io.FileWriter;
import java.io.IOException;
import java.util.*;public class play {public static void main(String[] args) throws IOException {//创建玩家pperson p=new person(3,2);System.out.println("你的生命值: "+p.getLife()+"你的分数为: "+p.getScore());//player player1=new player();play.mmake(p);FileWriter fileWriter = new FileWriter("wrrite,txt");String life=p.getLife()+"";String score=p.getScore()+"";String str="生命值:"+life+"分数为:"+score;fileWriter.write(str);fileWriter.close();System.out.println("1游戏结束!");}//进行游戏public static void mmake(person p) {player player1=new player();int resust=player1.play();if(resust==1){int score=p.getScore()+1;p.setScore(score);System.out.println("回答正确,您的分数为"+score);return;}if(resust==2){int life=p.getLife();life--;p.setLife(life);if(life>0){System.out.println("回答错误!你的生命值为"+life);mmake(p);}else{return;}}if(resust==3){int life=p.getLife();life--;p.setLife(life);if(life>0){System.out.println("时间到了,开始下一轮,你的生命值:"+life);mmake(p);}else{return;}}}

测试

心得体会

刚才开始使用定时器来记时,但无法在主线程中找到定时器提供的信息,最后使用System.currenttimemillist( )函数解决了问题。## 标题

java 24点经典纸牌益智游戏相关推荐

  1. Java 面试题经典 77 问

    转载自 Java 面试题经典 77 问(含答案)! 金三银四了,3月底,4月初,找工作换单位的黄金时期.4月初将会有有一大批职场人士流动... 作为Java开发码农的你是不是也在蠢蠢欲动,或者已经搞了 ...

  2. 2018年程序员涨薪必备——24本经典纸质书

    程序员必读24款经典 001 豆瓣评分:8.7 推荐: 本书论述了数学在现代计算机行业的多种应用,涉及语言分析.翻译.输入法,还有网页的搜索.排名.分类,以及导航.密码学和大数据等多个方面. 002 ...

  3. java web入门经典 pdf_Java Web入门经典 (王国辉陈英) PDF

    资源名称:Java Web入门经典 (王国辉,陈英) PDF 第一篇 起步篇 第1章 开启jave web之门 2 第2章 不可不知的客户端应用技术 12 第3章 驾驭Java web开发环境 53 ...

  4. Java继承多态经典案例分享

    今天动力节点java培训机构小编为大家分享Java继承多态经典案例,希望通过此文能够帮助到大家,下面就随小编一起看看Java继承多态经典案例. public class A { public Stri ...

  5. 编程导师Ivor Horton新作《Java 7入门经典》即将出版

    网友戏称:从Java 2 到Java 7,大师Ivor Horton 的照片一直没变啊,还是那么的年轻,确实大师的风采依旧是未变,在我心中,大师也永远年轻! OK,长话短多,也许你没听说过编程导师Iv ...

  6. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2 ...

  7. 详解24个经典股票技术指标.doc

    详解24个经典股票技术指标 目  录 一.平滑异同平均线指标--MACD........................................................ 3 第一节 M ...

  8. java基础:Java七大外企经典面试精讲视频

    java基础:Java七大外企经典面试精讲视频 对于很多应聘java程序员的求职者来说,全面掌握java面试技巧,确实是自己找到一个好工作的敲门砖.今天小编在这里给大家分享一个关于java基础的Jav ...

  9. 视频教程:Java七大外企经典面试套路之基础篇

    视频教程:Java七大外企经典面试套路之基础篇 Java是Sun公司推出的一种编程语言.它是一种通过解释方式来执行的语言,语法规则和C++类似.同时,Java也是一种跨平台的程序设计语言. 本教程主要 ...

最新文章

  1. k8s概念入门之kube-proxy-针对早期(0.4)版本阅读
  2. Android 多线程下载 显示进度 速度
  3. HBase在淘宝的应用和优化
  4. 未能使用“Csc”任务的输入参数初始化该任务
  5. springboot的核心
  6. 从工程文化和运维理念理解Netflix
  7. python第一单元测试,知到Python语言应用第一单元章节测试答案
  8. 别在最吃苦的年龄选择了潇洒
  9. L1-014 简单题 (5 分)—团体程序设计天梯赛
  10. [转]unresolved external symbol _main解决办法
  11. 编译安装M2Crypto-0.20.2
  12. Kali Linux 安装 COMFAST CF-WU925A Realtek RTL8811CU/RTL8821CU USB 无线网卡驱动
  13. Mybatis引用静态常量或者枚举类型
  14. 艾诚专访崔晓波:为何用数据才能洞察这个世界?
  15. 机器人自动化《RPA国内外平台深度对比》
  16. php 获取字符串首歌,PHP爬虫 网易云音乐歌手和热门歌曲信息抓取
  17. 遥感基础知识——电磁波
  18. 索尼录音笔power和hold_「sony录音笔」想咨询一下各位索尼录音笔怎么关机 - 鲲鹏装修网...
  19. 小数点用计算机怎么用,计算机如何精确到小数点后一百位
  20. 为什么中层没有执行力?

热门文章

  1. 所有人 把膝盖准备好,这份“保姆级”的RabbitMQ笔记,你不服不行
  2. 一文读懂:低代码和无代码的演进历程、应用范围
  3. 【xmind使用】黄金猪头样例
  4. 蓝牙打印机打印多数量的小票分页打印方法
  5. Kinect2.0UnitySDK在unity中使用-手势识别
  6. 安徽省计算机java二级,[2018年计算机二级考试《JAVA》章节练习题]安徽省计算机二级考试报名时间...
  7. DDR SDRAM 学习笔记 —— SPPR
  8. 前端开发入门:常用的6种CSS库介绍
  9. Process On 免费在线作图工具
  10. Android ViewPager简单实现 - 倒计时、引导页左右滑动