//bool not removed public (string, bool) CommandSorter(string command) { var playerInput = new PlayerInput(); var game = GameRunner.Instance(); var commandStatusCode = command.Split(' ')[0]; if (command == "quit") { var returnString = "270 Bye Bye"; return(returnString, false); } if (command == "help") { var returnString = "Available commands : 1. Fire <coordinates> <message> 2. Quit"; return(returnString, false); } if (command == "start") { var returnString = StartGame(game.player1.PlayerName, game.player2.PlayerName); return(returnString, true); } if (command.Split(' ')[0].ToLower() == "fire") { var fireCoordinates = GetPositionFromFireCommand(command); try { var coordinates = command.Split(' ')[1].ToLower(); var hitMessage = playerInput.ReceiveHit(fireCoordinates.Item1, fireCoordinates.Item2, game.player1, false, false); if (game.player1.CheckIfAllShipsSunk()) { hitMessage.Item2 = $"260 {game.player2.PlayerName} wins!"; } return(hitMessage.Item2, hitMessage.Item1); } catch (Exception e) { return("500 Syntax error", false); } } return("500 Syntax error", false); }
public void StartClient(int portNumber, string hostAddress, string userName, Player.Player hostPlayer, Player.Player clientPlayer) //kanske ska vara static { var gameCommandHandler = new GameCommandHandler(); var game = GameRunner.Instance(); var gameStatus = ("", true); StartListen(portNumber); var gameFlowHelper = new GameFlowHelper(); var gameOver = false; while (!gameOver) { Console.WriteLine("Waiting to connect"); //var myTurn = false; //var hostUsername = ""; //var responseToServer = ""; //var myResponse = ""; using (var client = new TcpClient(hostAddress, portNumber)) using (var networkStream = client.GetStream()) using (StreamReader reader = new StreamReader(networkStream, Encoding.UTF8)) using (var writer = new StreamWriter(networkStream, Encoding.UTF8) { AutoFlush = true }) { if (gameStatus.Item1 == "270") { gameOver = true; client.GetStream().Close(); networkStream.Close(); break; } //Console.WriteLine("Started A Loop on Client"); var firstReplyIsCorrect = false; while (client.Connected) { var responseFromServer = ""; while (!firstReplyIsCorrect) { var firstReply = ""; //Console.WriteLine($"Connected to host at ip: {client.Client.RemoteEndPoint}"); Console.WriteLine(reader.ReadLine()); Console.WriteLine("Start the game by writing HELLO"); var firstCommand = Console.ReadLine() + " " + userName; writer.WriteLine(firstCommand); firstReply = reader.ReadLine(); if (firstReply.Split(' ')[0] == "220") { Console.WriteLine($"{firstReply}"); game.player2.PlayerName = firstReply.Split(' ')[1]; firstReplyIsCorrect = true; Console.WriteLine("Enter START to start: "); var startCommand = Console.ReadLine(); if (startCommand.ToUpper() == "QUIT") { startCommand = "270 Connection closed"; gameOver = true; writer.WriteLine(startCommand); break; } // Skicka text writer.WriteLine(startCommand); } if (!client.Connected) { break; } responseFromServer = reader.ReadLine(); Console.WriteLine($"Svar: {responseFromServer}"); if (string.Equals(responseFromServer.Split(' ')[0], "221", StringComparison.InvariantCultureIgnoreCase)) { gameFlowHelper.StillMyTurn = true; } Console.WriteLine(responseFromServer); } // Läs minst en rad test do { if (gameFlowHelper.StillMyTurn) { Console.WriteLine("Your turn, enter command:"); var myCommand = Console.ReadLine(); writer.WriteLine(myCommand); responseFromServer = reader.ReadLine(); gameFlowHelper.Last3Responses.Add(responseFromServer); //add last response if (gameFlowHelper.CheckForRepeatedErrors()) { writer.WriteLine("QUIT"); client.Close(); gameOver = true; break; } gameFlowHelper.ResponsesAndCommands.Add(myCommand); gameFlowHelper.ResponsesAndCommands.Add(responseFromServer); //gameFlowHelper.Last3Responses.Add(responseFromServer); gameStatus = gameCommandHandler.ResponseSorter(responseFromServer, myCommand); if (gameStatus.Item1 == "260") { Console.WriteLine(responseFromServer); writer.WriteLine("QUIT"); gameOver = true; client.Close(); break; } if (gameStatus.Item1 == "270") { writer.WriteLine("QUIT"); gameOver = true; client.Close(); break; } //writer.WriteLine(myResponse); //need checks to see if turn is over or need to wait for next server turn (e.g. faulty input) if (!gameStatus.Item2) { gameFlowHelper.StillMyTurn = false; } } else { Console.WriteLine("Waiting for opponent move..."); responseFromServer = reader.ReadLine(); gameStatus = gameCommandHandler.CommandSorter(responseFromServer.ToLower()); //here we need gamestatus to know if their turn is over or if we need to continue our turn (loop around this) writer.WriteLine(gameStatus.Item1); //need checks to see if their turn is over or need to wait for next server turn (e.g. faulty input) gameFlowHelper.ResponsesAndCommands.Add(responseFromServer); gameFlowHelper.ResponsesAndCommands.Add(gameStatus.Item1); gameFlowHelper.Last3Responses.Add(gameStatus.Item1); if (gameStatus.Item1.Contains("260")) { writer.WriteLine("QUIT"); gameOver = true; client.Close(); break; } if (gameFlowHelper.CheckForRepeatedErrors()) { writer.WriteLine("QUIT"); gameOver = true; client.Close(); break; } if (gameStatus.Item2) { gameFlowHelper.StillMyTurn = true; } } game.PrintBothGameBoards(); gameFlowHelper.PrintLast3Responses(); } while (networkStream.DataAvailable); //gameOver = true; //client.Dispose(); } gameOver = true; break; } } }
public void StartServer(int port, string hostUsername) { var game = GameRunner.Instance(); var gameCommandHandler = new GameCommandHandler(); StartListen(port); //var myTurn = false; var responseFromClient = ""; var gameFlowHelper = new GameFlowHelper(); var gameStatus = ("", true); var gameOver = false; while (!gameOver) { Console.WriteLine("Waiting for player to connect..."); using (var client = listener.AcceptTcpClient()) using (var networkStream = client.GetStream()) using (StreamReader reader = new StreamReader(networkStream, Encoding.UTF8)) using (var writer = new StreamWriter(networkStream, Encoding.UTF8) { AutoFlush = true }) { if (gameStatus.Item1 == "270") { gameOver = true; client.GetStream().Close(); networkStream.Close(); break; } var firstCommandFromClientIsHello = false; var clientUserName = ""; var firstCommand = ""; while (client.Connected) { //Console.WriteLine($"Player has connected with ip: {client.Client.RemoteEndPoint}!"); //Console.WriteLine("Started A Loop on Server"); while (!firstCommandFromClientIsHello) { writer.WriteLine("210 BATTLESHIP/1.0"); firstCommand = reader.ReadLine(); if (firstCommand.ToUpper() == "QUIT") { firstCommand = "270 Connection closed"; writer.WriteLine(firstCommand); gameOver = true; break; } if (!firstCommand.ToLower().Contains("hello") && !firstCommand.ToLower().Contains("helo")) { writer.WriteLine("500 Syntax Error"); } if (firstCommand.ToLower().Contains("helo") || firstCommand.ToLower().Contains("hello")) { clientUserName = firstCommand.Split(' ')[1]; game.player2.PlayerName = clientUserName; firstCommandFromClientIsHello = true; writer.WriteLine("220 " + hostUsername); } var command = reader.ReadLine().ToLower(); Console.WriteLine($"Recieved: {command}"); var responseToSend = gameCommandHandler.CommandSorter(command.ToLower()).Item1; if (string.Equals(responseToSend.Split(' ')[0], "222", StringComparison.InvariantCultureIgnoreCase)) { gameFlowHelper.StillMyTurn = true; } writer.WriteLine(responseToSend); } var myCommand = ""; if (gameFlowHelper.StillMyTurn) { Console.WriteLine("Your turn, enter command:"); myCommand = Console.ReadLine(); writer.WriteLine(myCommand); responseFromClient = reader.ReadLine(); gameFlowHelper.Last3Responses.Add(responseFromClient); //add last response gameFlowHelper.CheckForRepeatedErrors(); gameFlowHelper.ResponsesAndCommands.Add(myCommand); gameFlowHelper.ResponsesAndCommands.Add(responseFromClient); if (gameFlowHelper.CheckForRepeatedErrors()) { writer.WriteLine("270 Connection closed"); gameOver = true; break; } gameStatus = gameCommandHandler.ResponseSorter(responseFromClient, myCommand); if (gameStatus.Item1.Contains("260")) { writer.WriteLine("270 BYE BYE"); client.Dispose(); gameOver = true; break; } if (gameStatus.Item1 == "270") { break; } if (!gameStatus.Item2) { gameFlowHelper.StillMyTurn = false; } } else { Console.WriteLine("Waiting for opponent move..."); responseFromClient = reader.ReadLine(); gameStatus = gameCommandHandler.CommandSorter(responseFromClient.ToLower()); writer.WriteLine(gameStatus.Item1); gameFlowHelper.Last3Responses.Add(responseFromClient); gameFlowHelper.ResponsesAndCommands.Add(responseFromClient); gameFlowHelper.ResponsesAndCommands.Add(gameStatus.Item1); if (gameStatus.Item1.Contains("270")) { writer.WriteLine("270 BYE BYE"); client.Dispose(); gameOver = true; break; } if (gameStatus.Item1.Contains("260")) { writer.WriteLine("270 BYE BYE"); client.Dispose(); gameOver = true; break; } if (gameFlowHelper.CheckForRepeatedErrors()) { writer.WriteLine("270 Connection closed"); gameOver = true; networkStream.Close(); break; } if (gameStatus.Item2) { gameFlowHelper.StillMyTurn = true; } } game.PrintBothGameBoards(); gameFlowHelper.PrintLast3Responses(); } gameOver = true; client.Dispose(); break; } //gameOver = true; //break; } }
public (string, bool) ResponseSorter(string response, string coordinates) { var game = GameRunner.Instance(); var playerInput = new PlayerInput(); var commandStatusCode = response.Split(' ')[0]; if (commandStatusCode == "270") { return("270", false); } if (commandStatusCode == "260") { return("260", false); } if (coordinates.Split(' ').Length > 1) { coordinates = coordinates.Split(' ')[1]; } var gameStatus = ($"Your turn {game.player2.PlayerName}", true); var hitResponse = (false, ""); // TODO: to implement updating of opponent board if (!String.IsNullOrWhiteSpace(coordinates)) { if (int.TryParse(commandStatusCode, out int statusCode)) { try { var fireCoordinates = GetPositionFromFireCommand("fire " + coordinates); if (statusCode == 230) { hitResponse = playerInput.ReceiveHit(fireCoordinates.Item1, fireCoordinates.Item2, game.player2, false, false); } if (statusCode > 240 && statusCode < 250) { hitResponse = playerInput.ReceiveHit(fireCoordinates.Item1, fireCoordinates.Item2, game.player2, true, false); } if (statusCode > 250 && statusCode < 260) { hitResponse = playerInput.ReceiveHit(fireCoordinates.Item1, fireCoordinates.Item2, game.player2, true, true); } } catch (Exception e) { statusCode = 500; } gameStatus.Item2 = false; if (statusCode == 260) { gameStatus.Item2 = true; } if (statusCode == 500 || statusCode == 501 || hitResponse.Item2.Contains("501") || hitResponse.Item2.Contains("500")) { gameStatus.Item2 = true; } } } return(gameStatus); }
//public void SendMissile(Player playerToHit) //{ // //The advantage to using this when we send a message is that could make sure we never send faulty messages. However // //It does not help us to take care of incoming messages. // var letterAligner = new List<(int, string)>() { (1, "a"), (2, "b"), (3, "c"), (4, "d"), (5, "e"), (6, "f"), (7, "g"), (8, "h"), (9, "i"), (10, "j") }; // var inputCorrect = false; // while (!inputCorrect) // { // Console.WriteLine("Enter horizontal coordinate (A-J):"); // var inputXAxis = Console.ReadLine().ToLower(); // if (letterAligner.All(x => x.Item2 != inputXAxis)) // { // Console.WriteLine("Bad input, try again"); // continue; // } // Console.WriteLine($"Enter vertical coordinate (1-10)"); // if (!int.TryParse(Console.ReadLine(), out int inputYAxis)) // { // Console.WriteLine("Bad input, try again"); // continue; // } // if (inputYAxis > 10) // { // Console.WriteLine("Outside board parameters, try again"); // continue; // } // var selectedSquare = playerToHit.GameBoard.GetSquare(inputXAxis, inputYAxis, playerToHit); // selectedSquare.Hit = true; // inputCorrect = true; // } //} public (bool, string) ReceiveHit(string xAxis, int yAxis, Player player, bool responseHit, bool isSunk) { var letterAligner = new List <(int, string)>() { (1, "a"), (2, "b"), (3, "c"), (4, "d"), (5, "e"), (6, "f"), (7, "g"), (8, "h"), (9, "i"), (10, "j") }; if (letterAligner.All(x => x.Item2 != xAxis.ToLower()) || yAxis > 10 || yAxis < 1) { return(false, "500 Bad input"); } var hitShip = (true, "miss"); var selectedSquare = player.GameBoard.GetSquare(xAxis.ToLower(), yAxis, player); var shipOnSquare = selectedSquare.GetShipOnSquare(player); var game = GameRunner.Instance(); if (selectedSquare.Hit) { return(false, "501 Already Hit"); } if (responseHit) { //These fakeships could possibly be named after the response we get back from the server/client.... we do get the name, and //we could name the fakeships by those names, check if enough squares with that name have been sunk //e.g. 5 fakeships with the name carrier, and then change the status of those squares to sunk selectedSquare.HasShip = true; selectedSquare.Hit = true; var fakeShip = new Ship($"fakeShip{xAxis}{yAxis}", 1, "v"); fakeShip.OccupyingSquares.Add(selectedSquare); shipOnSquare = fakeShip; //Does this need to be shown? player.ShipList.Add(fakeShip); if (isSunk) { fakeShip.IsSunk = true; } hitShip = (true, "Hit was made"); //if we do the above solution then maybe this should be modified slightly to allow the workflow to continue past this } if (!responseHit && !isSunk) { selectedSquare.Hit = true; hitShip = (true, "230 Miss!"); } if (selectedSquare.HasShip && shipOnSquare != null && !responseHit) { selectedSquare.Hit = true; shipOnSquare.OccupyingSquares.SingleOrDefault(x => x.XAxis == selectedSquare.XAxis && x.YAxis == selectedSquare.YAxis).Hit = true; if (CheckIfBoatIsSunk(shipOnSquare)) { switch (shipOnSquare.ShipName) { case "Carrier": hitShip = (true, $"251 {game.player2.PlayerName} sunk {game.player1.PlayerName}'s Carrier"); break; case "Battleship": hitShip = (true, $"252 {game.player2.PlayerName} sunk {game.player1.PlayerName}'s Battleship"); break; case "Destroyer": hitShip = (true, $"253 {game.player2.PlayerName} sunk {game.player1.PlayerName}'s Destroyer"); break; case "Submarine": hitShip = (true, $"254 {game.player2.PlayerName} sunk {game.player1.PlayerName}'s Submarine"); break; case "Patrol Boat": hitShip = (true, $"255 {game.player2.PlayerName} sunk {game.player1.PlayerName}'s Patrol Boat"); break; default: hitShip = (true, "Something went wrong, couldn't find boat"); break; } return(hitShip); } switch (shipOnSquare.ShipName) { case "Carrier": hitShip = (true, $"241 {game.player2.PlayerName} hit {game.player1.PlayerName}'s Carrier"); break; case "Battleship": hitShip = (true, $"242 {game.player2.PlayerName} hit {game.player1.PlayerName}'s Battleship"); break; case "Destroyer": hitShip = (true, $"243 {game.player2.PlayerName} hit {game.player1.PlayerName}'s Destroyer"); break; case "Submarine": hitShip = (true, $"244 {game.player2.PlayerName} hit {game.player1.PlayerName}'s Submarine"); break; case "Patrol Boat": hitShip = (true, $"245 {game.player2.PlayerName} hit {game.player1.PlayerName}'s Patrol Boat"); break; default: hitShip = (true, "Something went wrong, couldn't find boat"); break; } } return(hitShip); }