Example #1
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));
         }
     }
 }
Example #2
0
        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);
        }