Esempio n. 1
0
        //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);
        }
Esempio n. 2
0
        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;
                            }
            }
        }
Esempio n. 3
0
        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;
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        //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);
        }