예제 #1
0
    public void CalculatesNextEmpty()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬢ ⬢ ★ ⬢ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ✔ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ✔ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ✔ ⬢ ⬢ ★ ⬢ ⬢ ✔ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ✔ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ✔ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var move = new OnlyJumpStraightOver();

        move.Should().HaveMoves(initial, expected);
    }
예제 #2
0
    public void DoesntIncludeAdjacent()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬢ ⬡ ★ ⬡ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬢ ⬡ ★ ⬡ ⬢ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var move = new OnlyJumpStraightOver();

        move.Should().HaveMoves(initial, expected);
    }
예제 #3
0
    public async Task Player0Wins()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ b b g ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ g ⬡ S Q ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ g q S S S b ⬡ ⬡ ";
        initial += " ⬡ ⬡ g g G G ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedAiBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ b b g ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ g ✔ S Q ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ g q S S S b ⬡ ⬡ ";
        expected += " ⬡ ⬡ g g ★ G ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);

        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().MatchHive(initial, expected);
    }
예제 #4
0
    public async Task PiecesMoveTowardQueenUnderBeetle()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ A g ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ Q s s B ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ G ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var beetleCell = initial.AllCells.First(c => c.Tiles.Any(t => t.Creature.Name == Creatures.Beetle.Name));
        var beetle     = beetleCell.RemoveTopTile();

        beetleCell.AddTile(new Tile(13, 1, Creatures.Queen));
        beetleCell.AddTile(beetle);

        var expected = new ExpectedAiBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ★ g ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ Q s s B ✔ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ✔ G ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var hive   = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);
        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().MatchHive(initial, expected);
    }
예제 #5
0
    public async Task QueenMovesAway()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ S ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ s s s Q ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ s s ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ q ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedAiBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ S ⬡ ✔ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ s s s ★ ✔ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ s s ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ q ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);

        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().MatchHive(initial, expected);
    }
예제 #6
0
    public async Task AntsAreScoreHighlyOncePlaced()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ A B a ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ B ⬡ Q ⬡ ⬡";
        initial += "⬡ ⬡ q B B a ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedAiBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ★ B a ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ B ⬡ Q ⬡ ⬡";
        expected += "⬡ ✔ q B B a ⬡ ⬡ ";
        expected += " ⬡ ✔ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var hive   = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);
        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().MatchHive(initial, expected);
    }
예제 #7
0
    public void SingleCellCanMove()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ★ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ✔ ✔ ✔ ★ ✔ ✔ ✔ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ";

        new WontSplitHive().Should().HaveMoves(initial, expected);
    }
예제 #8
0
    public async Task MovesBeetleOnTopOfQueen2()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ A ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ b ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ g Q b b q B ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedAiBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ A ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ b ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ g Q b b ✔ ★ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);

        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().BeetleOnToQueen(initial, expected);
    }
예제 #9
0
    public void DoesntAllowMovesThroughNarrowGaps()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬢ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬢ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬢ ⬡ ⬡ ⬢ ⬡ ⬢ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬢ ★ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬢ ⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬢ ✔ ✔ ⬢ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬢ ✔ ✔ ✔ ✔ ⬢ ⬡ ⬡ ";
        expected += "⬡ ⬢ ✔ ✔ ⬢ ✔ ⬢ ⬡ ⬡ ⬡";
        expected += " ⬡ ✔ ✔ ⬢ ★ ✔ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬢ ✔ ✔ ⬢ ⬢ ⬢ ⬡ ⬡ ⬡";
        expected += " ⬡ ✔ ✔ ✔ ✔ ✔ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬢ ⬢ ✔ ✔ ✔ ⬢ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ⬡ ";

        new CanSlideTo().Should().HaveMoves(initial, expected);
    }
예제 #10
0
    public void Moves3EmptyPlaces()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬢ ⬢ ⬢ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡";
        initial += " ⬡ ⬢ ⬡ ⬡ ★ ⬢ ⬢ ⬢ ⬡ ";
        initial += "⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬢ ⬢ ⬡ ⬡ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬢ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬢ ⬢ ⬢ ⬢ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬢ ⬡ ✔ ⬢ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬢ ✔ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡";
        expected += " ⬡ ⬢ ⬡ ⬡ ★ ⬢ ⬢ ⬢ ⬡ ";
        expected += "⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ✔ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬢ ⬡ ✔ ⬢ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬢ ✔ ⬡ ⬢ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬢ ⬢ ⬢ ⬡ ⬡ ";

        var move = new OnlyThreeSpaces();

        move.Should().HaveMoves(initial, expected);
    }
예제 #11
0
    public async Task MovesToEnemyQueen()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ A ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ ⬡ g ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ q g g Q A ⬡ ";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedAiBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ★ ⬡ ⬡ ⬡ ⬡ ";
        expected += " ⬡ ✔ ✔ g ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ✔ q g g Q ★ ⬡ ";
        expected += " ⬡ ✔ ✔ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);

        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().MatchHive(initial, expected);
    }
예제 #12
0
    public void OnlyTwoOccupiedCanMove()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ★ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ✔ ★ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ✔ ✔ ✔ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ✔ ✔ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        new WontSplitHive().Should().HaveMoves(initial, expected);
    }
예제 #13
0
    public void CantDisconnectHive2()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬢ ★ ⬢ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬢ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬢ ★ ⬢ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬢ ⬡ ⬢ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        new WontSplitHive().Should().HaveMoves(initial, expected);
    }
예제 #14
0
    public AndConstraint <MovementAssertions> HaveMoves(InitialHiveBuilder initial, ExpectedMovementBuilder expected)
    {
        var expectedCoords = expected.ExpectedMoves();

        Execute.Assertion.Given(() => Subject(initial))
        .ForCondition(coords => coords.SetEquals(expectedCoords))
        .FailWith("\nResulting " + Identifier + "s did not match expected\n\nInitial:\n{1}\n\nActual - Expected:\n{2}\n",
                  _ => initial.OriginCell.Coords, _ => new StringBuilder(initial.ToColoredString(initial.ToString())),
                  actual => new StringBuilder(expected.GetMovementDiff(actual)));

        return(new AndConstraint <MovementAssertions>(this));
    }
예제 #15
0
    public async Task NoMoves()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ A A ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ A a A ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ A A ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var hive   = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0);
        var player = new ComputerPlayer(hive);
        await Assert.ThrowsAsync <ApplicationException>(async() => await player.GetMove());
    }
예제 #16
0
    public void CanSlideAroundEdges()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬢ ⬢ ⬢ ★ ⬢ ⬢ ⬢ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ⬢ ⬢ ⬢ ★ ⬢ ⬢ ⬢ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔";

        new CanSlideTo().Should().HaveMoves(initial, expected);
    }
예제 #17
0
    public AndConstraint <AiAssertions> BeetleOnToQueen(InitialHiveBuilder initialBuilder, ExpectedAiBuilder expected)
    {
        var queenCell  = initialBuilder.AllCells.Where(c => !c.IsEmpty() && c.Tiles.Any(t => t.Creature.Name == Creatures.Queen.Name));
        var beetleCell = initialBuilder.AllCells.Where(c => !c.IsEmpty() && c.Tiles.Any(t => t.Creature.Name == Creatures.Beetle.Name))
                         .Select(c => c.TopTile());

        Execute.Assertion.Given(() => Subject())
        .ForCondition(result => queenCell.Any(c => c.Coords == result.Coords) && beetleCell.Any(t => t.Id == result.Tile.Id))
        .FailWith(
            "\nResulting " + Identifier + "s did not match expected\n\nInitial:\n{1}\n\nActual - Expected:\n{2}\n",
            _ => initialBuilder.OriginCells.Count,
            _ => new StringBuilder(initialBuilder.ToColoredString(initialBuilder.ToString())),
            actual => new StringBuilder(expected.GetMoveDiff(new HashSet <(Coords Coords, Tile Tile)>(), actual))
            );

        return(new AndConstraint <AiAssertions>(this));
    }
예제 #18
0
    public void AllowsAllAdjacentCells()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ";
        initial += "⬡ ★ ⬡";
        initial += " ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ✔ ✔ ";
        expected += "✔ ★ ✔";
        expected += " ✔ ✔ ";

        var move = new IsAdjacent();

        move.Should().HaveMoves(initial, expected);
    }
예제 #19
0
    public void CreatesCellIfTheBoardIsNotLargeEnough()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ★ ⬢ ⬢ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ★ ⬢ ⬢ ✔ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";

        var move = new OnlyJumpStraightOver();

        move.Should().HaveMoves(initial, expected);
    }
예제 #20
0
    public void AllowsAllEmptyCells_WithNoPlacedTiles()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ";
        initial += "⬡ ★ ⬡";
        initial += " ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ✔ ✔ ";
        expected += "✔ ★ ✔";
        expected += " ✔ ✔ ";

        var move = new IsEmpty();

        move.Should().HaveMoves(initial, expected);
    }
예제 #21
0
    public void HasOneHiveRule()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ Q ⬡ ⬡ ";
        initial += "⬡ ⬡ ★ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬢ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ Q ⬡ ⬡ ";
        expected += "⬡ ⬡ ★ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬢ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡";

        Creatures.Ant.Should().HaveMoves(initial, expected);
    }
예제 #22
0
    public AndConstraint <AiAssertions> MatchHive(InitialHiveBuilder initialBuilder, ExpectedAiBuilder expected)
    {
        var expectedMoves = expected.ExpectedMoves();
        var expectedTiles = initialBuilder.AllCells.Where(c => expected.OriginCells.Contains(c))
                            .Select(c => (c.Coords, Tile: c.TopTile()))
                            .ToHashSet();

        expectedTiles.UnionWith(expected.PlayerTrayMoves);

        Execute.Assertion.Given(() => Subject())
        .ForCondition(result => expectedTiles.Any(t => t.Tile.Id == result.Tile.Id) && expectedMoves.Contains(result.Coords))
        .FailWith(
            "\nResulting " + Identifier + "s did not match expected\n\nInitial:\n{1}\n\nActual - Expected:\n{2}\n",
            _ => initialBuilder.OriginCells.Count,
            _ => new StringBuilder(initialBuilder.ToColoredString(initialBuilder.ToString())),
            actual => new StringBuilder(expected.GetMoveDiff(expectedTiles, actual))
            );

        return(new AndConstraint <AiAssertions>(this));
    }
예제 #23
0
    public void HasNeighborsOccupiedRule()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬢ ★ ⬡ ⬡";
        initial += " ⬡ Q ⬢ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ✔ ✔ ⬡ ⬡ ";
        expected += "✔ ⬢ ★ ✔ ⬡";
        expected += " ✔ Q ⬢ ✔ ";
        expected += "⬡ ✔ ✔ ✔ ⬡";

        Creatures.Ant.Should().HaveMoves(initial, expected);
    }
예제 #24
0
    public void CellWithMultipleTilesWontDisconnect()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ★ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ";

        initial.OriginCells.First().AddTile(new Tile(0, 0, Creatures.Beetle));
        var expected = new ExpectedMovementBuilder();

        expected += " ✔ ✔ ✔ ✔ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ✔ ★ ✔ ✔ ";
        expected += "✔ ✔ ✔ ✔ ✔ ✔";
        expected += " ✔ ✔ ✔ ✔ ✔ ";

        new WontSplitHive().Should().HaveMoves(initial, expected);
    }
예제 #25
0
    public async Task OpponentNoMoves()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += " ⬡ ⬡ A q A ⬡ ⬡ ⬡";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedAiBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        expected += "⬡ ⬡ ✔ ⬡ ⬡ ✔ ⬡ ⬡ ";
        expected += " ⬡ ✔ A q A ✔ ⬡ ⬡";
        expected += "⬡ ⬡ ✔ ⬡ ⬡ ✔ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var tile = new Tile(50, 0, Creatures.Ant);

        var player1 = new Player(0, "P1") with {
            Tiles = new HashSet <Tile> {
                tile
            }
        };
        var hive = HiveFactory.CreateInProgress(new[] { player1, new Player(1, "P1") }, initial.AllCells, 0);

        foreach (var tileMove in hive.Players.First().Tiles)
        {
            foreach (var coords in tileMove.Moves)
            {
                initial.AddPlayerTrayOriginMove(coords);
                expected.PlayerTrayMoves.Add((coords, tileMove));
            }
        }

        var player = new ComputerPlayer(hive);

        (await player.GetMove()).Should().MatchHive(initial, expected);
    }
예제 #26
0
    public void HasNeighborsOccupiedRule()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ Q ★ ⬡ ⬡";
        initial += " ⬡ ⬢ ⬢ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ";
        expected += "✔ Q ★ ⬡ ⬡";
        expected += " ⬡ ⬢ ⬢ ⬡ ";
        expected += "⬡ ⬡ ⬡ ✔ ⬡";

        var spider = Creatures.Spider;

        spider.Should().HaveMoves(initial, expected);
    }
예제 #27
0
    public void HasThreeSpacesRuleRule()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ★ ⬡ ";
        initial += "⬡ ⬡ Q ⬡ ⬡";
        initial += " ⬡ ⬡ ⬢ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ★ ⬡ ";
        expected += "⬡ ⬡ Q ⬡ ⬡";
        expected += " ⬡ ✔ ⬢ ⬡ ";
        expected += "⬡ ⬡ ⬡ ✔ ⬡";

        var spider = Creatures.Spider;

        spider.Should().HaveMoves(initial, expected);
    }
예제 #28
0
    public void HasNextUnoccupiedRule()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ★ Q ⬢ ⬡";
        initial += " ⬢ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ★ Q ⬢ ✔";
        expected += " ⬢ ⬢ ⬡ ⬡ ";
        expected += "✔ ⬡ ✔ ⬡ ⬡";

        var grasshopper = Creatures.Grasshopper;

        grasshopper.Should().HaveMoves(initial, expected);
    }
예제 #29
0
    public void AllowsOnlyCellsAdjacentToOrigin()
    {
        var initial = new InitialHiveBuilder();

        initial += "⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ★ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡";

        var expected = new ExpectedMovementBuilder();

        expected += "⬡ ⬡ ⬡ ⬡ ⬡";
        expected += " ⬡ ✔ ✔ ⬡ ";
        expected += "⬡ ✔ ★ ✔ ⬡";
        expected += " ⬡ ✔ ✔ ⬡ ";
        expected += "⬡ ⬡ ⬡ ⬡ ⬡";

        var move = new IsAdjacent();

        move.Should().HaveMoves(initial, expected);
    }
예제 #30
0
    public void HasAtLeastOneNeighbour()
    {
        var initial = new InitialHiveBuilder();

        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬢ ★ ⬢ ⬢ ⬡ ⬡ ";
        initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡";
        initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var expected = new ExpectedMovementBuilder();

        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";
        expected += "⬡ ⬡ ⬡ ✔ ✔ ✔ ✔ ✔ ⬡ ⬡";
        expected += " ⬡ ⬡ ✔ ⬢ ★ ✔ ✔ ✔ ⬡ ";
        expected += "⬡ ⬡ ⬡ ✔ ✔ ✔ ✔ ✔ ⬡ ⬡";
        expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ";

        var move = new HasAnyNeighbour();

        move.Should().HaveMoves(initial, expected);
    }