187 lines
6.0 KiB
Java
187 lines
6.0 KiB
Java
/**
|
|
* @file Game.java
|
|
*
|
|
* @author
|
|
* Christos Choutouridis
|
|
* <cchoutou@ece.auth.gr>
|
|
* AEM:8997
|
|
*/
|
|
|
|
/**
|
|
* @mainpage A labyrinth board game
|
|
*
|
|
* @section intro_sec Introduction
|
|
*
|
|
* This is the introduction.
|
|
*
|
|
* etc...
|
|
*/
|
|
package host.labyrinth;
|
|
|
|
import java.util.Scanner;
|
|
|
|
/**
|
|
* Main application class. This class is the only public interface of
|
|
* the entire game.
|
|
*/
|
|
public class Game {
|
|
|
|
/**< An empty constructor */
|
|
Game() {
|
|
scan = new Scanner(System.in);
|
|
}
|
|
|
|
/** @name Player main application interface */
|
|
/** @{ */
|
|
/** Utility to get current round of the game */
|
|
int round () { return round; }
|
|
/** Utility to increase and get the increased round of the game */
|
|
int nextRound() { return ++round; }
|
|
|
|
/**
|
|
* Utility to hold the execution of the program waiting for user input.
|
|
* This is true only if the user passed the interactive flag.
|
|
*/
|
|
void waitUser () {
|
|
if(Session.interactive) {
|
|
System.out.println("Press enter to continue...");
|
|
scan.nextLine();
|
|
}
|
|
}
|
|
/** @{ */
|
|
|
|
/**
|
|
* @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 getRound() { return round; }
|
|
void setRound (int round) { this.round = round; }
|
|
/** @} */
|
|
|
|
/** @name Game's data */
|
|
/** @{ */
|
|
private int round; /**< Holds the round of the game */
|
|
private Scanner scan; /**< Input handle used in interactive mode */
|
|
/** @} */
|
|
|
|
/**
|
|
* Command line argument handler
|
|
*/
|
|
static boolean getArguments (String[] args) {
|
|
for (int i =0 ; i<args.length ; ++i) {
|
|
switch (args[i]) {
|
|
case "-b":
|
|
case "--board":
|
|
if (i+1 < args.length)
|
|
Session.boardSize = Integer.parseInt(args[++i]);
|
|
break;
|
|
|
|
case "-s":
|
|
case "--suplies":
|
|
if (i+1 < args.length)
|
|
Session.supplySize = Integer.parseInt(args[++i]);
|
|
break;
|
|
|
|
case "-r":
|
|
case "--rounds":
|
|
if (i+1 < args.length)
|
|
Session.maxRounds = Integer.parseInt(args[++i]);
|
|
break;
|
|
|
|
case "--norooms":
|
|
Session.loopGuard = true;
|
|
break;
|
|
|
|
case "-i":
|
|
case "--interactive":
|
|
Session.interactive = true;
|
|
break;
|
|
|
|
default:
|
|
case "-h":
|
|
case "--help":
|
|
System.out.println("Labyrinth Game");
|
|
System.out.println("");
|
|
System.out.println("Usage:");
|
|
System.out.println("labyrinth [-b|--board <Num>] [-s|--supplies <Num>] [-r|--rounds <Num>] [--norooms] [-i|--interactive]");
|
|
System.out.println("or");
|
|
System.out.println("labyrinth -h|--help");
|
|
System.out.println("\nOptions\n");
|
|
System.out.println("-b | --board:\n Sets the size of board's edge.\n");
|
|
System.out.println("-s | --supplies:\n Sets the number of supplies on the board.\n");
|
|
System.out.println("-r | --rounds:\n Sets the maximum number of rounds of the game.\n");
|
|
System.out.println("--norooms:\n Prevents the creation of closed rooms inside the board.\n");
|
|
System.out.println("-i | --interactive:\n Each round requires user input in order to continue.\n");
|
|
System.out.println("-h | --help:\n Print this and exits.");
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Main game loop
|
|
*/
|
|
public static void main(String[] args) {
|
|
try {
|
|
// Get command line options
|
|
if (!Game.getArguments(args)) throw new Exception("");
|
|
|
|
// Create a game, a board and 2 players.
|
|
Game game = new Game();
|
|
Board board = new Board(Session.boardSize, Session.supplySize);
|
|
Player T = new Player(1, "Theseus", true, board, 0);
|
|
Player M = new Player(2, "Minotaur", false, board, Position.toID(Session.boardSize/2, Session.boardSize/2));
|
|
|
|
// Populate data to the board
|
|
board.createBoard(T.playerTileId(), M.playerTileId());
|
|
|
|
// Initial board printout
|
|
System.out.println("Initial board: " + (game.round()));
|
|
board.printBoard(
|
|
board.getStringRepresentation(T.playerTileId(), M.playerTileId())
|
|
);
|
|
game.waitUser ();
|
|
// Main game loop
|
|
while (true) {
|
|
int[] m;
|
|
System.out.println();
|
|
System.out.println("State after round: " + (game.round()+1));
|
|
|
|
// Player moves
|
|
m = T.move(T.playerTileId());
|
|
System.out.println(T.getName() + ":\t tileId =" + m[0] + " (" + m[1] + ", " + m[2] + ")");
|
|
m = M.move(M.playerTileId());
|
|
System.out.println(M.getName() + ":\t tileId =" + m[0] + " (" + m[1] + ", " + m[2] + ")");
|
|
board.printBoard(
|
|
board.getStringRepresentation(T.playerTileId(), M.playerTileId())
|
|
);
|
|
|
|
// Loop termination cases
|
|
if (T.getScore() == 4) {
|
|
System.out.println(T.getName() + " Wins!!! Score =" + T.getScore());
|
|
System.exit(0);
|
|
}
|
|
if (M.getScore() == 4 || M.playerTileId() == T.playerTileId()) {
|
|
System.out.println(M.getName() + " Wins!!! Score =" + M.getScore());
|
|
System.exit(0);
|
|
}
|
|
if (!(game.nextRound() < Session.maxRounds)) {
|
|
System.out.println("New day has come... Tie!!!");
|
|
System.exit(0);
|
|
}
|
|
game.waitUser ();
|
|
}
|
|
}
|
|
catch (Exception e) {
|
|
// We don't handle exceptions. Print error and exit with error status.
|
|
System.out.println(e.getMessage());
|
|
System.exit(1);
|
|
}
|
|
}
|
|
}
|