2010年6月4日金曜日

麻雀あがり判定

このエントリーをはてなブックマークに追加
麻雀のあがり判定について

すっごく簡易化したもので考えてみたけど,
頭を取る→刻子を取る→順子を取る→残りをチェックということでいいのかな?
刻子と順子が逆になったほうがいい場合は,あるのか???

import java.util.ArrayList;
import java.util.List;

public class Test {
   public static void main(String[] args) {
      // 簡略化のために牌は1-9のみ
      // 配列haiのindex番号と牌の枚数が対応している
      // 例) hai[1]<=>1の枚数
      int[] hai = {0,0,2,2,2,2,2,2,2,0};   // 大車輪
//      int[] hai = {0,3,1,1,1,1,1,1,1,4};   // 九連宝燈
//      int[] hai = {0,3,3,3,3,0,0,0,0,2};   // 四暗刻
      int[] c_hai;
      List<Integer> mentu;

      // 頭をまず取る
      for(int i = 1; i < hai.length; i++){
         if(hai[i] >= 2){
            c_hai = hai.clone();
            c_hai[i] -= 2;
            mentu = new ArrayList<Integer>();
            judge(c_hai, mentu, i);
         }
      }
   }
   // 再帰
   static void judge(int[] hai, List<Integer> mentu, int atama){
      if(mentu.size() == 12){
         print(mentu, atama);
      }
      // 刻子を取る
      for(int i = 1; i < hai.length; i++){
         if(hai[i] >= 3){
            mentu.add(i); mentu.add(i); mentu.add(i);
            hai[i] -= 3;
            judge(hai, mentu, atama);
         }
      }
      // 順子を取る
      for(int i = 1; i < (hai.length-2); i++){
         if(hai[i] > 0 && hai[i+1] > 0 && hai[i+2] > 0){
            mentu.add(i); mentu.add(i+1); mentu.add(i+2);
            hai[i]--; hai[i+1]--; hai[i+2]--;
            judge(hai, mentu, atama);
         }
      }
   }
   // 表示
   static void print(List<Integer> mentu, int atama){
      for(int i = 0; i < mentu.size(); i++){
         System.out.print(mentu.get(i) + " ");
         if(i % 3 == 2)
            System.out.print("| ");
      }
      System.out.println(atama + " " + atama);
   }
}


上記の実行結果は下記のようになる
------------------------------------------------------
3 4 5 | 3 4 5 | 6 7 8 | 6 7 8 | 2 2
2 3 4 | 2 3 4 | 6 7 8 | 6 7 8 | 5 5
2 3 4 | 2 3 4 | 5 6 7 | 5 6 7 | 8 8
------------------------------------------------------