public IEnumerable <PlayedWordLetter> AfterWordTiles(Func <int, int, char> boardTileGetter) { int y = maxY + 1; bool atEdge = y >= GameBase.BOARD_WIDTH; char nextChar; while (!atEdge && (nextChar = boardTileGetter(x, y)) != ' ') { // Don't include multipliers on letters before/after what the user played yield return(PlayedWordLetter.Create(nextChar)); y++; atEdge = y >= GameBase.BOARD_WIDTH; } }
public IEnumerable <PlayedWordLetter> BeforeWordTiles(Func <int, int, char> boardTileGetter) { int y = minY - 1; bool atEdge = y < 0; char nextChar; while (!atEdge && (nextChar = boardTileGetter(x, y)) != ' ') { // Don't include multipliers on letters before/after what the user played yield return(PlayedWordLetter.Create(nextChar)); y--; atEdge = y < 0; } }
public IEnumerable <PlayedWordLetter> WordTiles(Func <int, int, char> userTileGetter, Func <int, int, char> boardTileGetter) { for (int y = minY; y <= maxY; y++) { char tile = boardTileGetter(x, y); if (tile == ' ') { // The board has no tile here, so the user must be playing // in this space. Include the multiplier from the board yield return(PlayedWordLetter.CreateWithBoardMultiplier(userTileGetter(x, y), x, y)); } else { // The board has a tile here already, so multipliers aren't used yield return(PlayedWordLetter.Create(tile)); } } }
public void AddBoardTileAtEnd(PlayedWordLetter letter) { playedWordLetters.Add(letter); }
public void AddBoardTileAtStart(PlayedWordLetter letter) { playedWordLetters.Insert(0, letter); }
protected internal List <PlayedWord> FindWords() { if (!IsValidMove(out string error)) { throw new InvalidOperationException(error); } List <PlayedWord> results = new List <PlayedWord>(); // Check the main word that's been played PlayedWordBuilder mainWordBuilder = new PlayedWordBuilder(); foreach (PlayedWordLetter tile in directionStrategy.WordTiles( (x, y) => placements.SingleOrDefault(p => p.X == x && p.Y == y)?.Tile ?? ' ', (x, y) => game[x, y])) { mainWordBuilder.AddBoardTileAtEnd(tile); } // Are the existing letters before/after it? foreach (PlayedWordLetter tile in directionStrategy.BeforeWordTiles((x, y) => game[x, y])) { mainWordBuilder.AddBoardTileAtStart(tile); } foreach (PlayedWordLetter tile in directionStrategy.AfterWordTiles((x, y) => game[x, y])) { mainWordBuilder.AddBoardTileAtEnd(tile); } var mainWord = mainWordBuilder.GetPlayedWord(); if (mainWord.ToString().Length > 1 || game.IsFirstMove()) { results.Add(mainWord); } // Check for any intersecting words foreach (var placement in placements) { var oppositeStrategy = directionStrategy.GetOppositeStrategy(placement); var crossWordBuilder = new PlayedWordBuilder(); crossWordBuilder.AddBoardTileAtStart(PlayedWordLetter.CreateWithBoardMultiplier(placement.Tile, placement.X, placement.Y)); foreach (PlayedWordLetter tile in oppositeStrategy.BeforeWordTiles((x, y) => game[x, y])) { crossWordBuilder.AddBoardTileAtStart(tile); } foreach (PlayedWordLetter tile in oppositeStrategy.AfterWordTiles((x, y) => game[x, y])) { crossWordBuilder.AddBoardTileAtEnd(tile); } var crossWord = crossWordBuilder.GetPlayedWord(); if (crossWord.ToString().Length > 1) { results.Add(crossWord); } } return(results); }