Ejemplo n.º 1
0
        /// <summary> Sends the game complete message to the client and displays the game complete message </summary>
        /// <param name="message"></param>
        private void HandleGameWon(String message)
        {
            if (!Char.TryParse(message, out Char winner))
            {
                return;
            }

            if (_MessageService.Master)
            {
                _MessageService.SendPacket(new Packet(Command.GAME_WON.ToString(), MASTER_CHAR.ToString()));
                Packet packet = _MessageService.AwaitPacket();
                if (Enum.TryParse(packet.Command, out Command command))
                {
                    if (command == Command.PACKET_RECEIVED)
                    {
                        _MessageService.SendPacket(GameBoardAsPacket());
                    }
                }
            }
            else
            {
                _MessageService.SendPacket(new Packet(Command.PACKET_RECEIVED.ToString()));
                Packet packet = _MessageService.AwaitPacket();
                HandlePacket(packet);
            }

            DrawGameBoard();
            Console.WriteLine(winner == _PlayerChar ? $"Congratulations, you won!" : $"Unlucky, you lost!");

            if (message == MASTER_CHAR.ToString())
            {
                _HostScore++;
            }
            else
            {
                _ClientScore++;
            }

            _GameWon = true;
            _WaitingMoveConfirmationFromHost = false;
        }
Ejemplo n.º 2
0
        /// <summary> Main game loop </summary>
        public void Run()
        {
            if (!_Initialised)
            {
                Initialise();
            }

            _GameWon    = false;
            _Moving     = _MessageService.Master;
            _PlayerChar = _MessageService.Master ? MASTER_CHAR : SLAVE_CHAR;

            _Running = true;

            while (_Running)
            {
                DrawGameBoard();

                if (_MessageService.Master)
                {
                    if (_Moving)
                    {
                        Move move = GetMove();

                        _GameBoard[move.X, move.Y] = MASTER_CHAR;

                        if (IsGameWon(MASTER_CHAR))
                        {
                            HandleGameWon(MASTER_CHAR.ToString());
                        }
                        else
                        {
                            _MessageService.SendPacket(GameBoardAsPacket());
                            _Moving = false;
                        }
                    }
                    else
                    {
                        _WaitingValidMoveFromClient = true;

                        Console.WriteLine("Opponent is thinking....");

                        while (_WaitingValidMoveFromClient)
                        {
                            Packet moveRequest = _MessageService.AwaitPacket();
                            HandlePacket(moveRequest);
                        }

                        _Moving = true;
                    }
                }
                else
                {
                    if (_Moving)
                    {
                        _WaitingMoveConfirmationFromHost = true;

                        while (_WaitingMoveConfirmationFromHost)
                        {
                            DrawGameBoard();
                            Move move = GetMove();
                            _MessageService.SendPacket(new Packet(Command.MOVE_REQUEST.ToString(), move.ToString()));
                            Packet resp = _MessageService.AwaitPacket();
                            HandlePacket(resp);
                        }

                        _MessageService.SendPacket(new Packet(Command.PACKET_RECEIVED.ToString()));
                        _Moving = false;
                    }
                    else
                    {
                        Console.WriteLine($"Opponent is thinking...");

                        Packet packet = _MessageService.AwaitPacket();
                        HandlePacket(packet);

                        _Moving = true;
                    }
                }

                _Running = !_GameWon;
            }

            // Game is complete, ask for rematch
            if (_MessageService.Master)
            {
                String rematch = String.Empty;

                while (rematch.ToLower() != "y" && rematch.ToLower() != "n")
                {
                    Console.WriteLine($"Rematch?... y/n");
                    rematch = Console.ReadLine() ?? "";
                }

                if (rematch == "y")
                {
                    _MessageService.SendPacket(new Packet(Command.MESSAGE.ToString(), rematch));
                    Packet resp = _MessageService.AwaitPacket();

                    if (resp.Message == "rematch")
                    {
                        ResetGame();
                        Run();
                    }
                }
            }
            else
            {
                Console.WriteLine($"Awaiting rematch instruction from host...");
                Packet packet = _MessageService.AwaitPacket();
                if (packet.Message == "y")
                {
                    _MessageService.SendPacket(new Packet(Command.MESSAGE.ToString(), "rematch"));
                    ResetGame();
                    Run();
                }
                else
                {
                    Console.WriteLine($"Host declined a rematch...");
                }
            }

            // No rematch, game will end
            Console.WriteLine($"Game Exiting...");
            Console.ReadKey();
        }