private void Piece_DrawNumber(object sender, PaintEventArgs e) { Piece piece = (Piece)sender; Han han = Han.가; Eng eng = Eng.A; int num = Convert.ToInt32(piece.Name.Substring(3, piece.Name.Length - 3)) - 1; Font font = new Font("Arial Black", 10f); string str = ""; switch (this.boardOption.drawNumType) { case DrawNumType.Alphabet: str = (eng + num).ToString(); break; case DrawNumType.AlphabetDouble: str = (eng + (int)(num / 26)) + "" + (eng + num % 26); break; case DrawNumType.AlphabetLocation: str = (eng + (int)(num / pieceNum)) + "" + (eng + num % pieceNum); break; case DrawNumType.ExcelLocation: str = (eng + ((num % pieceNum))) + "" + (int)(num / pieceNum + 1); break; case DrawNumType.HangulLocation: str = (han + (int)(num / 14)) + "" + (han + num % 14); break; case DrawNumType.Numeric: default: str = (num + 1).ToString(); break; } e.Graphics.DrawString(str, font, new SolidBrush(this.boardOption.fontColor), 10, 10); }
public Animal Create(string type, string name, double weight, string[] args) { Animal animal; if (args.Length == 1) { bool isBird = double.TryParse(args[0], out double wingSize); if (isBird) { if (type == "Hen") { animal = new Han(name, weight, wingSize); } else if (type == "Owl") { animal = new Owl(name, weight, wingSize); } else { throw new InvalidOperationException(ExceptionMessages.InvalidType); } } else { string livingRegion = args[0]; if (type == "Mouse") { animal = new Mouse(name, weight, livingRegion); } else if (type == "Dog") { animal = new Dog(name, weight, livingRegion); } else { throw new InvalidOperationException(ExceptionMessages.InvalidType); } } } else if (args.Length == 2) { string livingRegion = args[0]; string breed = args[1]; if (type == "Cat") { animal = new Cat(name, weight, livingRegion, breed); } else if (type == "Tiger") { animal = new Tiger(name, weight, livingRegion, breed); } else { throw new InvalidOperationException(ExceptionMessages.InvalidType); } } else { throw new InvalidOperationException(ExceptionMessages.InvalidType); } return(animal); }
private static void WriteWinningHandScores(string workingDirectory) { const int groupKinds = 34 + 21; const int maxGroupsHash = groupKinds * groupKinds * groupKinds * groupKinds; var pairs = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 31, 32 }; foreach (var pair in pairs) { Console.WriteLine($"pair: {pair}"); var path = Path.Combine(workingDirectory, $"standard{pair}.dat"); using var fileStream = File.Create(path); using var binaryWriter = new BinaryWriter(fileStream); var total = 0; for (var groupsHash = 0; groupsHash < maxGroupsHash; groupsHash++) { var tileCounts = new int[34]; tileCounts[pair] += 2; var k = new int[4]; var g = groupsHash; k[0] = g % groupKinds; g /= groupKinds; k[1] = g % groupKinds; g /= groupKinds; k[2] = g % groupKinds; g /= groupKinds; k[3] = g; if (k[0] > k[1] || k[1] > k[2] || k[2] > k[3]) { continue; } AddGroup(tileCounts, k[0]); AddGroup(tileCounts, k[1]); AddGroup(tileCounts, k[2]); AddGroup(tileCounts, k[3]); if (tileCounts.Any(c => c > 4)) { continue; } var invalidKanFlags = 0; for (var i = 0; i < 4; i++) { // Shuntsu can not be kan. No free tile can not be kan if (k[i] >= 34 || tileCounts[k[i]] == 4) { invalidKanFlags |= 2 << (i * 2); } } for (var m = 0; m < 256; m++) { if ((m & invalidKanFlags) != 0) { continue; } var concealedTiles = new int[34]; concealedTiles[pair] += 2; var melds = new List <Meld>(); for (var i = 0; i < 4; i++) { var meldType = (m >> (2 * i)) & 3; if (meldType > 0) { melds.Add(GetMeld(k[i], meldType)); } else { AddGroup(concealedTiles, k[i]); } } var tiles = new List <Tile>(); for (var i = 0; i < 34; i++) { var tileType = TileType.FromTileTypeId(i); for (var j = 0; j < concealedTiles[i]; j++) { var tile = Tile.FromTileType(tileType, j); tiles.Add(tile); } } for (var i = 0; i < 34; i++) { if (concealedTiles[i] == 0) { continue; } var winningTile = TileType.FromTileTypeId(i); var windConfigurations = SimpleWindConfiguration; if (pair >= 27 && pair < 31) { windConfigurations = WindConfigurations[pair - 27]; } foreach (var(roundWind, seatWind) in windConfigurations) { var(tsumoYaku, tsumoFu) = ClassicScoreCalculator.Tsumo(winningTile, roundWind, seatWind, melds, tiles); var tsumoHan = Han.Calculate(tsumoYaku); binaryWriter.Write((byte)tsumoHan); if (tsumoHan < 5) { binaryWriter.Write((byte)tsumoFu); } var(ronYaku, ronFu) = ClassicScoreCalculator.Ron(winningTile, roundWind, seatWind, melds, tiles); var ronHan = Han.Calculate(ronYaku); binaryWriter.Write((byte)ronHan); if (tsumoHan < 5) { binaryWriter.Write((byte)ronFu); } total += 1; if (total % 1000000 == 0) { var percentage = (double)groupsHash / maxGroupsHash; Console.WriteLine($"{percentage:P} {total}"); } } } } } } }