public static void main(String[] args) throws InitializationException, InterruptedException {
		List<Player> players = preparePlayers(args);
		
		GenericX01Game x301Game = GenericX01Game.create(players, 301);
		x301Game.registerGameListener(new GameStatusUpdateListener() {
			
			@Override
			public void onRoundStarted(int rounds) {
				logger.info("+++++++++++++++++++");
				logger.info("Round {} started!", rounds);
				logger.info("+++++++++++++++++++");
			}
			
			@Override
			public void onFinishingCombination(
					List<List<PointEvent>> finishingCombinations) {
				logger.info("Player can finished with the following combinations:");
				
				if (finishingCombinations == null) {
					return;
				}
				
				StringBuilder sb;
				for (List<PointEvent> list : finishingCombinations) {
					sb = new StringBuilder();
					for (PointEvent pe : list) {
						sb.append(pe);
						sb.append(" + ");
					}
					logger.info(sb.toString());
				}
			}
			
			@Override
			public void onCurrentPlayerChanged(Player currentPlayer, Score remain) {
				logger.info("####################");
				logger.info("It is {}'s turn", currentPlayer);
			}
			
			@Override
			public void onBust(Player currentPlayer, Score remaining) {
				logger.info("{} busted!", currentPlayer);
			}

			@Override
			public void onTurnFinished(Player finishedPlayer, Score remainingScore) {
				logger.info("Player {} finished the turn. Remaining points: {}", finishedPlayer, remainingScore.getTotalScore());
			}

			@Override
			public void onRemainingScoreForPlayer(Player currentPlayer,
					Score remainingScore) {
				logger.info("Player {}'s remaining points: {}", currentPlayer, remainingScore.getTotalScore());
			}

			@Override
			public void requestNextPlayerEvent() {
				logger.info("Please press 'Next Player'!");
			}

			@Override
			public void onPlayerFinished(Player currentPlayer) {
				logger.info("Player {} finished!!!!!!! You are a Dart god!", currentPlayer);
			}

			@Override
			public void onGameFinished(Map<Player, Score> playerScoreMap, List<Player> winner) {
				logger.info("The game has ended!");
				
				for (Player player : playerScoreMap.keySet()) {
					logger.info("{}: {}", player, playerScoreMap.get(player));
				}
			}

			@Override
			public void onPointEvent(PointEvent event) {
				//TODO
			}

			@Override
			public void onNextPlayerPressed() {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void onBounceOutPressed() {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void onDartMissedPressed() {
				// TODO Auto-generated method stub
				
			}
		});
		
		EventEngine.instance().registerListener(x301Game);
		
		while (true) {
			Thread.sleep(5000);
		}
	}