public PlayPath(WordPart main, WordPartCollection extras, ConstantList <LetterPlay> played, ConstantList <char> pending) { this.main = main; this.extras = extras; this.played = played; this.pending = pending; }
[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]); }
[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); }
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); }