Exemple #1
0
        static string RenderBoard(BoardCrumbs b)
        {
            var lines   = new StringBuilder[14];
            var playerO = new Player("O", b);
            var playerX = new Player("X", b);

            var playerTurn = playerO.IsTurn ? playerO : playerX.IsTurn ? playerX : null;
            var turn       = playerTurn.Dice == null ? $"turn: {playerTurn.Name}" : $"{playerTurn.Name} rolled {playerTurn.Dice[0]} {playerTurn.Dice[1]}.";
            var playerCube = b.doublingCube == 1 ? null : playerO.MayDouble ? playerO : playerX.MayDouble ? playerX : null;
            var cube       = playerCube == null ? $"{b.doublingCube}" : $"{b.doublingCube} (owned by {playerCube.Name})";

            Assert.True(playerO.IsTurn == true || playerX.IsTurn == true || (playerO.IsTurn == false && playerX.IsTurn == false));
            Assert.True(playerO.Dice == null || playerX.Dice == null || (playerO.Dice == null && playerX.Dice == null));

            switch (b.direction)
            {
            case 1: RenderBoardForwards(b, lines, playerO, playerX, turn, cube); break;

            case -1: RenderBoardBackwards(b, lines, playerO, playerX, turn, cube); break;

            default: Assert.True(false, $"unknown direction= {b.direction}"); break;
            }

            return(lines.Aggregate(new StringBuilder(), (sb, s) => sb.AppendLine(s.ToString())).ToString());
        }
Exemple #2
0
        public Player(string color, BoardCrumbs b)
        {
            Assert.True(color == "O" || color == "X");

            this.Color = color;
            if (CookieMonster.ParseBoardColor(b.player1Color) == this.Color)
            {
                Name      = b.player1;
                Score     = b.player1Score;
                Bar       = b.player1Bar;
                Home      = b.player1Home;
                Dice      = b.player1Dice == "0:0" ? null : b.player1Dice.Split(':').Select(s => int.Parse(s)).ToArray();
                MayDouble = b.player1MayDouble == 1;
            }
            else
            {
                Name      = b.player2;
                Score     = b.player2Score;
                Bar       = b.player2Bar;
                Home      = b.player2Home;
                Dice      = b.player2Dice == "0:0" ? null : b.player2Dice.Split(':').Select(s => int.Parse(s)).ToArray();
                MayDouble = b.player2MayDouble == 1;
            }

            IsTurn = CookieMonster.ParseTurnColor(b.turnColor) == Color;
        }
Exemple #3
0
        static void RenderBoardForwards(BoardCrumbs b, StringBuilder[] lines, Player playerO, Player playerX, string turn, string cube)
        {
            Assert.Equal(b.direction, 1);

            lines[00] = new StringBuilder($"   +-1--2--3--4--5--6--------7--8--9-10-11-12-+ O: {playerO.Name} - score: {playerO.Score}");
            lines[01] = new StringBuilder($"   |                  |   |                   |");
            lines[02] = new StringBuilder($"   |                  |   |                   |");
            lines[03] = new StringBuilder($"   |                  |   |                   |");
            lines[04] = new StringBuilder($"   |                  |   |                   |");
            lines[05] = new StringBuilder($"   |                  |   |                   |");
            lines[06] = new StringBuilder($"   |                  |BAR|                   |v    {b.matchLength}-point match");
            lines[07] = new StringBuilder($"   |                  |   |                   |");
            lines[08] = new StringBuilder($"   |                  |   |                   |");
            lines[09] = new StringBuilder($"   |                  |   |                   |");
            lines[10] = new StringBuilder($"   |                  |   |                   |");
            lines[11] = new StringBuilder($"   |                  |   |                   |");
            lines[12] = new StringBuilder($"   +24-23-22-21-20-19-------18-17-16-15-14-13-+ X: {playerX.Name} - score: {playerX.Score}");
            lines[13] = new StringBuilder($"   BAR: O-{playerO.Bar} X-{playerX.Bar}   OFF: O-{playerO.Home} X-{playerX.Home}   Cube: {cube}  {turn}");

            // place the pieces for direction == 1
            int[] pipPieces = b.board.Split(':').Select(s => int.Parse(s)).ToArray();
            Assert.Equal(26, pipPieces.Length);
            var piecesO = 0;
            var piecesX = 0;

            for (var pip = 1; pip != 25; ++pip)
            {
                int  pieces = pipPieces[pip];
                char color  = ' ';

                if (pieces > 0)
                {
                    color = 'O'; piecesO += pieces;
                }
                else if (pieces < 0)
                {
                    color = 'X'; pieces = -pieces; piecesX += pieces;
                }
                else
                {
                    Assert.Equal(0, pieces); continue;
                }

                if (pip >= 1 && pip <= 6)
                {
                    for (var i = 0; i != Math.Min(pieces, 5); ++i)
                    {
                        lines[i + 1][5 + (pip - 1) * 3] = color;
                    }

                    if (pieces > 5)
                    {
                        string pileup = pieces.ToString();
                        lines[4 + 1][5 + (pip - 1) * 3] = pileup[0];
                        Assert.True(pileup.Length == 1, "Not handling two-digit pileups");
                    }
                }
                else if (pip >= 7 && pip <= 12)
                {
                    for (var i = 0; i != Math.Min(pieces, 5); ++i)
                    {
                        lines[i + 1][29 + (pip - 7) * 3] = color;
                    }

                    if (pieces > 5)
                    {
                        string pileup = pieces.ToString();
                        lines[4 + 1][29 + (pip - 7) * 3] = pileup[0];
                        Assert.True(pileup.Length == 1, "Not handling two-digit pileups");
                    }
                }
                else if (pip >= 13 && pip <= 18)
                {
                    for (var i = 0; i != Math.Min(pieces, 5); ++i)
                    {
                        lines[11 - i][44 - (pip - 13) * 3] = color;
                    }

                    if (pieces > 5)
                    {
                        string pileup = pieces.ToString();
                        lines[8 - 1][44 - (pip - 13) * 3] = pileup[0];
                        Assert.True(pileup.Length == 1, "Not handling two-digit pileups");
                    }
                }
                else if (pip >= 19 && pip <= 24)
                {
                    for (var i = 0; i != Math.Min(pieces, 5); ++i)
                    {
                        lines[11 - i][20 - (pip - 19) * 3] = color;
                    }

                    if (pieces > 5)
                    {
                        string pileup = pieces.ToString();
                        lines[8 - 1][20 - (pip - 19) * 3] = pileup[0];
                        Assert.True(pileup.Length == 1, "Not handling two-digit pileups");
                    }
                }
                else
                {
                    Assert.True(false, $"pip out of range: {pip}");
                }
            }

            // place the pieces on the bar (direction == 1)
            Assert.True(playerO.Bar >= 0);
            for (var o = 0; o != Math.Min(playerO.Bar, 5); ++o)
            {
                lines[o + 1][24] = 'O';
            }

            if (playerO.Bar > 5)
            {
                string pileup = playerO.Bar.ToString();
                lines[4 + 1][24] = pileup[0];
                Assert.True(pileup.Length == 1, "Not handling two-digit pileups");
            }

            Assert.True(playerX.Bar >= 0);
            for (var x = 0; x != Math.Min(playerX.Bar, 5); ++x)
            {
                lines[11 - x][24] = 'X';
            }

            if (playerX.Bar > 5)
            {
                string pileup = playerX.Bar.ToString();
                lines[7 - 1][24] = pileup[0];
                Assert.True(pileup.Length == 1, "Nxt handling twx-digit pileups");
            }

            Assert.Equal(15, piecesO + playerO.Bar + playerO.Home);
            Assert.Equal(15, piecesX + playerX.Bar + playerX.Home);
        }