2014年10月29日 星期三

Java - 判斷大老二牌型組合

(java, 大老二, 程式碼)

最近重新學 Java ,寫了一個大老二的程式。目前寫到判斷牌型組合。可以抓出 Pair, Two Pairs, Triple, Quad, Full House, Straight, Straight Flush 

檔案
Card.java:每張牌會實體化一個 Card。
Deck.java:處理整副牌
Player.java:每個玩家會實體化一個 Player,包含玩家基本資訊、出牌動作、判斷牌型
MainActivity.java:程式主檔

簡介 
1.52張牌每張都給一個編號,從0到51。會使用一個二維陣列 public static int[][] numOf52CardsByXY來儲存。
每個玩家手上的13張牌,也使用類似的二維陣列儲存牌的資訊。不過程式在玩家手上的牌,實際上是使用 List。
public List<Integer> playerCards = new ArrayList<Integer>();

在 Eclipse 裡面執行的結果如下:
玩家3 Joe 有梅花3
起始玩家3 Joe
二維陣列: 數字大小 [黑桃, 紅心, 方魂, 梅方, 張數] 每張牌給予編號,從 0 到 51
 1 [0, 0, 0, 0, 0]  0,  1,  2,  3
 2 [0, 0, 0, 1, 1]  4,  5,  6,  7 梅花2
 3 [0, 0, 0, 0, 0]  8,  9, 10, 11
 4 [0, 0, 0, 1, 1] 12, 13, 14, 15 梅花4
 5 [0, 0, 1, 0, 1] 16, 17, 18, 19 方塊5
 6 [1, 0, 0, 1, 2] 20, 21, 22, 23 黑桃6, 梅花6
 7 [0, 0, 0, 0, 0] 24, 25, 26, 27
 8 [0, 0, 0, 0, 0] 28, 29, 30, 31
 9 [0, 0, 1, 0, 1] 32, 33, 34, 35 方塊9
10 [1, 0, 1, 0, 2] 36, 37, 38, 39 黑桃10, 方塊10
11 [0, 1, 0, 0, 1] 40, 41, 42, 43 紅心11
12 [0, 1, 1, 1, 3] 44, 45, 46, 47 紅心12, 方塊12, 梅花12
13 [1, 0, 0, 0, 1] 48, 49, 50, 51 黑桃13
從以上陣列可以得知:
Single: [7, 15, 18, 20, 23, 34, 36, 38, 41, 45, 46, 47, 48] 手中的13張牌
Pair: [20, 23]
Pair: [36, 38]
Pair: [45, 46]
Pair: [45, 47]
Pair: [46, 47]
Triple: [45, 46, 47]
Fullhouse: [20, 23, 45, 46, 47]
Fullhouse: [36, 38, 45, 46, 47]
Straight: [34, 36, 41, 45, 48]
Straight: [34, 36, 41, 46, 48]
Straight: [34, 36, 41, 47, 48]
Straight: [34, 38, 41, 45, 48]
Straight: [34, 38, 41, 46, 48]
Straight: [34, 38, 41, 47, 48]

前面是一個展開後的二維陣列。陣列索引都是從 0 開始。右邊的 1 到 13 分別對應到牌面數字 A, 2, 3... J, Q, K。第二維陣列,分別代表 [黑桃, 紅心, 方魂, 梅方, 張數]。前 4 個是花色,所以0代表沒有,1代表有。張數是指相同大小有幾張。例如 [1, 0, 0, 1, 2] 6 表示有 黑桃6, 梅花6, 2是說,6這個數字有兩張(兩個花色)

牌組裡面的數字,則是每張卡片的代號,從 0 到 51 。這個程式目前只寫到判斷牌組。後續要應用的話,可以再透過自訂的函數 toString() 顯示卡片的完整名稱。





程式碼

Card.java


Deck.java


Player.java


MainActivity.java


沒有留言:

張貼留言