Example #1
0
        private static string MoveToString(DecisionMaker.Move move)
        {
            string wd        = move.Word;
            string squareOne = move.FirstLetterPos.column + move.FirstLetterPos.row.ToString();
            string squareTwo = move.LastLetterPos.column + move.LastLetterPos.row.ToString();

            return($"{wd} {squareOne} {squareTwo}".ToLower());
        }
Example #2
0
        private static DecisionMaker.Move ParseMove(string input)
        {
            List <string> parts = input.Split(' ').ToList();

            string firstPosNumber  = Regex.Match(parts[1], @"\d+").Value;
            string secondPosNumber = Regex.Match(parts[2], @"\d+").Value;

            var firstPos = (int.Parse(firstPosNumber), parts[1].Replace(firstPosNumber, "").ToCharArray()[0]);
            var lastPos  = (int.Parse(secondPosNumber), parts[2].Replace(secondPosNumber, "").ToCharArray()[0]);

            //The squares should probably be validated... meh.

            var move = new DecisionMaker.Move(parts[0], firstPos, lastPos);

            return(move);
        }
Example #3
0
        public static void Load()
        {
            using (Stream stream = new FileStream("save.sav", FileMode.Open)) {
                using (StreamReader reader = new StreamReader(stream)) {
                    Write("Loading letters... ", ConsoleColor.Red);
                    //Read all 7 chars, even if they are spaces. We can remove those after.
                    for (int i = 0; i < 7; i++)
                    {
                        Letters.Add((char)reader.Read());
                    }
                    Letters.RemoveAll(ch => ch == ' ');
                    Write("Done!", ConsoleColor.DarkCyan);
                    Console.WriteLine();

                    Write("Loading moves (1/2)... ", ConsoleColor.Red);
                    while (true)
                    {
                        var  read = new List <char>();
                        char ch;

                        StringBuilder wdB = new StringBuilder();
                        while (char.IsLetter(ch = (char)reader.Read()))
                        {
                            wdB.Append(ch);
                            read.Add(ch);
                        }

                        if (ch == '/')
                        {
                            break;
                        }

                        StringBuilder idxB = new StringBuilder();
                        while (char.IsDigit(ch = (char)reader.Read()))
                        {
                            idxB.Append(ch);
                            read.Add(ch);
                        }
                        var chs = idxB.ToString().ToCharArray();
                        int.TryParse(string.Join("", chs.Take(2)), out int idx1);
                        int.TryParse(string.Join("", chs.Skip(2).Take(2)), out int idx2);

                        var move = new DecisionMaker.Move(wdB.ToString(),
                                                          Board.Squares.Keys.ToArray()[idx1],
                                                          Board.Squares.Keys.ToArray()[idx2]);
                        OwnMoves.Add(move);
                        if (ch == '/')
                        {
                            break;
                        }
                        if (read.FastContains('/'))
                        {
                            break;
                        }
                    }
                    Write("Done!", ConsoleColor.DarkCyan);

                    Console.WriteLine();
                    Write("Loading moves (2/2)... ", ConsoleColor.Red);
                    while (true)
                    {
                        var  read = new List <char>();
                        char ch;

                        StringBuilder wdB = new StringBuilder();
                        while (char.IsLetter(ch = (char)reader.Read()))
                        {
                            wdB.Append(ch);
                            read.Add(ch);
                        }

                        if (ch == '/')
                        {
                            break;
                        }

                        StringBuilder idxB = new StringBuilder();
                        while (char.IsDigit(ch = (char)reader.Read()))
                        {
                            idxB.Append(ch);
                            read.Add(ch);
                        }
                        var chs = idxB.ToString().ToCharArray();
                        int.TryParse(string.Join("", chs.Take(2)), out int idx1);
                        int.TryParse(string.Join("", chs.Skip(2).Take(2)), out int idx2);

                        var move = new DecisionMaker.Move(wdB.ToString(),
                                                          Board.Squares.Keys.ToArray()[idx1],
                                                          Board.Squares.Keys.ToArray()[idx2]);
                        OpponentMoves.Add(move);
                        if (ch == '/')
                        {
                            break;
                        }
                        if (read.FastContains('/'))
                        {
                            break;
                        }
                    }
                    Write("Done!", ConsoleColor.DarkCyan);
                    Console.WriteLine();

                    Write("Loading board... ", ConsoleColor.Red);
                    string rows = "ABCDEFGHIJKLMNO";
                    for (int i = 0; i < 15; i++)
                    {
                        var squares = Board.GetRow(rows[i]);
                        for (int j = 0; j < squares.Count; j++)
                        {
                            var  square = squares[j];
                            char ch;
                            if ((ch = (char)reader.Read()) != ' ')
                            {
                                Board.SetSquareContents(square, ch);
                            }
                        }
                    }

                    Write("Done!", ConsoleColor.DarkCyan);
                    Console.WriteLine();
                }
            }
        }
Example #4
0
        public static void Run()
        {
            LoadEverything();
            Console.Write("How many players are there? (Not including me) ");

            int.TryParse(Console.ReadLine(), out int peoplePlaying);
            if (peoplePlaying == 0)
            {
                return;
            }

            GetLetters();

            while (true)
            {
                try {
                    for (int i = 0; i < peoplePlaying; i++)
                    {
                        var opponentMove = GetMoveInput();
                        if (!ScrabbleDictionary.Words.Contains(opponentMove.Word))
                        {
                            PerformColor(ConsoleColor.DarkRed, () => {
                                Console.WriteLine($"{opponentMove.Word} is not a valid Scrabble word!");
                            });
                            i--;
                        }
                        else
                        {
                            Game.Board.ExecuteMove(opponentMove, Board.MoveType.Opponent);
                            PrintBoard();
                        }
                    }

                    DecisionMaker.Move selfMove = null;
                    int considered = 0;
                    int time       = Time(() => {
                        selfMove = Game.Brain.BestMove(out considered);
                    });

                    PerformColor(ConsoleColor.Magenta, () => {
                        Console.WriteLine($"Considered {considered} moves in {time} seconds.");
                    });

                    Console.CursorVisible = true;

                    if (selfMove.Equals(DecisionMaker.Move.Err))
                    {
                        continue;
                    }
                    Game.Board.ExecuteMove(selfMove, Board.MoveType.Self);

                    PrintBoard();
                    Console.WriteLine(MoveToString(selfMove));

                    Console.Write($"{selfMove.Word.ToLower()}: ");
                    PerformColor(ConsoleColor.DarkBlue, () => {
                        Console.Write($"'{ScrabbleDictionary.Definitions[selfMove.Word].Trim(null)}'");
                    });
                    Console.WriteLine();
                    GetLetters();
                } catch (Exception e) {
                    Console.WriteLine($"DEBUG: Encountered error: {e}");
                }
            }
        }