2011-05-24 38 views
1

我做這個練習,練習這樣說:我在做什麼在黑傑克文件計數器在Java?

*給出一個包含有3名玩家(這裏:blackjack.txt)之間的1000分隨機酒杯的手輸入文件,計算出黑傑克的遭遇在所有遊戲的任何球員的數量。

二十一點被定義爲任何適合的任何適合的王牌和10面值卡(傑克,大號,特大號或10)。

輸入文件看起來像這樣:(作爲一個例子)

4H AD 5C JH 9C 10H

這意味着,播放一個具有心的4和俱樂部的5;玩家2擁有鑽石王牌(Ace of Diamonds)和心臟傑克(Jack of Hearts)(算上二十一點)。球員3有9個俱樂部和10個心臟。

對於這個問題的目的,已知有一種撲克牌被改組爲每一個新遊戲。*

我覺得我是在正確的做法,和我的代碼是正確的,但我的答案失敗,得到一個答案分辯

任何暗示,暗示這是我的代碼

import java.io.*; 

public class Problema16 { 

    public static void main(String args[]) { 
     File archivo = null; 
     FileReader fr = null; 
     BufferedReader br = null; 
     int counter = 0; 
     //int rest = 0; 

     try { 
      archivo = new File("C:\\Users\\\blackjack.txt"); 
      fr = new FileReader(archivo); 
      br = new BufferedReader(fr); 
      String linea; 
      String[] linea2 = null; 

      while ((linea = br.readLine()) != null) //System.out.println(linea); 
      { 
       linea2 = linea.split(" "); 

       String a = (linea2[0]); 
       String b = (linea2[1]); 
       String c = (linea2[2]); 
       String d = (linea2[3]); 
       String e = (linea2[4]); 
       String f = (linea2[5]); 

       if ((a.startsWith("A") && (b.startsWith("J") || (b.startsWith("Q") || (b.startsWith("K") || (b.startsWith("10")))))) || ((a.startsWith("J") || (a.startsWith("Q") || (a.startsWith("K") || (a.startsWith("10"))))) && (b.startsWith("A")))) { 
        counter++; 
        //System.out.println(a + "" + b + ""); 
       } else if ((c.startsWith("A") && (d.startsWith("J") || (d.startsWith("Q") || (d.startsWith("K") || (d.startsWith("10")))))) || ((c.startsWith("J") || (c.startsWith("Q") || (c.startsWith("K") || (c.startsWith("10"))))) && (d.startsWith("A")))) { 
        counter++; 
        //System.out.println(c + "" + d + ""); 
       } else if ((e.startsWith("A") && (f.startsWith("J") || (f.startsWith("Q") || (f.startsWith("K") || (f.startsWith("10")))))) || ((e.startsWith("J") || (e.startsWith("Q") || (e.startsWith("K") || (e.startsWith("10"))))) && (f.startsWith("A")))) { 
        counter++; 
        //System.out.println(e + "" + f + ""); 
       } else { 
        //sobra++; 
       } 

      } 

      System.out.println(counter); 
      //System.out.println(sobra); 

     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
    } 
} 

這是鍛鍊; Tibial在線1。我的答案是119,但是錯了。

+0

請定義你的意思是「我的回答失敗」。什麼不工作? – 2011-05-24 23:52:10

+0

我沒有得到錯誤的代碼,只是我得到的答案失敗 – bentham 2011-05-24 23:53:16

+0

失敗如何?你得到什麼結果?你期待什麼結果? – 2011-05-24 23:54:35

回答

4

你在每個if條件很難與所有的大括號來讀取,但似乎確定。 你的問題在於else if。玩家#1和玩家#2(和玩家#3)在同一時間可以有二十一點,因爲你的代碼只能計算其中的一個。

else,你應該確定。

您還可以稍微提高代碼的可讀性。一些指針:

  • 檢查第二名/第三名選手的手與第一名相同。使用循環。
  • 而不是明確地檢查特定的卡也許你可以計算手的價值並檢查它是否等於21.這會是不錯的把那個邏輯在一個單獨的方法。
  • 一種簡單的方法來計算手的值(假設輸入總是合法)被丟棄套裝(因爲它是不相關的),並使用預定義的映射,以確定卡值(例如,「J」 => 10,「A」 - 11等)
+0

非常感謝,我現在的答案是123,我刪除了其他它是好的 – bentham 2011-05-25 00:00:57

0

我不喜歡你的做法。它太複雜了。我會創建一個Card類(帶有一個構造函數,它帶有一個字符串,在文件中找到),它具有一個值字段。這樣,你可以只得到各2張牌,並檢查值等於21

+0

是的它是更多的面向對象,我正在嘗試這個練習來加強我在Java技能,但我知道它是我想到的第一個 – bentham 2011-05-25 00:14:13

1

短的sed命令來驗證:

sed 's/[CDHS]//g;s/[CDHS]\r$//g;s/[JKQ]/+/g;s/10/+/g;s/A/-/g;s/\(. .\)/[\1]/g;s/+ -/ * /g;s/- +/ * /g' blackjack.txt | grep " \* " | wc -l 
119 lines 

刪除的顏色,結合JKQ10到+,A至 - (有點超級),+ - 和 - +到*(BJ)。

Multimatches:

sed 's/[CDHS]//g;s/[CDHS]\r$//g;s/[JKQ]/+/g;s/10/+/g;s/A/-/g;s/\(. .\)/[\1]/g;s/+ -/ * /g;s/- +/ * /g' blackjack.txt | grep " \*.*\* " 
[6 5] [ * ] [ * ] 
[3 +] [ * ] [ * ] 
[ * ] [ * ] [4 4] 
[5 8] [ * ] [ * ] 

4X 2hits。 119 + 4 = 123

模式匹配當然可以用來以類似的方式生成java解決方案。

+0

你能解釋這一點,我不明白你在做什麼? – bentham 2011-05-31 03:29:54

+0

你知道sed嗎?它是一個流編輯器,主要用於執行模式匹配和用非常短的命令進行替換。我修改所有輸入字符串,如「4H 5C AD JH 9C 10H」。我們不關心顏色(HCDHCH),所以我們可以刪除它們。我們不需要在10,J,Q,K之間進行區分。所以我將JQK10轉換爲+,將+ A和A +轉換爲*來標記所有的Blackjack。用grep我過濾行,現在包含一個或多個*並對它們進行計數。然後我列出那些包含多個*的行。我使用sed/grep/wc來進行快速原型設計。 – 2011-05-31 04:01:53

+0

Java中的等效解決方案涉及多個'line.replaceAll(模式,替換)'語句。 – 2011-05-31 04:02:33