最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Java編寫24點(diǎn)小游戲的實(shí)例代碼

 更新時(shí)間:2021年01月11日 09:47:38   作者:killer_JAYCHEN  
這篇文章主要給大家介紹了關(guān)于如何利用Java編寫24點(diǎn)小游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

話不多說(shuō)直接給大家上代碼

package com.company;

import java.util.*;

/**
 * 24點(diǎn)小游戲
 * 游戲規(guī)則:系統(tǒng)自動(dòng)生成4個(gè)1-10的隨機(jī)整數(shù),玩家通過(guò)加減乘除操作,得到結(jié)果為24,每個(gè)數(shù)字只能使用一次
 */
public class Game24Player {

 final String[] patterns = {"nnonnoo", "nnonono", "nnnoono", "nnnonoo",
   "nnnnooo"};
 final String ops = "+-*/^";//存儲(chǔ)運(yùn)算符

 String solution;//解題答案
 List<Integer> digits;

 public static void main(String[] args) {
  new Game24Player().play();
 }

 void play() {
  digits = getSolvableDigits();

  Scanner in = new Scanner(System.in);
  while (true) {
   System.out.println("24點(diǎn)小游戲:");
   System.out.print("使用以下數(shù)字得出24點(diǎn): ");
   System.out.println(digits);
   System.out.println("tips:輸入q退出游戲,輸入s打印解法以及出下一道題");
   System.out.print("> ");

   String line = in.nextLine();//獲取控制臺(tái)下一行輸入的內(nèi)容
   if (line.equalsIgnoreCase("q")) {
    System.out.println("\nThanks for playing");
    return;
   }

   if (line.equalsIgnoreCase("s")) {
    System.out.println(solution);
    digits = getSolvableDigits();
    continue;
   }

   char[] entry = line.replaceAll("[^*+-/)(\\d]", "").toCharArray();

   try {
    validate(entry);

    if (evaluate(infixToPostfix(entry))) {
     System.out.println("\n恭喜你,回答正確,請(qǐng)繼續(xù)下一輪 ");
     digits = getSolvableDigits();
    } else {
     System.out.println("\n答題錯(cuò)誤,請(qǐng)重新答題");
    }

   } catch (Exception e) {
    System.out.printf("%n%s 請(qǐng)重新輸入.%n", e.getMessage());
   }
  }
 }

 //判斷玩家在控制臺(tái)輸入的內(nèi)容是否正確
 void validate(char[] input) throws Exception {
  int total1 = 0, parens = 0, opsCount = 0;

  for (char c : input) {
   if (Character.isDigit(c))
    total1 += 1 << (c - '0') * 4;
   else if (c == '(')
    parens++;
   else if (c == ')')
    parens--;
   else if (ops.indexOf(c) != -1)
    opsCount++;
   if (parens < 0)
    throw new Exception("括號(hào)不匹配.");
  }

  if (parens != 0)
   throw new Exception("括號(hào)不匹配.");

  if (opsCount != 3)
   throw new Exception("錯(cuò)誤輸入.");

  int total2 = 0;
  for (int d : digits)
   total2 += 1 << d * 4;

  if (total1 != total2)
   throw new Exception("輸入有誤.");
 }

 boolean evaluate(char[] line) throws Exception {
  Stack<Float> s = new Stack<>();
  try {
   for (char c : line) {
    if ('0' <= c && c <= '9')
     s.push((float) c - '0');
    else
     s.push(applyOperator(s.pop(), s.pop(), c));
   }
  } catch (EmptyStackException e) {
   throw new Exception("輸入無(wú)效,請(qǐng)重新輸入.");
  }
  return (Math.abs(24 - s.peek()) < 0.001F);
 }

 float applyOperator(float a, float b, char c) {
  switch (c) {
   case '+':
    return a + b;
   case '-':
    return b - a;
   case '*':
    return a * b;
   case '/':
    return b / a;
   default:
    return Float.NaN;
  }
 }

 //獲取一組隨機(jī)數(shù)
 List<Integer> randomDigits() {
  Random r = new Random();
  List<Integer> result = new ArrayList<>(4);
  for (int i = 0; i < 4; i++)
   result.add(r.nextInt(9) + 1);//添加4個(gè)1-10的隨機(jī)數(shù)
  return result;
 }

 List<Integer> getSolvableDigits() {
  List<Integer> result;
  do {
   result = randomDigits();
  } while (!isSolvable(result));
  return result;
 }

 boolean isSolvable(List<Integer> digits) {
  Set<List<Integer>> dPerms = new HashSet<>(4 * 3 * 2);
  permute(digits, dPerms, 0);

  int total = 4 * 4 * 4;
  List<List<Integer>> oPerms = new ArrayList<>(total);
  permuteOperators(oPerms, 4, total);

  StringBuilder sb = new StringBuilder(4 + 3);

  for (String pattern : patterns) {
   char[] patternChars = pattern.toCharArray();

   for (List<Integer> dig : dPerms) {
    for (List<Integer> opr : oPerms) {

     int i = 0, j = 0;
     for (char c : patternChars) {
      if (c == 'n')
       sb.append(dig.get(i++));
      else
       sb.append(ops.charAt(opr.get(j++)));
     }

     String candidate = sb.toString();
     try {
      if (evaluate(candidate.toCharArray())) {
       solution = postfixToInfix(candidate);
       return true;
      }
     } catch (Exception ignored) {
     }
     sb.setLength(0);
    }
   }
  }
  return false;
 }

 String postfixToInfix(String postfix) {
  class Expression {
   String op, ex;
   int prec = 3;

   Expression(String e) {
    ex = e;
   }

   Expression(String e1, String e2, String o) {
    ex = String.format("%s %s %s", e1, o, e2);
    op = o;
    prec = ops.indexOf(o) / 2;
   }
  }

  Stack<Expression> expr = new Stack<>();

  for (char c : postfix.toCharArray()) {
   int idx = ops.indexOf(c);
   if (idx != -1) {

    Expression r = expr.pop();
    Expression l = expr.pop();

    int opPrec = idx / 2;

    if (l.prec < opPrec)
     l.ex = '(' + l.ex + ')';

    if (r.prec <= opPrec)
     r.ex = '(' + r.ex + ')';

    expr.push(new Expression(l.ex, r.ex, "" + c));
   } else {
    expr.push(new Expression("" + c));
   }
  }
  return expr.peek().ex;
 }

 char[] infixToPostfix(char[] infix) throws Exception {
  StringBuilder sb = new StringBuilder();
  Stack<Integer> s = new Stack<>();
  try {
   for (char c : infix) {
    int idx = ops.indexOf(c);
    if (idx != -1) {
     if (s.isEmpty())
      s.push(idx);
     else {
      while (!s.isEmpty()) {
       int prec2 = s.peek() / 2;
       int prec1 = idx / 2;
       if (prec2 >= prec1)
        sb.append(ops.charAt(s.pop()));
       else
        break;
      }
      s.push(idx);
     }
    } else if (c == '(') {
     s.push(-2);
    } else if (c == ')') {
     while (s.peek() != -2)
      sb.append(ops.charAt(s.pop()));
     s.pop();
    } else {
     sb.append(c);
    }
   }
   while (!s.isEmpty())
    sb.append(ops.charAt(s.pop()));

  } catch (EmptyStackException e) {
   throw new Exception("Invalid entry.");
  }
  return sb.toString().toCharArray();
 }

 void permute(List<Integer> lst, Set<List<Integer>> res, int k) {
  for (int i = k; i < lst.size(); i++) {
   Collections.swap(lst, i, k);
   permute(lst, res, k + 1);
   Collections.swap(lst, k, i);
  }
  if (k == lst.size())
   res.add(new ArrayList<>(lst));
 }

 void permuteOperators(List<List<Integer>> res, int n, int total) {
  for (int i = 0, npow = n * n; i < total; i++)
   res.add(Arrays.asList((i / npow), (i % npow) / n, i % n));
 }
}

運(yùn)行結(jié)果截圖

游戲題目

在控制臺(tái)輸入答案

輸入s是查看結(jié)果并開始下一次游戲。

輸入q是退出游戲。

總結(jié)

到此這篇關(guān)于利用Java編寫24點(diǎn)小游戲的文章就介紹到這了,更多相關(guān)Java編寫24點(diǎn)小游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 智能手表開發(fā)API接口

    智能手表開發(fā)API接口

    這篇文章主要介紹了智能手表開發(fā)API接口,使用圖靈機(jī)器人平臺(tái)接口實(shí)現(xiàn)天氣預(yù)報(bào),非常簡(jiǎn)單實(shí)用,這里推薦給大家。
    2015-03-03
  • Hibernate雙向一對(duì)一映射關(guān)系配置代碼實(shí)例

    Hibernate雙向一對(duì)一映射關(guān)系配置代碼實(shí)例

    這篇文章主要介紹了Hibernate雙向一對(duì)一映射關(guān)系配置代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot中獲取配置文件的注解詳解

    SpringBoot中獲取配置文件的注解詳解

    這篇文章主要介紹了SpringBoot中獲取配置文件的注解詳解, 一般情況下:如果我們只是在某個(gè)業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項(xiàng)值,使用@Value,如果我們使用JavaBean來(lái)與配置文件進(jìn)行映射,我們直接使用@ConfigurationProperties,需要的朋友可以參考下
    2023-10-10
  • java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程

    java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程

    最近在java連接SQL數(shù)據(jù)庫(kù)時(shí)會(huì)出現(xiàn)一些問(wèn)題,所以這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • java虛擬機(jī)中多線程總結(jié)

    java虛擬機(jī)中多線程總結(jié)

    在本篇內(nèi)容中小編給大家分享的是關(guān)于java虛擬機(jī)中多線程的知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們參考學(xué)習(xí)下。
    2019-06-06
  • java中如何對(duì)arrayList按數(shù)字大小逆序排序

    java中如何對(duì)arrayList按數(shù)字大小逆序排序

    這篇文章主要介紹了java中如何對(duì)arrayList按數(shù)字大小逆序排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java實(shí)現(xiàn)斗地主的發(fā)牌功能

    Java實(shí)現(xiàn)斗地主的發(fā)牌功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)斗地主的發(fā)牌功能,含按順序發(fā)牌和玩家牌排序顯示等功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • mybatis攔截器無(wú)法注入spring bean的問(wèn)題解決

    mybatis攔截器無(wú)法注入spring bean的問(wèn)題解決

    本文主要介紹了mybatis攔截器無(wú)法注入spring bean的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • springboot連接redis并動(dòng)態(tài)切換database的實(shí)現(xiàn)方法

    springboot連接redis并動(dòng)態(tài)切換database的實(shí)現(xiàn)方法

    這篇文章主要介紹了springboot連接redis并動(dòng)態(tài)切換database,本文主為通過(guò)修改ConnectionFactory從而達(dá)到動(dòng)態(tài)切換database的效果,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Java用文件流下載網(wǎng)絡(luò)文件示例代碼

    Java用文件流下載網(wǎng)絡(luò)文件示例代碼

    這篇文章主要介紹了Java用文件流的方式下載網(wǎng)絡(luò)文件,大家參考使用吧
    2013-11-11

最新評(píng)論

文昌市| 郑州市| 肇州县| 哈密市| 宜丰县| 余庆县| 扎囊县| 花莲县| 古蔺县| 营山县| 信丰县| 横峰县| 铅山县| 青河县| 东乌珠穆沁旗| 临澧县| 萍乡市| 汪清县| 元氏县| 华亭县| 洛隆县| 天门市| 类乌齐县| 盐山县| 郯城县| 临西县| 内黄县| 贺兰县| 上虞市| 台江县| 阳城县| 鄂托克旗| 禹城市| 淮滨县| 阳山县| 甘谷县| 泰顺县| 随州市| 会同县| 丰台区| 马尔康县|