1. 程式人生 > >鬥地主演算法的設計與實現 一 專案介紹 如何定義和構造一張牌

鬥地主演算法的設計與實現 一 專案介紹 如何定義和構造一張牌

               

大學期間,我在別人的基礎上,寫了一個簡易的鬥地主程式。

主要實現了面向物件設計,洗牌、發牌、判斷牌型、比較牌的大小、遊戲規則等演算法。

通過這個鬥地主小專案的練習,提高了我的面向物件設計能力,加深了對演算法的理解。

最近把這些設計和演算法分享給大家,過些天會上傳鬥地主程式的原始碼。

專案截圖

鬥地主-專案截圖

定義一張牌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 = nullif (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 = nullif (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 = nullswitch (num) {  case 0:   type = CardSmallType.K;   breakcase 1:   type = CardSmallType.A;   breakcase 2:   type = CardSmallType.ER;   breakcase 3:   type = CardSmallType.SAN;   breakcase 4:   type = CardSmallType.SI;   breakcase 5:   type = CardSmallType.WU;   breakcase 6:   type = CardSmallType.LIU;   breakcase 7:   type = CardSmallType.QI;   breakcase 8:   type = CardSmallType.BA;   breakcase 9:   type = CardSmallType.JIU;   breakcase 10:   type = CardSmallType.SHI;   breakcase 11:   type = CardSmallType.J;   breakcase 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號 星期六,仍然要上班,果然是史上最複雜的國慶放假啊。

相關閱讀

面向物件實現鬥地主程式的核心演算法,包括洗牌、發牌、判斷牌型、比較牌的大小、遊戲規則等。