예제 #1
0
        public void TestAClassicalGame()
        {
            IChess chess = new Classical();

            IPiece piece;

            Assert.All(GameOfChessData, tuple =>
            {
                Assert.True(chess.Process(tuple.Item1, out piece));
                if (tuple.Item3 == null)
                {
                    Assert.Null(piece);
                }
                else
                {
                    Assert.Equal(tuple.Item3.GetType(), piece.GetType());
                    Assert.Equal(tuple.Item3.Color, piece.Color);
                }
                Assert.Equal(tuple.Item2,
                             chess.AvailableMoves(chess.MoveEntries.Last().Position[tuple.Item1.FromSquare].Color).Count);
                Assert.Equal(tuple.Item4, chess.Position.Count);
            });

            Assert.Empty(chess.AvailableMoves(true));
            Assert.True(chess.IsChecked <Classical>(true));
        }
예제 #2
0
        public void TestConstructor()
        {
            IChess chess = new Classical();

            Assert.Empty(chess.MoveEntries);
            Assert.Equal(32, chess.Position.Count);
            Assert.Equal(16, chess.Position.Values.Where(p => p.Color).ToList().Count);
            Assert.Equal(20, chess.AvailableMoves(true).Count);
            Assert.Equal(20, chess.AvailableMoves(false).Count);

            var pawns   = chess.Position.Where(kp => kp.Value is Pawn).ToList();
            var knights = chess.Position.Where(kp => kp.Value is Knight).ToList();
            var bishops = chess.Position.Where(kp => kp.Value is Bishop).ToList();
            var rooks   = chess.Position.Where(kp => kp.Value is Rook).ToList();
            var queens  = chess.Position.Where(kp => kp.Value is Queen).ToList();
            var kings   = chess.Position.Where(kp => kp.Value is King).ToList();

            Assert.Equal(16, pawns.Count);
            Assert.All(pawns, kp =>
            {
                Assert.Equal(kp.Value.Color ? Ranks.two : Ranks.seven, kp.Key.Rank);
            });

            Assert.Equal(4, knights.Count);
            Assert.All(knights, kp =>
            {
                Assert.Equal(kp.Value.Color ? Ranks.one : Ranks.eight, kp.Key.Rank);
                Assert.True(kp.Key.File == Files.b || kp.Key.File == Files.g);
            });

            Assert.Equal(4, bishops.Count);
            Assert.All(bishops, kp =>
            {
                Assert.Equal(kp.Value.Color ? Ranks.one : Ranks.eight, kp.Key.Rank);
                Assert.True(kp.Key.File == Files.c || kp.Key.File == Files.f);
            });

            Assert.Equal(4, rooks.Count);
            Assert.All(rooks, kp =>
            {
                Assert.Equal(kp.Value.Color ? Ranks.one : Ranks.eight, kp.Key.Rank);
                Assert.True(kp.Key.File == Files.a || kp.Key.File == Files.h);
            });

            Assert.Equal(2, queens.Count);
            Assert.All(queens, kp =>
            {
                Assert.Equal(kp.Value.Color ? Ranks.one : Ranks.eight, kp.Key.Rank);
                Assert.True(kp.Key.File == Files.d);
            });

            Assert.Equal(2, kings.Count);
            Assert.All(kings, kp =>
            {
                Assert.Equal(kp.Value.Color ? Ranks.one : Ranks.eight, kp.Key.Rank);
                Assert.True(kp.Key.File == Files.e);
            });
        }
예제 #3
0
        public void TestProcessMove()
        {
            IChess chess = new Classical();

            var move = new Move(
                new Square(Files.e, Ranks.two),
                new Square(Files.e, Ranks.four),
                MoveType.Rush);

            Assert.True(chess.Process(move, out IPiece p));

            Assert.Equal(30, chess.AvailableMoves(true).Count);
        }
예제 #4
0
        static void Main(string[] args)
        {
            var jericho = new Snake("Jericho", "Boa Constrictor");

            jericho.FeedReptile();
            jericho.Speak();
            jericho.Slither();

            var rogue = new Iguana("Rogue", "Green Iguana");

            rogue.FeedReptile();
            rogue.Speak();
            rogue.Dislike();

            var snuggles = new Alligator("Snuggles", "American Alligator");

            snuggles.FeedReptile();
            snuggles.Speak();
            snuggles.DeathRoll();

            var fgfc820 = new Industrial("FGFC820", "Aggrotech")
            {
                AlbumNumber = 10
            };

            fgfc820.RockOut("Bridgestone Arena");
            fgfc820.CheckAlbums();
            fgfc820.Bringit();

            var vnvNation = new Industrial("VNV Nation", "EBM")
            {
                AlbumNumber = 20
            };

            vnvNation.RockOut("Exit/In");
            vnvNation.CheckAlbums();
            vnvNation.Bringit();

            var bach = new Classical("Johan Sebestian Bach", "Baroque");

            bach.Encore();

            var theGrapesOfWrath = new Novel("The Grapes of Wrath", 525, "John Steinbeck")
            {
                HaveRead = true
            };

            theGrapesOfWrath.Open();
            theGrapesOfWrath.Read();

            var braveNewWorld = new Novel("Brave New World", 452, "Aldous Huxley")
            {
                HaveRead = false
            };

            braveNewWorld.Read();

            var verdi = new PictureBook("Verdi", 15, "Janell Cannon");

            verdi.Read();

            var worldOfWarcraft = new VideoGames("World of Warcraft", new DateTime(2004, 11, 24))
            {
                Developer = "Blizzard",
                GameGenre = GameGenre.MMO
            };

            worldOfWarcraft.Play();
            worldOfWarcraft.Return();

            var doom = new VideoGames("Doom", new DateTime(1993, 12, 10))
            {
                Developer = "id Software",
                GameGenre = GameGenre.Shooter
            };

            doom.Play();
            doom.Return();

            Console.ReadKey();
        }
예제 #5
0
        /// <summary>
        /// TODO: 未実装のValidationステップを実装する
        /// </summary>
        public bool Validate()
        {
            IFiniteField ff = _group.FiniteField;

            // Step1: Check that p is an odd prime
            // Step2: Check that a,b,Gx and Gy are integers in the interval [0, p - 1]
            ECPoint ExportedG = _G.Export();
            Number  Gx        = ff.ToElement(ExportedG.X);
            Number  Gy        = ff.ToElement(ExportedG.Y);

            if (A > P || B > P || Gx > P || Gy > P)
            {
                return(false);
            }

            // Step3: Check that 4*a^3 + 27*b^2 != 0 (mod p)
            Number Apow3 = ff.Multiply(A, ff.Multiply(A, A));
            Number Bpow2 = ff.Multiply(B, B);
            Number ret   = ff.Add(ff.Multiply(ff.ToElement(Number.Four), ff.ToElement(Apow3)), ff.Multiply(ff.ToElement(Number.TwentySeven), Bpow2));

            if (ret.IsZero())
            {
                return(false);
            }

            // Step4: Gy^2 = Gx^3 + a*Gx + b
            Number aGx   = ff.Multiply(A, Gx);
            Number Xpow3 = ff.Multiply(Gx, ff.Multiply(Gx, Gx));
            Number Ypow2 = ff.Multiply(Gy, Gy);

            ret = ff.Add(Xpow3, ff.Add(aGx, B));
            if (ret.CompareTo(Ypow2) != 0)
            {
                return(false);
            }

            // Step5: Check that n is prime.
            // Step6: Check that h <= 4, and that h = (sqrt(p)+1)^2 / n

            // Step7: Check that nG = O
            ECPoint nG = _G.Multiply(N).Export();

            if (!nG.IsInifinity())
            {
                return(false);
            }

            // Step8: Check that q^B != 1 (mod n) for any 1 <= B <= 20, and that nh != p
            Number    p = Number.One;
            Classical c = new Classical(N);

            for (int i = 0; i <= 20; i++)
            {
                p = c.Multiply(p, P);
                if (p.IsOne())
                {
                    return(false);
                }
            }
            if (c.Multiply(N, new Number(new uint[] { H }, 1)).CompareTo(P) == 0)
            {
                return(false);
            }

            return(true);
        }