private Set<Player> play() {
        running = true;
        initIOControllers();
        for (int round = 0; running && (round < gameState.getTableSize()); ++round) {
            for (Player player : playerOrder) {
                playerMove(player);
                if (!running) break;
            }
        }
        Set<Player> winners = new HashSet<Player>();
        if (running) {
            updateGameControllers();
            int max = 0;
            for (Player player : playerOrder) {
                int score = gameState.getTables().get(player).getScore();
                if (score == max) {
                    winners.add(player);
                }
                if (score > max) {
                    max = score;
                    winners.clear();
                    winners.add(player);
                }
            }
        }
        try {
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            // exit anyway
        }
        terminateGameControllers();
        return winners;
    }