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); }
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(""); }
public TileIds Haipai() { var haipai = new TileIds(tiles_.GetRange(0, 13)); tiles_.RemoveRange(0, 13); return(haipai); }
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); }
private static void Main(string[] args) { random_ = new Random(); var wall = new List <int>(Enumerable.Range(0, 136)); var count = wall.Count; for (var i = 0; i < count; i++) { var r = random_.Next(i, count); (wall[i], wall[r]) = (wall[r], wall[i]); } var hand = new TileIds(wall.GetRange(0, 13)); var discards = new List <int>(); wall.RemoveRange(0, 13); for (var c = wall.Count; c > 0; c--) { hand.Add(wall[0]); wall.RemoveAt(0); PrintTiles(hand); var res = HandCalculator.EstimateHandValue(hand, hand.Last() /*, config:new HandConfig(isTsumo:true)*/); if (res.Error is null) { Console.WriteLine(""); PrintHandResult(hand, hand.Last(), null, res); break; } discards.Add(DecideDahai(hand)); PrintTiles(hand); } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
public void ShantenNumberTest() { var tiles = TileIds.Parse(man: "567", pin: "11", sou: "111234567"); AreEqual(AGARI_STATE, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "567", pin: "11", sou: "111345677"); AreEqual(0, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "567", pin: "15", sou: "111345677"); AreEqual(1, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "1578", pin: "15", sou: "11134567"); AreEqual(2, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "1358", pin: "1358", sou: "113456"); AreEqual(3, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "1358", pin: "13588", sou: "1589", honors: "1"); AreEqual(4, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "1358", pin: "13588", sou: "159", honors: "12"); AreEqual(5, CalculateShanten(tiles)); tiles = TileIds.Parse(man: "1358", pin: "258", sou: "1589", honors: "123"); AreEqual(6, CalculateShanten(tiles)); tiles = TileIds.Parse(sou: "11123456788999"); AreEqual(AGARI_STATE, CalculateShanten(tiles)); tiles = TileIds.Parse(sou: "11122245679999"); AreEqual(0, CalculateShanten(tiles)); }
private void ProcessLvlFiles(IEnumerable <string> files, Dictionary <string, MyBitmap> newMap, Dictionary <string, MyBitmap> oldMap) { // Create the mapping. var mapping = new Dictionary <string, string>(); foreach (var tileOld in oldMap) { var tileNew = newMap.FirstOrDefault(t => t.Value.Equals(tileOld.Value)); mapping.Add(tileOld.Key, tileNew.Key); // tileNew.Key will be null if not found } foreach (var file in files) { var level = Level.Read(file); for (var x = 0; x < level.Tiles.Length; x++) { for (var y = 0; y < level.Tiles[x].Length; y++) { var id = TileIds.ParsePaletteId(level.Tiles[x][y]); var newId = mapping[id.Item2]; if (newId == null) { throw new Exception($"Removed tile in level {file}"); } level.Tiles[x][y] = TileIds.PaletteTileId(id.Item1, newId); } } level.Write(file); } }
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); }
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); }
public void StringToTiles136WithAkaDora() { var tiles = TileIds.Parse(man: "2244", pin: "333r67", sou: "44", hasAkaDora: true); IsTrue(tiles.Select(t => t.Value).Contains(FIVE_RED_PIN)); tiles = TileIds.Parse(man: "2244", pin: "333067", sou: "44", hasAkaDora: true); IsTrue(tiles.Select(t => t.Value).Contains(FIVE_RED_PIN)); }
public void IsNagashiManganTest() { var tiles = TileIds.Parse(man: "234456", pin: "66", sou: "13579"); var result = EstimateHandValue(tiles, null, config: new HandConfig(isNagashiMangan: true)); AreEqual(null, result.Error); AreEqual(5, result.Han); AreEqual(30, result.Fu); AreEqual(1, result.Yaku.Count); }
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); }
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); }
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); }
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); }
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); }
public void OneLineStringToTiles136() { var initialString = "789m456p555s11222z"; var tiles = TileIds.Parse(str: initialString); AreEqual(14, tiles.Count); var newString = tiles.ToOneLineString(); AreEqual(initialString, newString); }
public static Meld MakeMeld(MeldType meldType, string man = "", string pin = "", string sou = "", string honors = "", bool isOpen = true) { var tiles = TileIds.Parse(man: man, pin: pin, sou: sou, honors: honors); return(new Meld(meldType, tiles, isOpen, tiles[0], who: 0)); }
public void IsAgariAndOpenHandTest() { var tiles = TileIds.Parse(man: "345", pin: "222", sou: "23455567"); var melds = new List <TileKinds> { StringToOpenTiles34(man: "345"), StringToOpenTiles34(sou: "555") }; IsFalse(IsAgari(tiles, melds)); }
private int DecideDahai() { var shantenList = new List <int>(); for (var i = 0; i < Hand.Count; i++) { var h = new TileIds(Hand); h.RemoveAt(i); shantenList.Add(Shanten.CalculateShanten(h)); } return(shantenList.IndexOf(shantenList.Min())); }
public void Tiles136ToOneLineStringTest() { var tiles = new TileIds(new List <int> { 0, 1, 34, 35, 36, 37, 70, 71, 72, 73, 106, 107, 108, 109, 133, 134 }); var expected = "1199m1199p1199s1177z"; var actual = tiles.ToOneLineString(); AreEqual(expected, actual); }
public void IsNotAgari() { var tiles = TileIds.Parse(pin: "12345", sou: "123456789"); IsFalse(IsAgari(tiles)); tiles = TileIds.Parse(pin: "11145", sou: "111222444"); IsFalse(IsAgari(tiles)); tiles = TileIds.Parse(sou: "11122233356888"); IsFalse(IsAgari(tiles)); }
public void IsChitoitsuAgariTest() { var tiles = TileIds.Parse(pin: "1199", sou: "1133557799"); IsTrue(IsAgari(tiles)); tiles = TileIds.Parse(man: "11", pin: "1199", sou: "2244", honors: "2277"); IsTrue(IsAgari(tiles)); tiles = TileIds.Parse(man: "11223344556677"); IsTrue(IsAgari(tiles)); }