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