鬥地主演算法的設計與實現 一 專案介紹 如何定義和構造一張牌
阿新 • • 發佈:2018-12-19
大學期間,我在別人的基礎上,寫了一個簡易的鬥地主程式。
主要實現了面向物件設計,洗牌、發牌、判斷牌型、比較牌的大小、遊戲規則等演算法。
通過這個鬥地主小專案的練習,提高了我的面向物件設計能力,加深了對演算法的理解。
最近把這些設計和演算法分享給大家,過些天會上傳鬥地主程式的原始碼。
專案截圖
定義一張牌Card
a.一張牌的型別
// 一張牌的大型別 public enum CardBigType { HEI_TAO, HONG_TAO, MEI_HUA, FANG_KUAI, XIAO_WANG, DA_WANG }
// 一張牌的小型別 public enum CardSmallType { A, ER, SAN, SI, WU, LIU, QI, BA, JIU, SHI, J, Q, K, XIAO_WANG, DA_WANG }
b.一張牌Card的屬性
// 牌的數字ID,1到54 public int id; // 牌的大型別,方塊,梅花,紅桃,黑桃,小王,大王 public final CardBigType bigType; // 牌的小型別,2_10,A,J,Q,K public final CardSmallType smallType; // 牌的等級,對牌進行排序時會用到 public int grade; // 牌的影象名字,圖形介面顯示牌用到 public String imageName;
c.構造一張牌
// 通過牌的整型id構造一張牌 public Card(int id) { this.id = id; bigType = CardUtil.getBigType(id); smallType = CardUtil.getSmallType(id); grade = CardUtil.getGrade(id); imageName = CardUtil.getImageName(id); Icon icon = DdzUtil.getImageIcon(imageName); setIcon(icon); }
d.根據牌的id獲得一張牌的大型別:方塊,梅花,紅桃,黑桃,小王,大王
/** * 根據牌的id獲得一張牌的大型別:方塊,梅花,紅桃,黑桃,小王,大王 * * @param id * 牌的id * * @return 牌的大型別:方塊,梅花,紅桃,黑桃,小王,大王 */ public static CardBigType getBigType(int id) { CardBigType bigType = null; if (id >= 1 && id <= 13) { bigType = CardBigType.FANG_KUAI; } else if (id >= 14 && id <= 26) { bigType = CardBigType.MEI_HUA; } else if (id >= 27 && id <= 39) { bigType = CardBigType.HONG_TAO; } else if (id >= 40 && id <= 52) { bigType = CardBigType.HEI_TAO; } else if (id == 53) { bigType = CardBigType.XIAO_WANG; } else if (id == 54) { bigType = CardBigType.DA_WANG; } return bigType; }
e.根據牌的id,獲取牌的小型別:2_10,A,J,Q,K
/** * 根據牌的id,獲取牌的小型別:2_10,A,J,Q,K * * @param id * 牌的id * * @return 牌的小型別:2_10,A,J,Q,K */ public static CardSmallType getSmallType(int id) { if (id < 1 || id > 54) { throw new RuntimeException("牌的數字不合法"); } CardSmallType smallType = null; if (id >= 1 && id <= 52) { smallType = numToType(id % 13); } else if (id == 53) { smallType = CardSmallType.XIAO_WANG; } else if (id == 54) { smallType = CardSmallType.DA_WANG; } else { smallType = null; } return smallType; }/** * 將阿拉伯數字0到12轉換成對應的小牌型,被getSmallType方法呼叫 * * @param num * 數字(0到12) * @return 牌的小型別 */ private static CardSmallType numToType(int num) { CardSmallType type = null; switch (num) { case 0: type = CardSmallType.K; break; case 1: type = CardSmallType.A; break; case 2: type = CardSmallType.ER; break; case 3: type = CardSmallType.SAN; break; case 4: type = CardSmallType.SI; break; case 5: type = CardSmallType.WU; break; case 6: type = CardSmallType.LIU; break; case 7: type = CardSmallType.QI; break; case 8: type = CardSmallType.BA; break; case 9: type = CardSmallType.JIU; break; case 10: type = CardSmallType.SHI; break; case 11: type = CardSmallType.J; break; case 12: type = CardSmallType.Q; break; } return type; }
f.根據牌的id,獲得一張牌的等級
/** * 根據牌的id,獲得一張牌的等級 * * @param id * 牌的id * @return 與牌數字對應的等級 */ public static int getGrade(int id) { if (id < 1 || id > 54) { throw new RuntimeException("牌的數字不合法"); } int grade = 0; // 2個王必須放在前邊判斷 if (id == 53) { grade = 16; } else if (id == 54) { grade = 17; } else { int modResult = id % 13; if (modResult == 1) { grade = 14; } else if (modResult == 2) { grade = 15; } else if (modResult == 3) { grade = 3; } else if (modResult == 4) { grade = 4; } else if (modResult == 5) { grade = 5; } else if (modResult == 6) { grade = 6; } else if (modResult == 7) { grade = 7; } else if (modResult == 8) { grade = 8; } else if (modResult == 9) { grade = 9; } else if (modResult == 10) { grade = 10; } else if (modResult == 11) { grade = 11; } else if (modResult == 12) { grade = 12; } else if (modResult == 0) { grade = 13; } } return grade; }
g.根據牌的id獲得牌圖片的名字
/** * 根據牌的id獲得牌圖片的名字 * * @param id * 牌的id * @return 圖片的名字 */ public static String getImageName(int id) { // 得到圖片的前一個字元,表示是第幾個牌 String imageName = ""; if (id == 53) { imageName += "smallJoker"; } else if (id == 54) { imageName += "bigJoker"; } else { int mod = id % 13; String firstLetter = ""; switch (mod) { case 0: firstLetter = "K"; break; case 1: firstLetter = "A"; break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: firstLetter = "" + mod; break; case 11: firstLetter = "J"; break; case 12: firstLetter = "Q"; break; default: break; } String secondLetter = ""; // 得到圖片的後一個字元,表示什麼顏色的牌 if (id >= 1 && id <= 13) { secondLetter = "0"; } else if (id >= 14 && id <= 26) { secondLetter = "1"; } else if (id >= 27 && id <= 39) { secondLetter = "2"; } else if (id >= 40 && id <= 52) { secondLetter = "3"; } imageName = firstLetter + secondLetter; } String extension = ".gif"; return imageName + extension; }
下一篇將介紹 鬥地主出牌規則演算法的設計和實現
不出意外,本週末10月13號將上傳原始碼到CSDN下載資源。
剛剛看了下日曆,10月12號 星期六,仍然要上班,果然是史上最複雜的國慶放假啊。
相關閱讀
面向物件實現鬥地主程式的核心演算法,包括洗牌、發牌、判斷牌型、比較牌的大小、遊戲規則等。