Ejemplo n.º 1
0
        public virtual void NormalSyanten(SortedTilesEnumerator tiles, ref int result)
        {
            if (tiles.Count % 3 == 0)
            {
                throw new ArgumentException("牌数量不能是3的倍数。", nameof(tiles));
            }

            var args = new SyantenArgs {
                Result   = result,
                MinValue = 1 - tiles.Count % 3
            };

            NormalSyantenCutPair(tiles.Tiles, tiles.Count, args);
            result = args.Result;
        }
Ejemplo n.º 2
0
 private static void NormalSyantenCutPair(int[] tiles, int count, SyantenArgs args)
 {
     if (args.Result == args.MinValue)
     {
         return;
     }
     for (int i = 0; i < 34; i++)
     {
         if (tiles[i] >= 2)
         {
             tiles[i] -= 2;
             NormalSyantenCut3(tiles, 0, count - 2, (count / 3) | 0x01000000, args);
             tiles[i] += 2;
         }
     }
     NormalSyantenCut3(tiles, 0, count, count / 3, args);
 }
Ejemplo n.º 3
0
        private static void NormalSyantenCut3(int[] tiles, int i, int remCount, int argsTuple, SyantenArgs args)
        {
            if (args.Result == args.MinValue)
            {
                return;
            }
            while (i < 34 && tiles[i] == 0)
            {
                i++;
            }
            if (i == 34)
            {
                NormalSyantenCut2(tiles, 0, remCount, argsTuple, args);
                return;
            }

            ref int curr = ref tiles[i];