예제 #1
0
        public int Shanten(List <Tile> hand)
        {
            ShantenNum = 8;

            List <opentile> tiles = new List <opentile>();

            for (int i = 0; i < ListNumber; i++)
            {
                opentile opentile = new opentile();
                tiles.Add(opentile);
            }


            for (int i = 0; i < hand.Count; i++)
            {
                tiles[hand[i].Number].total++;
                if (hand[i].Closed)
                {
                    tiles[hand[i].Number].closed++;
                }
            }

            int index = 0;

            foreach (opentile item in tiles)
            {
                int tempShantenNum = 8;
                if (item.total >= 2 && item.closed >= 2)
                {
                    List <opentile> temptiles = tiles.Select(x => x.Copy()).ToList();
                    temptiles[index].total -= 2;
                    //temptiles[index].closed -= 2;
                    ShantenNumber(temptiles, ref tempShantenNum, 1);
                }
                if (item.total == 1 && item.closed >= 1)
                {
                    List <opentile> temptiles = tiles.Select(x => x.Copy()).ToList();
                    temptiles[index].total -= 1;
                    tempShantenNum++;
                    //temptiles[index].closed -= 2;
                    ShantenNumber(temptiles, ref tempShantenNum, 1);
                }
                index++;

                if (ShantenNum > tempShantenNum)
                {
                    ShantenNum = tempShantenNum;
                }
            }

            SevenPairsShanten(tiles.Select(x => x.Copy()).ToList());
            ThirteenOrphansShanten(tiles.Select(x => x.Copy()).ToList());

            return(ShantenNum);
        }
예제 #2
0
        public List <List <Tile> > CallChi(List <Tile> hand, Tile discard)
        {
            List <List <Tile> > result = new List <List <Tile> >();

            if (discard.Number >= 30)
            {
                return(result);
            }

            List <opentile> tiles = new List <opentile>();

            for (int i = 0; i < ListNumber; i++)
            {
                opentile opentile = new opentile();
                tiles.Add(opentile);
            }

            for (int i = 0; i < hand.Count; i++)
            {
                tiles[hand[i].Number].total++;
                if (hand[i].Closed)
                {
                    tiles[hand[i].Number].closed++;
                }
            }

            if (tiles[discard.Number - 2].total > 0 && tiles[discard.Number - 2].closed > 0 &&
                tiles[discard.Number - 1].total > 0 && tiles[discard.Number - 1].closed > 0)
            {
                List <Tile> tempset  = new List <Tile>();
                Tile        temptile = new Tile();

                temptile.Number = discard.Number - 2;
                tempset.Add(temptile);

                temptile.Number = discard.Number - 1;
                tempset.Add(temptile);

                result.Add(tempset);
            }

            if (tiles[discard.Number - 1].total > 0 && tiles[discard.Number - 1].closed > 0 &&
                tiles[discard.Number + 1].total > 0 && tiles[discard.Number + 1].closed > 0)
            {
                List <Tile> tempset  = new List <Tile>();
                Tile        temptile = new Tile();

                temptile.Number = discard.Number - 1;
                tempset.Add(temptile);

                temptile.Number = discard.Number + 1;
                tempset.Add(temptile);

                result.Add(tempset);
            }

            if (tiles[discard.Number + 1].total > 0 && tiles[discard.Number + 1].closed > 0 &&
                tiles[discard.Number + 2].total > 0 && tiles[discard.Number + 2].closed > 0)
            {
                List <Tile> tempset  = new List <Tile>();
                Tile        temptile = new Tile();

                temptile.Number = discard.Number + 1;
                tempset.Add(temptile);

                temptile.Number = discard.Number + 2;
                tempset.Add(temptile);

                result.Add(tempset);
            }

            return(result);
        }