Ejemplo n.º 1
0
 public PlayPath(WordPart main, WordPartCollection extras, ConstantList <LetterPlay> played, ConstantList <char> pending)
 {
     this.main    = main;
     this.extras  = extras;
     this.played  = played;
     this.pending = pending;
 }
Ejemplo n.º 2
0
        [Test] public void TestPlayBetween()
        {
            var list = new List <WordPart>();

            list.Add(new WordPart("LET", new Cell(4, 0), Direction.Right));
            list.Add(new WordPart("RE", new Cell(4, 4), Direction.Right));
            var parts  = new WordPartCollection(list.ToConstant());
            var played = parts.Play(new Cell(4, 3), 'T');

            Assert.AreEqual(1, played.Count);
            Assert.AreEqual(new WordPart("LETTRE", new Cell(4, 0), Direction.Right), played[0]);
        }
Ejemplo n.º 3
0
        [Test] public void TestPlaySimple()
        {
            var list = new List <WordPart>();

            list.Add(new WordPart("MOT", new Cell(4, 4), Direction.Right));
            var parts    = new WordPartCollection(list.ToConstant());
            var newParts = parts.Play(new Cell(4, 7), 'S');

            Assert.AreEqual(1, newParts.Count);
            Assert.AreEqual("MOTS", newParts[0].Word);
            Assert.AreEqual(new Cell(4, 4), newParts[0].First);
            Assert.AreEqual(Direction.Right, newParts[0].Direction);
        }
Ejemplo n.º 4
0
        public Board Play(WordPart part, IList <LetterPlay> played, WordPartCollection extras)
        {
            var start = new ConstantSet <Cell>(GetStartCells());
            var list  = new List <Cell>();

            list.Add(part.First);
            var current = part.First;

            for (int i = 1; i < part.Word.Length; i++)
            {
                if (!current.TryGetNext(part.Direction, out current))
                {
                    throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Cannot play {0} at {1}", part.Word, part.First));
                }
                list.Add(current);
            }
            if (!Contains(start, list))
            {
                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Cannot play {0} at {1}", part.Word, part.First));
            }
            var newBoard = BuildBoard();
            var newOwner = BuildOwner();

            for (int i = 0; i < Height; i++)
            {
                for (int j = 0; j < Width; j++)
                {
                    newBoard[i][j] = board[i][j];
                    newOwner[i][j] = owner[i][j];
                }
            }
            var newPlayer = player == Player.First ? Player.Second : Player.First;
            int taken     = 0;
            var newCells  = new HashSet <Cell>(cells);

            for (int i = 0; i < part.Word.Length; i++)
            {
                Cell c      = list[i];
                char letter = part.Word[i];
                if (newBoard[c.Row][c.Column] == Empty || newOwner[c.Row][c.Column] != player)
                {
                    if (newOwner[c.Row][c.Column] == newPlayer)
                    {
                        taken++;
                    }
                    newBoard[c.Row][c.Column] = letter;
                    newOwner[c.Row][c.Column] = player;
                    newCells.Add(c);
                    if (CellUpdated != null)
                    {
                        CellUpdated(this, new CellUpdatedEventArgs(c, letter));
                    }
                }
            }

            int  points = played.Count;
            int  stars  = 0;
            bool vortex = false;

            foreach (LetterPlay lp in played)
            {
                if (lp.Cell.IsStar)
                {
                    stars++;
                }
                else if (lp.Cell.IsVortex)
                {
                    vortex = true;
                }
            }
            foreach (WordPart extra in extras)
            {
                var cell = extra.First;
                for (int i = 0; i < extra.Word.Length; i++)
                {
                    if (newOwner[cell.Row][cell.Column] != player)
                    {
                        newOwner[cell.Row][cell.Column] = player;
                        taken++;
                    }
                    if (i < extra.Word.Length - 1)
                    {
                        switch (extra.Direction)
                        {
                        case Direction.Down:
                            cell = cell.Down;
                            break;

                        case Direction.Right:
                            cell = cell.Right;
                            break;
                        }
                    }
                }
            }
            var newOther   = new PlayerScore(score.Current.Points + points + taken + (vortex ? score.Current.Stars + stars : 0), vortex ? 0 : score.Current.Stars + stars);
            var newCurrent = new PlayerScore(score.Other.Points - taken, vortex ? 0 : score.Other.Stars);
            var newScore   = new Score(newCurrent, newOther);

            var result = new Board(newBoard, newOwner, newCells.ToConstant(), newPlayer, newScore);

            result.CellUpdated = CellUpdated;
            return(result);
        }