package net.hoo2.auth.labyrinth; /** * @brief * This class represents the game's player */ class Player { /** @name Contructors */ /** @{ */ /** * Create a new player and put him at the row-column coordinates * @param id The id of the player * @param name The name of the player * @param board Reference to the board of the game */ Player(int id, String name, Board board, int row, int column) { this.playerId = id; this.name = name; this.board = board; this.score = 0; this.x = column; this.y = row; } /** * Create a new player and put him at the row-column coordinates * @param id The id of the player * @param name The name of the player * @param board Reference to the board of the game */ Player(int id, String name, Board board, int tileId) { this.playerId = id; this.name = name; this.board = board; this.score = 0; this.x = Position.toCol(tileId); this.y = Position.toRow(tileId); } /** @} */ /** @name Player main application interface */ /** @{ */ /** * Player's move. * * A player first throw a dice to get a random direction. Then checks if the direction * is walkable. If it is, then goes to that tile, pick up a possible supply on the tile * and update player's data. * * @param id The id of the starting tile. * @return An array containing player's final position and possible supply of that position. * The array format is: * */ int[] move(int id) { // Init return array with the current data int[] ret = {id, Position.toRow(id), Position.toCol(id), Const.noSupply}; int diceDirection = board.dice(); // throw the dice if (board.isWalkable(id, diceDirection)) { // The result is walkable // Get next tile Position next = new Position(Position.toRow(id), Position.toCol(id), diceDirection); ret[0] = next.getId(); // Update player's and return data ret[1] = y = next.getRow(); ret[2] = x = next.getCol(); if ((ret[3] = board.tryPickSupply(next.getId())) != Const.noSupply) { ++score; // keep score System.out.println(name + ":\t*Found a supply. [score: " + score + "]"); } } else System.out.println(name + ":\t*Can not move."); return ret; } int playerTileId() { return Position.toID(y, x); } int playerRow() { return y; } int playerCol() { return x; } /** @} */ /** * @name Accessor/Mutator interface * @note * Please consider not to use mutator interface. Its the abstraction killer :( * We have added a bit of logic however, in order to make it a bit more safe. */ /** @{ */ int getPlayerId () { return playerId; } String getName() { return name; } Board getBoard () { return board; } int getScore () { return score; } int getX() { return x; } int getY() { return y; } void setPlayerId(int id) { playerId = id; } void setName(String name) { this.name = name; } void setBoard (Board board){ this.board = board; } void setScore(int score) { this.score = score; } void setX(int x) { assert (x >= 0 && x< Session.boardSize) : "X(column) coordinate must be in the range [0, Session.boardSize)"; this.x = x; } void setY(int y) { assert (y >= 0 && y< Session.boardSize) : "Y(row) coordinate must be in the range [0, Session.boardSize)"; this.y = y; } /** @} */ /** @name Class data */ /** @{ */ private int playerId; /**< The unique identifier of the player */ private String name; /**< The name of the player */ private Board board; /**< Reference to the session's boards */ private int score; /**< The current score of the player */ private int x; /**< The column coordinate of the player on the board */ private int y; /**< The row coordinate of the player on the board */ /** @} */ }