/// <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; }
/// <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(); }