コード例 #1
0
ファイル: AIPlayer.cs プロジェクト: peku33/ScrabbleSolver
        public override void MakeFirstMove(PutWordEvent MoveEvent)
        {
            int BestResult = 0;
            int BestStartIndex = 0;
            Dictionary.Dictionary.WordFound BestWord = null;
            Board.Board GameBoard = GameModel.GetBoard();
            Dictionary.Dictionary GameDictionary = GameModel.GetDictionary();

            int CenterIndex = GameBoard.GetBoardSide() % 2 == 0 ? GameBoard.GetBoardSide() / 2 : GameBoard.GetBoardSide() / 2;
            Container CenterRow = GameBoard.FindRow(CenterIndex);

            Dictionary.Dictionary.HeldCharacters HC = new Dictionary.Dictionary.HeldCharacters(GameDictionary.GetDictionaryEncoding());
            HC.Add(Rack.GetTileString());
            Dictionary.Dictionary.AlreadySetLetters ASL = new Dictionary.Dictionary.AlreadySetLetters();
            Dictionary.Dictionary.WordsFound WordsFound = GameDictionary.Find(ASL, HC);

            for(int i = CenterIndex - Configuration.MaxLetterNumber; i <= CenterIndex; ++i)
            {
                Cell TempCell = CenterRow.Get(i);

                foreach(Dictionary.Dictionary.WordFound TempWord in WordsFound)
                {
                    if(TempWord.GetWord().Length > CenterIndex - i)
                    {
                        GameModel.PutTiles(CenterRow, TempCell.GetXColumnCoordinate(), TempWord, Rack);

                        int Result = GameModel.CountWord(CenterRow, TempCell.GetXColumnCoordinate());
                        if(Result > BestResult)
                        {
                            BestResult = Result;
                            BestStartIndex = TempCell.GetXColumnCoordinate();
                            BestWord = TempWord;
                        }

                        GameModel.RemoveTiles(CenterRow, TempCell.GetXColumnCoordinate(), TempWord.GetWord().Length, Rack);
                    }
                }
            }

            if(BestWord == null || BestWord.GetWord().Length < 2) //Jesli nie da sie ulozyc zadnego slowa
            {
                ReplaceTile(null);
                return;
            }

            PointsNumber += BestResult;
            GameModel.PutAndSetTiles(CenterRow, BestStartIndex, BestWord, Rack);
            GameBoard.SetEmpty(false);
            GetNewTiles();
        }
コード例 #2
0
ファイル: HumanPlayer.cs プロジェクト: peku33/ScrabbleSolver
        /// <summary>
        /// Metoda dostaje w argumencie wywolania informacje o wszystkich polach na planszy. Jej zadaniem jest odfiltrowanie nowowstawionych kostek, sprawdzenie czy kostki tworza poprawne
        /// slowo i czy zostaly ulozone zgodnie z zasadami gry, a nastepnie dodanie punktow graczowi i wylosowanie dla niego nowych kostek.
        /// </summary>
        /// <param name="MoveEvent"></param>
        /// <returns></returns>
        public override bool MakeMove(PutWordEvent MoveEvent)
        {
            List<Cell> Cells;

            if(MoveEvent != null)
            {
                Cells = MoveEvent.GetBoardCells();
            }
            else
            {
                return false;
            }

            Tuple<List<Cell>, bool> newCellsInfo = GameModel.CheckAndGetNewCells(Cells);
            if(newCellsInfo == null)
            {
                return false;
            }
            if(newCellsInfo.Item1.Count == 0) // Gracz pasuje
            {
                Pass();
                return true;
            }

            Cells = newCellsInfo.Item1;
            bool Vertical = newCellsInfo.Item2;

            if(GameModel.GetBoard().IsEmpty() && Cells.Count != 0) //Jesli pierwszy ruch to sprawdzamy czy slowo jest w srodkowym rzedzie lub kolumnie
            {
                int MiddleCoordinate = GameModel.GetBoard().GetBoardSide() / 2;
                bool MiddleField = false;

                if(Vertical)
                {
                    foreach(Cell TempCell in Cells)
                    {
                        if(TempCell.GetXColumnCoordinate() != MiddleCoordinate)
                        {
                            GameModel.RemoveTiles(Cells);
                            return false;
                        }
                        if(TempCell.GetYRowCoordinate() == MiddleCoordinate)
                        {
                            MiddleField = true;
                        }
                    }
                }
                else
                {
                    foreach(Cell TempCell in Cells)
                    {
                        if(TempCell.GetYRowCoordinate() != MiddleCoordinate)
                        {
                            GameModel.RemoveTiles(Cells);
                            return false;
                        }
                        if(TempCell.GetXColumnCoordinate() == MiddleCoordinate)
                        {
                            MiddleField = true;
                        }
                    }
                }

                if(!MiddleField)
                {
                    GameModel.RemoveTiles(Cells);
                    return false;
                }
            }

            String NewWord;
            int StartIndex;
            Cell StartCell;

            GameModel.PutTiles(Cells);

            if(Vertical)
            {
                NewWord = GameModel.GetWord(GameModel.GetBoard().FindColumn(Cells[0]), Cells[0].GetYRowCoordinate(), Vertical);

                if(NewWord.Length == 1)
                {
                    Vertical = !Vertical;
                    NewWord = GameModel.GetWord(GameModel.GetBoard().FindRow(Cells[0]), Cells[0].GetXColumnCoordinate(), Vertical);
                    StartIndex = GameModel.GetWordInfo(GameModel.GetBoard().FindRow(Cells[0]), Cells[0].GetXColumnCoordinate()).Item2;
                    StartCell = GameModel.GetBoard().GetCell(StartIndex, Cells[0].GetYRowCoordinate());
                }
                else
                {
                    StartIndex = GameModel.GetWordInfo(GameModel.GetBoard().FindColumn(Cells[0]), Cells[0].GetYRowCoordinate()).Item2;
                    StartCell = GameModel.GetBoard().GetCell(Cells[0].GetXColumnCoordinate(), StartIndex);
                }
            }
            else
            {
                NewWord = GameModel.GetWord(GameModel.GetBoard().FindRow(Cells[0]), Cells[0].GetXColumnCoordinate(), Vertical);

                if(NewWord.Length == 1)
                {
                    Vertical = !Vertical;
                    NewWord = GameModel.GetWord(GameModel.GetBoard().FindColumn(Cells[0]), Cells[0].GetYRowCoordinate(), Vertical);
                    StartIndex = GameModel.GetWordInfo(GameModel.GetBoard().FindColumn(Cells[0]), Cells[0].GetYRowCoordinate()).Item2;
                    StartCell = GameModel.GetBoard().GetCell(Cells[0].GetXColumnCoordinate(), StartIndex);
                }
                else
                {
                    StartIndex = GameModel.GetWordInfo(GameModel.GetBoard().FindRow(Cells[0]), Cells[0].GetXColumnCoordinate()).Item2;
                    StartCell = GameModel.GetBoard().GetCell(StartIndex, Cells[0].GetYRowCoordinate());
                }
            }

            if(!GameModel.GetDictionary().Exists(NewWord) || !GameModel.IsMoveCorrect(NewWord, StartCell, Vertical)
                || (!GameModel.GetBoard().IsEmpty() && !IsWordPutCorrect(StartCell, Vertical, NewWord.Length))) //Jesli slowo nie istnieje albo jest wstawione w niepoprawne miejsce albo jego ulozenie powoduje ulozenie niepoprawnych slow
            {
                GameModel.RemoveTiles(Cells);
                return false;
            }

            PointsNumber += GameModel.CountPoints(NewWord, StartCell, Vertical);
            GameModel.SetVisited(Cells);

            Rack.Clear();
            Rack.AddRange(MoveEvent.GetPlayerTiles()); //Aktualizacja tabliczki
            GetNewTiles();
            GameModel.GetBoard().SetEmpty(false);
            return true;
        }
コード例 #3
0
ファイル: HumanPlayer.cs プロジェクト: peku33/ScrabbleSolver
 public override void MakeFirstMove(PutWordEvent MoveEvent)
 {
 }
コード例 #4
0
ファイル: AIPlayer.cs プロジェクト: peku33/ScrabbleSolver
        /// <summary>
        /// Procedura wykonywania ruchu przez algorytm gracza komputerowego. Dla kazdego pola, algorytm sprawdza czy można zgodnie z zasadami gry wstawić słowo w taki sposób, że pierwsza jego litera
        /// znajdować będzie się na rozpatrywanym polu. Następnie algorytm wyszukuje najlepiej punktowane słowo i zapisuje je (a także zapisuje informacje o tym, gdzie słowo powinno zostać
        /// umieszczone). Po wykonaniu procedury dla wszystkich pól, algorytm wstawia najlepsze znalezione słowo. Jeśli gracz nie ma możliwości wstawienia słowa w żadne miejsce, wymienia losową kostkę lub 
        /// ustawia flage informujaca ze nie jest w stanie wykonac juz ruchu jesli zestaw kostek jest pusty.
        /// </summary>
        public override bool MakeMove(PutWordEvent MoveEvent)
        {
            int BestResult = 0;
            int BestStartIndex = 0;
            Dictionary.Dictionary.WordFound BestWord = null;
            Container BestContainer = null;

            Board.Board GameBoard = GameModel.GetBoard();
            Dictionary.Dictionary GameDictionary = GameModel.GetDictionary();
            Dictionary.Dictionary.HeldCharacters HC = new Dictionary.Dictionary.HeldCharacters(GameDictionary.GetDictionaryEncoding());
            HC.Add(Rack.GetTileString());

            int MinLength = 0;
            int MaxLength = GameBoard.GetBoardSide();

            foreach(Row TempRow in GameBoard.GetRows())
            {
                for(int i = 0; i < GameBoard.GetBoardSide() - 1; ++i)
                {
                    Cell TempCell = TempRow.Get(i);

                    if(GameModel.IsPositionCorrect(TempCell, false)) //Czy da sie ustawic slowo zaczynajac od tego pola tak, aby bylo to zgodne z regulami gry
                    {
                        MaxLength = GameBoard.GetBoardSide() - TempCell.GetXColumnCoordinate();
                        MinLength = GameModel.GetMinLength(TempCell, false);

                        Dictionary.Dictionary.AlreadySetLetters ASL = new Dictionary.Dictionary.AlreadySetLetters();
                        GameModel.FillAlreadySetLetters(ASL, TempRow, TempCell.GetXColumnCoordinate());

                        Dictionary.Dictionary.WordsFound WordsFound = GameDictionary.Find(ASL, HC);
                        WordsFound = GameModel.FilterWords(WordsFound, MinLength, MaxLength);

                        foreach(Dictionary.Dictionary.WordFound TempWord in WordsFound)
                        {
                            if(GameModel.IsMoveCorrect(TempWord.GetWord(), TempCell, false)) //Czy ustawienie tego slowa nie spowoduje kolizji w drugiej plaszczyznie
                            {
                                GameModel.PutTiles(TempRow, TempCell.GetXColumnCoordinate(), TempWord, Rack);

                                int Result = GameModel.CountPoints(TempWord.GetWord(), TempCell, false);
                                if(Result > BestResult)
                                {
                                    BestResult = Result;
                                    BestStartIndex = TempCell.GetXColumnCoordinate();
                                    BestWord = TempWord;
                                    BestContainer = TempRow;
                                }

                                GameModel.RemoveTiles(TempRow, TempCell.GetXColumnCoordinate(), TempWord.GetWord().Length, Rack);
                            }
                        }
                    }
                }
            }
            foreach(Column TempColumn in GameBoard.GetColumns())
            {
                for(int i = 0; i < GameBoard.GetBoardSide() - 1; ++i)
                {
                    Cell TempCell = TempColumn.Get(i);

                    if(GameModel.IsPositionCorrect(TempCell, true))
                    {
                        MaxLength = GameBoard.GetBoardSide() - TempCell.GetYRowCoordinate();
                        MinLength = GameModel.GetMinLength(TempCell, true);

                        Dictionary.Dictionary.AlreadySetLetters ASL = new Dictionary.Dictionary.AlreadySetLetters();
                        GameModel.FillAlreadySetLetters(ASL, TempColumn, TempCell.GetYRowCoordinate());

                        Dictionary.Dictionary.WordsFound WordsFound = GameDictionary.Find(ASL, HC);
                        WordsFound = GameModel.FilterWords(WordsFound, MinLength, MaxLength);

                        foreach(Dictionary.Dictionary.WordFound TempWord in WordsFound)
                        {
                            if(GameModel.IsMoveCorrect(TempWord.GetWord(), TempCell, true))
                            {
                                GameModel.PutTiles(TempColumn, TempCell.GetYRowCoordinate(), TempWord, Rack);

                                int Result = GameModel.CountPoints(TempWord.GetWord(), TempCell, true);
                                if(Result > BestResult)
                                {
                                    BestResult = Result;
                                    BestStartIndex = TempCell.GetYRowCoordinate();
                                    BestWord = TempWord;
                                    BestContainer = TempColumn;
                                }

                                GameModel.RemoveTiles(TempColumn, TempCell.GetYRowCoordinate(), TempWord.GetWord().Length, Rack);
                            }
                        }
                    }
                }
            }

            if(BestWord == null || BestWord.GetWord().Length < 2) //Jesli nie da sie ulozyc zadnego slowa
            {
                if(GameModel.GetTilesSet().IsEmpty()) //Jesli nie ma juz z czego dobierac
                {
                    Pass();
                }
                else
                {
                    ReplaceTile(null);
                    GameModel.ResetPassCounter();
                }
                return true;
            }
            PointsNumber += BestResult;
            GameModel.PutAndSetTiles(BestContainer, BestStartIndex, BestWord, Rack);
            GetNewTiles();
            return true;
        }
コード例 #5
0
ファイル: Player.cs プロジェクト: peku33/ScrabbleSolver
 /// <summary>
 /// Wykonanie pierwszego ruchu
 /// </summary>
 public abstract void MakeFirstMove(PutWordEvent MoveEvent);
コード例 #6
0
ファイル: Player.cs プロジェクト: peku33/ScrabbleSolver
 /// <summary>
 /// Wykonanie ruchu. Zwraca true jesli ruch zostanie wykonany poprawnie 
 /// </summary>
 public abstract bool MakeMove(PutWordEvent MoveEvent);