Exemplo n.º 1
0
        public void ClosedHonorPonFuTest()
        {
            var config = new HandConfig();

            var tiles   = TileIds.Parse(man: "123456", sou: "1178", honors: "111");
            var winTile = TileId.Parse(sou: "6");
            var hand    = Hand(new TileIds(tiles.Append(winTile)).ToTiles34());

            var(fuDetails, fu) = CalculateFu(hand,
                                             winTile,
                                             GetWinGroup(hand, winTile),
                                             config);

            AreEqual(2, fuDetails.Count);
            IsTrue(fuDetails.Contains(new FuDetail(30, BASE)));
            IsTrue(fuDetails.Contains(new FuDetail(8, CLOSED_TERMINAL_PON)));
            AreEqual(fu, 40);

            tiles   = TileIds.Parse(man: "123456", sou: "11678", honors: "11");
            winTile = TileId.Parse(honors: "1");
            hand    = Hand(new TileIds(tiles.Append(winTile)).ToTiles34());

            (fuDetails, fu) = CalculateFu(hand,
                                          winTile,
                                          GetWinGroup(hand, winTile),
                                          config);

            AreEqual(2, fuDetails.Count);
            IsTrue(fuDetails.Contains(new FuDetail(30, BASE)));
            IsTrue(fuDetails.Contains(new FuDetail(4, OPEN_TERMINAL_PON)));
            AreEqual(fu, 40);
        }
Exemplo n.º 2
0
        public void PenchanFuTest()
        {
            var config = new HandConfig();

            var tiles   = TileIds.Parse(man: "123456", pin: "55", sou: "12456");
            var winTile = TileId.Parse(sou: "3");
            var hand    = Hand(new TileIds(tiles.Append(winTile)).ToTiles34());

            var(fuDetails, fu) = CalculateFu(hand,
                                             winTile,
                                             GetWinGroup(hand, winTile),
                                             config);

            AreEqual(2, fuDetails.Count);
            IsTrue(fuDetails.Contains(new FuDetail(30, BASE)));
            IsTrue(fuDetails.Contains(new FuDetail(2, PENCHAN)));
            AreEqual(fu, 40);

            tiles   = TileIds.Parse(man: "123456", pin: "55", sou: "34589");
            winTile = TileId.Parse(sou: "7");
            hand    = Hand(new TileIds(tiles.Append(winTile)).ToTiles34());

            (fuDetails, fu) = CalculateFu(hand,
                                          winTile,
                                          GetWinGroup(hand, winTile),
                                          config);

            AreEqual(2, fuDetails.Count);
            IsTrue(fuDetails.Contains(new FuDetail(30, BASE)));
            IsTrue(fuDetails.Contains(new FuDetail(2, PENCHAN)));
            AreEqual(fu, 40);
        }
Exemplo n.º 3
0
        public void IsSuukantsuTest()
        {
            var melds = new List <Meld>
            {
                MakeMeld(MeldType.KAN, sou: "1111"),
                MakeMeld(MeldType.KAN, sou: "3333"),
                MakeMeld(MeldType.KAN, pin: "5555"),
                MakeMeld(MeldType.CHANKAN, man: "2222")
            };

            IsTrue(new Suukantsu().IsConditionMet(null, new object[] { melds }));

            var tiles   = TileIds.Parse(man: "222", pin: "44555", sou: "111333");
            var winTile = TileId.Parse(pin: "4");

            melds = new List <Meld>
            {
                MakeMeld(MeldType.KAN, sou: "1111"),
                MakeMeld(MeldType.KAN, sou: "3333"),
                MakeMeld(MeldType.KAN, pin: "5555"),
                MakeMeld(MeldType.KAN, man: "2222")
            };
            var result = EstimateHandValue(tiles, winTile, melds);

            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(70, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 4
0
    private TileId GenerateTile(Vector2Int tileChunkPos, Vector2Int tileWorldPos, List <ChunkVein> veins, ushort chunkSize)
    {
        // Air
        if (tileWorldPos.y > 0)
        {
            return(TileId.Sky);
        }

        // Grass
        if (tileWorldPos.y == 0)
        {
            return(TileId.Grass);
        }

        // Veins
        bool   startVein = false;
        TileId vein      = StartVein(tileChunkPos, tileChunkPos, veins, chunkSize, out startVein);

        // Dirt or vein.
        if (startVein)
        {
            return(vein);
        }
        else
        {
            return(TileId.Dirt);
        }
    }
Exemplo n.º 5
0
        private static void PrintHandResult(TileIds tiles, TileId winTile, List <Meld> melds, HandResponse result)
        {
            Console.WriteLine($"{tiles.ToOneLineString()}");
            var IsOpened = false;

            if (melds is null)
            {
                Console.WriteLine("鳴きなし");
            }
            else
            {
                foreach (var meldItem in melds)
                {
                    Console.WriteLine(meldItem);
                }
                IsOpened = melds.Count(x => x.Opened) > 0;
            }
            Console.WriteLine($"和了牌: {new TileIds(new List<TileId> { winTile }).ToOneLineString()}");
            foreach (var yakuItem in result.Yaku)
            {
                var han = IsOpened ? yakuItem.HanOpen : yakuItem.HanClosed;
                Console.WriteLine($"{yakuItem.Japanese}\t{han}翻");
            }
            Console.WriteLine($"{result.Han}翻 {result.Fu}符");
            Console.WriteLine($"{result.Cost.Main}点");
            foreach (var fuItem in result.FuDetailSet)
            {
                Console.WriteLine($"符: {fuItem.Fu}\tReason: {fuItem.Reason}");
            }
            Console.WriteLine("");
        }
Exemplo n.º 6
0
 public HoleTile(TileId id)
     : base(id)
 {
     ConnectsToSand  = true;
     ConnectsToWater = true;
     ConnectsToLava  = true;
 }
Exemplo n.º 7
0
    public override Task <ElevationTile> GetElevationTileData(TileId tileId, CancellationToken cancellationToken = default)
    {
        if (!_tiles.Contains(tileId))
        {
            return(ElevationTile.FromNull());
        }

        // Read the elevation data from the corresponding file in streaming assets. Files are named by the TileId's quadkey.
        var elevationTileData = File.ReadAllBytes(Path.Combine(ElevationDataDirectory, tileId.ToKey() + ".et"));

        // The ElevationTile data has this layout:
        // * 0 - magic id (0x12345678)
        // * 4 - min elevation in meters (float)
        // * 8 - tile elevation range in meters (float)
        // * 12 - normalized elevation values (ushorts - 257*257 entries).
        var minElevationInMeters   = BitConverter.ToSingle(elevationTileData, 4);
        var elevationRangeInMeters = BitConverter.ToSingle(elevationTileData, 8);
        var elevationTile          =
            ElevationTile.FromNormalizedData(
                tileId,
                257,
                257,
                minElevationInMeters,
                elevationRangeInMeters,
                elevationTileData,
                12 /* offset */);

        // No async code was required so wrap in Task.
        return(Task.FromResult(elevationTile));
    }
Exemplo n.º 8
0
    public bool CanBePlaced(int x, int y, TileId tile)
    {
        if (GetTile(x, y) != TileId.EMPTY)
        {
            return(false);
        }

        if (GetTile(x + 1, y + 1) == TileId.ROAD && GetTile(x, y + 1) == TileId.ROAD && GetTile(x + 1, y) == TileId.ROAD)
        {
            return(false);
        }
        if (GetTile(x - 1, y - 1) == TileId.ROAD && GetTile(x - 1, y) == TileId.ROAD && GetTile(x, y - 1) == TileId.ROAD)
        {
            return(false);
        }
        if (GetTile(x + 1, y - 1) == TileId.ROAD && GetTile(x, y - 1) == TileId.ROAD && GetTile(x + 1, y) == TileId.ROAD)
        {
            return(false);
        }
        if (GetTile(x - 1, y + 1) == TileId.ROAD && GetTile(x - 1, y) == TileId.ROAD && GetTile(x, y + 1) == TileId.ROAD)
        {
            return(false);
        }

        return(true);
    }
Exemplo n.º 9
0
        public void IsEastTest()
        {
            var(playerWind, roundWind) = (EAST, WEST);

            var tiles = Tiles34.Parse(man: "23422", sou: "234567", honors: "111");

            IsTrue(new YakuhaiEast().IsConditionMet(Hand(tiles), new object[] { playerWind, roundWind }));

            var tiles_  = TileIds.Parse(man: "23422", sou: "234567", honors: "111");
            var winTile = TileId.Parse(honors: "1");
            var result  = EstimateHandValue(tiles_, winTile, config: new HandConfig(
                                                isTsumo: false, isRiichi: false, playerWind: playerWind, roundWind: roundWind));

            AreEqual(null, result.Error);
            AreEqual(1, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);

            roundWind = EAST;
            result    = EstimateHandValue(tiles_, winTile, config: new HandConfig(
                                              isTsumo: false, isRiichi: false, playerWind: playerWind, roundWind: roundWind));
            AreEqual(null, result.Error);
            AreEqual(2, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(2, result.Yaku.Count);
        }
Exemplo n.º 10
0
 private static bool IsAkaDora(TileId tile, bool akaEnabled)
 {
     return(akaEnabled &&
            (tile.Value == FIVE_RED_MAN ||
             tile.Value == FIVE_RED_PIN ||
             tile.Value == FIVE_RED_SOU));
 }
Exemplo n.º 11
0
        public void IsJunchanTest()
        {
            var tiles = Tiles34.Parse(man: "123789", pin: "12399", sou: "789");

            IsTrue(new Junchan().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(man: "111999", sou: "111", honors: "22333");
            IsFalse(new Junchan().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(man: "111999", pin: "11999", sou: "111999");
            IsFalse(new Junchan().IsConditionMet(Hand(tiles)));

            var tiles_  = TileIds.Parse(man: "123789", pin: "12399", sou: "789");
            var winTile = TileId.Parse(man: "2");
            var result  = EstimateHandValue(tiles_, winTile);

            AreEqual(null, result.Error);
            AreEqual(3, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);

            var melds = new List <Meld> {
                MakeMeld(MeldType.CHI, sou: "789")
            };

            result = EstimateHandValue(tiles_, winTile, melds);
            AreEqual(null, result.Error);
            AreEqual(2, result.Han);
            AreEqual(30, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 12
0
        public void IsIttsuTest()
        {
            var tiles = Tiles34.Parse(man: "123456789", sou: "123", honors: "22");

            IsTrue(new Ittsu().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(man: "112233456789", honors: "22");
            IsTrue(new Ittsu().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(man: "122334567789", honors: "11");
            IsFalse(new Ittsu().IsConditionMet(Hand(tiles)));

            var tiles_  = TileIds.Parse(man: "123456789", sou: "123", honors: "22");
            var winTile = TileId.Parse(sou: "3");
            var result  = EstimateHandValue(tiles_, winTile);

            AreEqual(null, result.Error);
            AreEqual(2, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);

            var melds = new List <Meld> {
                MakeMeld(MeldType.CHI, man: "123")
            };

            result = EstimateHandValue(tiles_, winTile, melds);
            AreEqual(null, result.Error);
            AreEqual(1, result.Han);
            AreEqual(30, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 13
0
        public void IsToitoiTest()
        {
            var tiles = Tiles34.Parse(man: "333", pin: "44555", sou: "111333");

            IsTrue(new Toitoi().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(pin: "777888999", sou: "777", honors: "44");
            IsTrue(new Toitoi().IsConditionMet(Hand(tiles)));

            var tiles_  = TileIds.Parse(man: "333", pin: "44555", sou: "111333");
            var winTile = TileId.Parse(pin: "5");
            var melds   = new List <Meld>
            {
                MakeMeld(MeldType.PON, sou: "111"),
                MakeMeld(MeldType.PON, sou: "333")
            };
            var result = EstimateHandValue(tiles_, winTile, melds);

            AreEqual(null, result.Error);
            AreEqual(2, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);

            tiles_  = TileIds.Parse(pin: "777888999", sou: "777", honors: "44");
            winTile = TileId.Parse(pin: "9");
            melds   = new List <Meld> {
                MakeMeld(MeldType.PON, sou: "777")
            };
            result = EstimateHandValue(tiles_, winTile, melds);
            AreEqual(null, result.Error);
            AreEqual(2, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 14
0
        public void IsHonrotoTest()
        {
            var tiles = Tiles34.Parse(man: "111", sou: "111999", honors: "11222");

            IsTrue(new Honroto().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(man: "1199", pin: "11", honors: "22334466");
            IsTrue(new Honroto().IsConditionMet(Hand(tiles)));

            var tiles_  = TileIds.Parse(man: "111", sou: "111999", honors: "11222");
            var winTile = TileId.Parse(honors: "2");
            var melds   = new List <Meld> {
                MakeMeld(MeldType.PON, sou: "111")
            };
            var result = EstimateHandValue(tiles_, winTile, melds);

            AreEqual(null, result.Error);
            AreEqual(4, result.Han);
            AreEqual(50, result.Fu);
            AreEqual(2, result.Yaku.Count);

            tiles_  = TileIds.Parse(man: "1199", pin: "11", honors: "22334466");
            winTile = TileId.Parse(man: "1");
            result  = EstimateHandValue(tiles_, winTile);
            AreEqual(4, result.Han);
            AreEqual(25, result.Fu);
        }
Exemplo n.º 15
0
        public void IsSanshokuTest()
        {
            var tiles = Tiles34.Parse(man: "123", pin: "12345677", sou: "123");

            IsTrue(new Sanshoku().IsConditionMet(Hand(tiles)));

            tiles = Tiles34.Parse(man: "23455", pin: "123", sou: "123456");
            IsFalse(new Sanshoku().IsConditionMet(Hand(tiles)));

            var tiles_  = TileIds.Parse(man: "12399", pin: "123", sou: "123456");
            var winTile = TileId.Parse(man: "2");
            var result  = EstimateHandValue(tiles_, winTile);

            AreEqual(null, result.Error);
            AreEqual(2, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);

            var melds = new List <Meld> {
                MakeMeld(MeldType.CHI, sou: "123")
            };

            result = EstimateHandValue(tiles_, winTile, melds);
            AreEqual(null, result.Error);
            AreEqual(1, result.Han);
            AreEqual(30, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 16
0
        public void IsRyanpeikouTest()
        {
            var tiles = Tiles34.Parse(man: "22", pin: "223344", sou: "112233");

            IsTrue(new Ryanpeikou().IsConditionMet(Hand(tiles, 1)));

            tiles = Tiles34.Parse(man: "22", sou: "111122223333");
            IsTrue(new Ryanpeikou().IsConditionMet(Hand(tiles, 1)));

            tiles = Tiles34.Parse(man: "123", pin: "23444", sou: "112233");
            IsFalse(new Ryanpeikou().IsConditionMet(Hand(tiles)));

            var tiles_  = TileIds.Parse(man: "33", pin: "223344", sou: "112233");
            var winTile = TileId.Parse(pin: "3");
            var result  = EstimateHandValue(tiles_, winTile);

            AreEqual(null, result.Error);
            AreEqual(3, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);

            var melds = new List <Meld> {
                MakeMeld(MeldType.CHI, sou: "123")
            };

            result = EstimateHandValue(tiles_, winTile, melds);
            AreNotEqual(null, result.Error);
        }
Exemplo n.º 17
0
        public TileId Tsumo()
        {
            var tsumo = new TileId(tiles_[0]);

            tiles_.RemoveAt(0);
            return(tsumo);
        }
Exemplo n.º 18
0
        public void DisabledDoubleYakumanTest()
        {
            var tiles   = TileIds.Parse(man: "19", pin: "19", sou: "119", honors: "1234567");
            var winTile = TileId.Parse(sou: "1");
            var result  = EstimateHandValue(tiles, winTile, config: new HandConfig(options: new OptionalRules(hasDoubleYakuman: false)));

            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(0, result.Fu);
            AreEqual(1, result.Yaku.Count);

            tiles   = TileIds.Parse(man: "333", pin: "44455", sou: "111444");
            winTile = TileId.Parse(pin: "5");
            result  = EstimateHandValue(tiles, winTile, config: new HandConfig(isTsumo: true, options: new OptionalRules(hasDoubleYakuman: false)));
            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(50, result.Fu);
            AreEqual(1, result.Yaku.Count);

            tiles   = TileIds.Parse(man: "11122345678999");
            winTile = TileId.Parse(man: "2");
            result  = EstimateHandValue(tiles, winTile, config: new HandConfig(options: new OptionalRules(hasDoubleYakuman: false)));
            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(50, result.Fu);
            AreEqual(1, result.Yaku.Count);

            tiles   = TileIds.Parse(sou: "22", honors: "111222333444");
            winTile = TileId.Parse(honors: "4");
            result  = EstimateHandValue(tiles, winTile, config: new HandConfig(options: new OptionalRules(hasDoubleYakuman: false)));
            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(60, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 19
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="id">The type of this tile.</param>
 /// <param name="solidityType"></param>
 /// <param name="textureSourceRectangle">The appropriate source rectangle to use. see <c>SourceRects</c>.</param>
 /// <param name="drawColor"></param>
 public Tile(TileId id, Solidity solidityType, Rectangle textureSourceRectangle, Color drawColor, TileSide tileSide)
 {
     this.Id = id;
     this.SolidityType = solidityType;
     this.SourceRectangle = textureSourceRectangle;
     this.DrawColor = drawColor;
     this.Side = tileSide;
 }
Exemplo n.º 20
0
 public override int GetHashCode()
 {
     unchecked
     {
         int hashCode = TileId.GetHashCode();
         hashCode = (hashCode * 397) ^ TileSetId.GetHashCode();
         return(hashCode);
     }
 }
Exemplo n.º 21
0
        public static Sprite[] GetSprites(TileId tile)
        {
            if (!_tiles.ContainsKey(tile))
            {
                return(new Sprite[0]);
            }

            return(_tiles[tile].ToArray());
        }
Exemplo n.º 22
0
        private void FrmMain_KeyDown(object sender, KeyEventArgs e)
        {
            if (ci < 0 || cj < 0)
            {
                return;
            }

            if (e.KeyCode == Keys.Right)
            {
                ci++;
            }

            if (e.KeyCode == Keys.Left)
            {
                ci--;
            }

            if (e.KeyCode == Keys.Down)
            {
                cj++;
            }

            if (e.KeyCode == Keys.Up)
            {
                cj--;
            }

            if (ci < 0)
            {
                ci = 0;
            }

            if (ci >= nbTilesX)
            {
                ci = nbTilesX - 1;
            }

            if (cj < 0)
            {
                cj = 0;
            }

            if (cj >= nbTilesY)
            {
                cj = nbTilesY - 1;
            }

            PictureBox aPicBox = sTiles[ci, cj];

            TileId aTileId = (TileId)(aPicBox).Tag;

            ci = aTileId.i;
            cj = aTileId.j;

            ShowSelection(aPicBox);
        }
Exemplo n.º 23
0
        public void LoadTile(TileId tileId, int ox, int oy, System.Action <bool, RendererOperation> onComplete)
        {
            var ix = ((tileId.X - ox) + ox % m_tileCountX) % m_tileCountX;
            var iy = ((tileId.Y - oy) + oy % m_tileCountY) % m_tileCountY;

            var tile = m_tileInfo[ix, iy];

            RenderTile(tile, ox, oy, tileId.X, tileId.Y, tileId.Zoom);
            //throw new System.NotImplementedException();
        }
Exemplo n.º 24
0
 public SaplingTile(TileId id, Tile onType, Tile growsTo)
     : base(id)
 {
     _onType         = onType;
     _growsTo        = growsTo;
     ConnectsToSand  = onType.ConnectsToSand;
     ConnectsToGrass = onType.ConnectsToGrass;
     ConnectsToWater = onType.ConnectsToWater;
     ConnectsToLava  = onType.ConnectsToLava;
 }
Exemplo n.º 25
0
        public void IsRenhouYakumanTest()
        {
            var tiles   = TileIds.Parse(man: "234456", pin: "66", sou: "123444");
            var winTile = TileId.Parse(sou: "4");
            var result  = EstimateHandValue(tiles, winTile, config: new HandConfig(isRenhou: true, options: new OptionalRules(renhouAsYakuman: true)));

            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 26
0
        public void IsNotDaisharinTest()
        {
            var tiles   = TileIds.Parse(pin: "22334455667788");
            var winTile = TileId.Parse(pin: "8");
            var result  = EstimateHandValue(tiles, winTile);

            AreEqual(null, result.Error);
            AreEqual(11, result.Han);
            AreEqual(4, result.Yaku.Count);
        }
Exemplo n.º 27
0
        void aTile_Click(object sender, EventArgs e)
        {
            PictureBox aPicBox = (PictureBox)sender;

            TileId aTileId = (TileId)(aPicBox).Tag;

            ci = aTileId.i;
            cj = aTileId.j;

            ShowSelection(aPicBox);
        }
Exemplo n.º 28
0
        public void SixtupleYakumanTest()
        {
            var tiles   = TileIds.Parse(honors: "11122233344455");
            var winTile = TileId.Parse(honors: "5");
            var config  = new HandConfig(isTenhou: true);
            var result  = EstimateHandValue(tiles, winTile, config: config);

            AreEqual(null, result.Error);
            AreEqual(78, result.Han);
            AreEqual(192000, result.Cost.Main);
        }
Exemplo n.º 29
0
        public void IsDaisharinTest()
        {
            var tiles   = TileIds.Parse(pin: "22334455667788");
            var winTile = TileId.Parse(pin: "8");
            var result  = EstimateHandValue(tiles, winTile, config: new HandConfig(options: new OptionalRules(hasDaisharin: true)));

            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(1, result.Yaku.Count);
            AreEqual("Daisharin", result.Yaku[0].Name);
        }
Exemplo n.º 30
0
        public void IsChiihouTest()
        {
            var tiles   = TileIds.Parse(man: "234456", pin: "66", sou: "123444");
            var winTile = TileId.Parse(sou: "4");
            var result  = EstimateHandValue(tiles, winTile, config: new HandConfig(isChiihou: true));

            AreEqual(null, result.Error);
            AreEqual(13, result.Han);
            AreEqual(40, result.Fu);
            AreEqual(1, result.Yaku.Count);
        }
Exemplo n.º 31
0
        public TreeTile(TileId id, int color, int barkColor1, int barkColor2)
            : base(id, SpriteSheet.GetSprites(TileId.Grass))
        {
            _ssprites = SpriteSheet.GetSprites(TileId.Tree);

            _color      = color;
            _barkColor1 = barkColor1;
            _barkColor2 = barkColor2;

            TileColor = color + barkColor1 + barkColor2;
        }