闘地主アルゴリズムの設計と実現(一)--プロジェクト紹介&どのように1枚のカードを定義して構築するか


大学の間、私は他の人の基礎の上で、簡単な地主の手続きを書いた.
主に対象向けの設計,トランプの洗浄,トランプの発行,トランプ型の判断,トランプの大きさの比較,ゲームルールなどのアルゴリズムを実現した.
この闘地主小プロジェクトの練習を通じて、私のオブジェクト向けの設計能力を高め、アルゴリズムに対する理解を深めた.
最近、これらのデザインとアルゴリズムを共有し、後日、闘地主プログラムのソースコードをアップロードします.
プロジェクトのスクリーンショット
カードの定義
a.1枚のカードのタイプ
//        
 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.カード1枚の属性
//     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.カードを1枚作る
//       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によって1枚のカードの大きいタイプを獲得します:四角い、梅の花、赤い桃、黒桃、王さん、王さん
/**
  *     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により、1枚のカードのレベルを得る
/**
  *     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日の土曜日、依然として出勤して、やはり史上最も複雑な国慶節の休みですね.
関連読書
闘地主アルゴリズムの設計と実現
オブジェクト向けに闘地主プログラムを実現するコアアルゴリズムは,トランプの洗浄,トランプの発行,トランプ型の判断,トランプの大きさの比較,ゲームルールなどを含む.
 
原文参照:http://FansUnion.cn/articles/2712