示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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}");
                                }
                            }
                        }
                    }
                }
            }
        }