package com.esir.sr.sweetsnake.game.engine; import java.util.LinkedHashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.esir.sr.sweetsnake.api.IComponent; import com.esir.sr.sweetsnake.constants.GameConstants; import com.esir.sr.sweetsnake.enumeration.MoveDirection; import com.esir.sr.sweetsnake.game.board.GameBoard; import com.esir.sr.sweetsnake.game.board.GameBoardGenerator; import com.esir.sr.sweetsnake.game.component.Snake; import com.esir.sr.sweetsnake.session.GameSession; import com.esir.sr.sweetsnake.session.Player; /** * * @author Herminaƫl Rougier * @author Damien Jouanno * */ public class GameEngine { /********************************************************************************************** * [BLOCK] STATIC FIELDS **********************************************************************************************/ /** The logger */ private static final Logger log = LoggerFactory.getLogger(GameEngine.class); /********************************************************************************************** * [BLOCK] FIELDS **********************************************************************************************/ /** The game session */ private final GameSession session; /** The game board */ private final GameBoard gameBoard; /** The players' snakes mapping */ private final Map<Player, IComponent> playersMap; /********************************************************************************************** * [BLOCK] CONSTRUCTOR **********************************************************************************************/ /** * * @param _board * @param _playersMap */ public GameEngine(final GameSession _session) { log.info("Initializing a new Game Engine for session {}", _session.getId()); session = _session; gameBoard = GameBoardGenerator.generateBoard(GameConstants.GRID_SIZE, GameConstants.GRID_SIZE, GameConstants.NUMBER_OF_SWEETS); playersMap = new LinkedHashMap<Player, IComponent>(); int i = 1; for (final Player player : _session.getPlayers()) { final Snake snake = new Snake(); player.setSnakeId(snake.getId()); final PlayerPosition position = new PlayerPosition(gameBoard.getWidth(), gameBoard.getHeight(), i); snake.setXYPos(position.getXPos(), position.getYPos()); playersMap.put(player, snake); gameBoard.addComponent(snake); i++; } } /********************************************************************************************** * [BLOCK] PUBLIC METHODS **********************************************************************************************/ /** * * @param direction * @param player */ public void moveSnake(final MoveDirection direction, final Player player) { final IComponent snake = playersMap.get(player); final int x = (snake.getXPos() + direction.getValue()[0] + GameConstants.GRID_SIZE) % GameConstants.GRID_SIZE; final int y = (snake.getYPos() + direction.getValue()[1] + GameConstants.GRID_SIZE) % GameConstants.GRID_SIZE; final IComponent currentComponent = gameBoard.getComponent(x, y); if (currentComponent == null) { gameBoard.moveComponent(snake, direction); } else { switch (currentComponent.getType()) { // other player snake cell case SNAKE: // do nothing break; // sweet cell case SWEET: gameBoard.removeComponent(currentComponent); gameBoard.moveComponent(snake, direction); player.setScore(player.getScore() + GameConstants.SWEET_SCORE_VALUE); break; } } if (gameBoard.getNbSweets() == 0) { session.stopGame(); } } /** * * @param player */ public void removeSnake(final Player player) { final IComponent snake = playersMap.get(player); gameBoard.removeComponent(snake); player.setSnakeId(null); } /********************************************************************************************** * [BLOCK] GETTERS **********************************************************************************************/ /** * * @return */ public GameBoard getGameBoard() { return gameBoard; } }