コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
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));
         }
     }
 }
コード例 #4
0
 public void AddBoardTileAtEnd(PlayedWordLetter letter)
 {
     playedWordLetters.Add(letter);
 }
コード例 #5
0
 public void AddBoardTileAtStart(PlayedWordLetter letter)
 {
     playedWordLetters.Insert(0, letter);
 }
コード例 #6
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);
        }