public void runTournament(Player[] players) throws Exception {
		
		// Generate three worlds for this tournament.
		String[] tournamentWorlds = new String[3];
		for (int index=0; index<3; index++) {
			tournamentWorlds[index] = worldEngine.generateNewWorldFile("temp_" + index + ".world");
		}
		
		// Match each player against every other player.
		for (int A=0; A<players.length-1; A++) {
			for (int B=A+1; B<players.length; B++) {
				// Define the pairing of players for this match.
				matchPlayers = new Player[2];
				matchPlayers[0] = players[A];
				matchPlayers[1] = players[B];
				// Play this pairing of players on each of the tournament worlds.
				for (int worldIndex=0; worldIndex<tournamentWorlds.length; worldIndex++) {
					// Load the current tournament world.
					matchWorld = worldEngine.loadWorld(tournamentWorlds[worldIndex]);
					// Play the first match between this pairing of players.
					matchPlayers[0].setColor(TeamColor.RED);
					matchPlayers[1].setColor(TeamColor.BLACK);
					processMatch();
					updatePoints();
					// Reset the current tournament world.
					matchWorld = worldEngine.loadWorld(tournamentWorlds[worldIndex]);
					// Play the second match between this pairing of players.
					matchPlayers[0].setColor(TeamColor.RED);
					matchPlayers[1].setColor(TeamColor.BLACK);
					processMatch();
					updatePoints();
				}
			}
		}
		
		// Determine the winning player, this considers multiple players with the same points.
		ArrayList<Player> winningPlayers = new ArrayList<Player>();
		winningPlayers.add(players[0]);
		for (Player player : matchPlayers) {
			if (player.getPoints() > winningPlayers.get(0).getPoints()) {
				// We have found a player with the highest points, reset the ArrayList and add this player.
				winningPlayers = new ArrayList<Player>();
				winningPlayers.add(player);
			} else if (player.getPoints() == winningPlayers.get(0).getPoints()) {
				// We have found a player with the same points as the winning player, add this player.
				winningPlayers.add(player);
			}
		}
		
		// Determine if we have more than one winning player.
		if (winningPlayers.size() > 1) {
			// We have more than one winning player, run another tournament (recursively) between the winning players, this will continue until one winner remains.
			runTournament(winningPlayers.toArray(new Player[winningPlayers.size()]));
		} else {
			// We have only one winning player, the game has finished.
			// JOE~ GUI.endGame(winningPlayer.get(0));	
		}
	}