Пример #1
0
        public Tuple <int, int> HandleMoveRequest(int playerID, MessageProject.MovementDirection direction)
        {
            // Waiting from settings
            lock (gameState)
            {
                // If game hs not started, return invalid Y, X coords to client
                if (gameState.gameStarted == false)
                {
                    return(Tuple.Create(-1, -1));
                }
            }
            if (!CheckMovementBoardBoundaries(playerID, direction))
            {
                Console.WriteLine("Invalid move {0} from position: x:{1}, y:{2}", playersDictionary[playerID].posX, playersDictionary[playerID].posY);
            }
            // Cast message only on single class (final type decision)
            // Check direction of movement
            // Map player ID, extract his coords
            // Check if coords allow for locking (without checking if player inside goal cell)
            // Lock on cur field, movement direction field - requires prior check if move valid - board bounds, goal area
            // Assume direction correct! XML valid
            else
            {
                switch (direction)
                {
                case MessageProject.MovementDirection.left:
                    Console.WriteLine("Left switch");
                    MoveLeft(playerID);
                    // In general the result is not interesting. In either case - send new/old == current, coordinates
                    break;

                case MessageProject.MovementDirection.up:
                    Console.WriteLine("Top switch!");
                    MoveUp(playerID);
                    break;

                case MessageProject.MovementDirection.right:
                    Console.WriteLine("Right switch!");
                    MoveRight(playerID);
                    break;

                case MessageProject.MovementDirection.down:
                    Console.WriteLine("Down switch!");
                    MoveDown(playerID);
                    break;
                }
            }

            return(Tuple.Create(playersDictionary[playerID].posY, playersDictionary[playerID].posX));
        }
Пример #2
0
        // Board restrictions check (board size, team restrictions) - edge cases?

        private bool CheckMovementBoardBoundaries(int playerID, MessageProject.MovementDirection direction)
        {
            // note that board is numerated (0,0) in upper left corner, image coords!
            // Board width restriction
            // Team wise restriction
            // Dir: 1=left, 2=top, 3=right, 4=down
            Player player = playersDictionary[playerID];               // Refer to the player object

            if (direction.Equals(MessageProject.MovementDirection.up)) // move up
            {
                if (player.team.Equals(MessageProject.Team.blue))
                {
                    // First neg row is GAlen -1
                    if (player.posY <= settings.GoalLen)
                    {
                        Console.WriteLine("Move from Y: {0} to {1} forbidden. Red area starts", player.posY, player.posY - 1);
                        return(false);
                    }
                }
                else if (player.team.Equals(MessageProject.Team.red))
                {
                    // First neg row is -1
                    if (player.posY <= 0)
                    {
                        Console.WriteLine("Move from Y: {0} to {1} forbidden. Border end top.", player.posY, player.posY - 1);
                        return(false);
                    }
                }
            }
            else if (direction.Equals(MessageProject.MovementDirection.down)) // move down
            {
                if (player.team.Equals(MessageProject.Team.blue))
                {
                    // First neg row is 2*ga + ta
                    if (player.posY + 1 >= 2 * settings.GoalLen + settings.TaskLen)
                    {
                        Console.WriteLine("Move from Y: {0} to {1} forbidden. Board ends", player.posY, player.posY + 1);
                        return(false);
                    }
                }
                else if (player.team.Equals(MessageProject.Team.red))
                {
                    if (player.posY + 1 >= settings.GoalLen + settings.TaskLen)
                    {
                        Console.WriteLine("Move from Y: {0} to {1} forbidden. Blue area starts.", player.posY, player.posY + 1);
                        return(false);
                    }
                    // First neg row is GAlen - 1
                }
            }
            else if (direction.Equals(MessageProject.MovementDirection.left))
            {
                if (player.posX - 1 < 0)
                {
                    Console.WriteLine("Move from X: {0} forbidden. Board width left edge.", player.posX);
                    return(false);
                }
            }
            else if (direction.Equals(MessageProject.MovementDirection.right))
            {
                if (player.posX + 1 >= settings.BoardWidth)
                {
                    Console.WriteLine("Move from X: {0} forbidden. Board width right edge.", player.posX);
                    return(false);
                }
            }
            else
            {
                Console.WriteLine("Unknown move direction: {0}", direction);
                return(false);
            }

            return(true);
        }