Java 跟踪未定义的变量

Java 跟踪未定义的变量,java,dictionary,arraylist,Java,Dictionary,Arraylist,我正在基于名为“战争”的游戏构建一个简单的纸牌游戏。它适用于两个玩家,但我需要对其进行修改,以适用于用户在开始时输入的任意数量的玩家。由于我不再有具体的变量可供使用(无法为每个可能的玩家创建一个变量,因此动态添加玩家),因此我很难确定如何跟踪玩家和分数。我撞到墙了,不知道从这里往哪里走 以下是我的主要方法: System.out.println("Welcome to War! How many players are playing?"); //User prompt Scanner

我正在基于名为“战争”的游戏构建一个简单的纸牌游戏。它适用于两个玩家,但我需要对其进行修改,以适用于用户在开始时输入的任意数量的玩家。由于我不再有具体的变量可供使用(无法为每个可能的玩家创建一个变量,因此动态添加玩家),因此我很难确定如何跟踪玩家和分数。我撞到墙了,不知道从这里往哪里走

以下是我的主要方法:

System.out.println("Welcome to War! How many players are playing?"); //User prompt
    Scanner scanner = new Scanner(System.in); //Scanner init
    int numberOfPlayers = scanner.nextInt();//set number of players to next integer entered

    ArrayList<String> deck = createDeck(numberOfPlayers);

    ArrayList<String> playerNames = new ArrayList<String>();
    Map<String, Integer> players = new HashMap<String, Integer>();

    System.out.println("Enter player name");

    for (int p = 0; p <= numberOfPlayers; p++) {
        String playerID = scanner.next();
        addPlayer(playerID);
        players.put(playerID, 100);
        playerNames.add(playerID);
    }

        for (int j = createDeck(numberOfPlayers).size(); j > 0; j = j - numberOfPlayers) {  //j is set to deck length. Increment down two number each loop. 

            String readString = scanner.nextLine(); //Set variable "readString" to user input
            int score = 0;

            if (readString.equals("")) {    //If user input equals "enter"...

                ArrayList<Integer> currentScore = new ArrayList<Integer>();

                for (int q = 0; q <= numberOfPlayers; q++){

                    score = checkValue(deck);
                    String name = playerNames.get(q);
                    currentScore.add(score);
                    System.out.println(name +" drew a "+ deck.get(0) + " worth " + score + " points!"); //Print player 1's card


                    deck.remove(0); //Remove card
                    players.put(name, players.get(name).intValue() - score);
                }System.out.println(players.values());

            }
        }
我的主要问题是,处理未知数量的多个玩家的最佳方式是什么,这样我就可以跟踪分数并宣布胜出。到目前为止,我已经打印出了名字和他们每轮得到的点数,但我没有办法操纵或相互比较这些值

我使用
字典
让玩家将玩家的
与分数
链接起来


编辑:首选不包含多个类的任何解决方案

您可以在每轮结束时对您的
Hashmap
进行排序。然后将第一个元素作为值打印出来。这是获得冠军的最简单方法

例如,您可以使用以下方法进行排序:

public static <K,V extends Comparable<? super V>> 
            List<Entry<K, V>> entriesSortedByValues(Map<K,V> map) {

    List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());

    Collections.sort(sortedEntries, 
            new Comparator<Entry<K,V>>() {
                @Override
                public int compare(Entry<K,V> e1, Entry<K,V> e2) {
                    return e2.getValue().compareTo(e1.getValue());
                }
            }
    );

    return sortedEntries;
}

这看起来让我走上了正确的方向。但当调用该方法时,我会得到一个按数字顺序排列的键列表。有没有办法选择最上面的一个并根据其值执行动作?我需要将这一轮的优胜者得分添加到他们的总分中,并从他们自己的总分中减去其他玩家的得分。您可以迭代排序后的HashMap,从顶部(第一个元素)到末端(最后一个元素)分配每一轮的得分。我不明白你们所说的我得到一个按数字顺序排列的键列表是什么意思?您将收到按降序排序的HashMap。使用上述方法,第一个元素将始终是赢家。该方法根据每个玩家的总分数为我提供分数顺序(这对本项目的另一个方面非常有用),但我还需要能够获得每轮的顺序。我试图为当前分数创建一个arrayList,但我找不到等效的方法来对它们进行排序并准确地声明获奖者。我将编辑答案。不,它应该工作得很好,我正在初始化best并将其索引为每轮0->int best=0,index=0;请接受答案;)
public static <K,V extends Comparable<? super V>> 
            List<Entry<K, V>> entriesSortedByValues(Map<K,V> map) {

    List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());

    Collections.sort(sortedEntries, 
            new Comparator<Entry<K,V>>() {
                @Override
                public int compare(Entry<K,V> e1, Entry<K,V> e2) {
                    return e2.getValue().compareTo(e1.getValue());
                }
            }
    );

    return sortedEntries;
}
int best = 0, index = 0;
for (int q = 0; q <= numberOfPlayers; q++){
   score = checkValue(deck);
   if (best < score){
      index = q;
      best = score;
   }
   String name = playerNames.get(q);
   currentScore.add(score);
   System.out.println(name +" drew a "+ deck.get(0) + " worth " + score + " points!"); //Print player 1's card
   deck.remove(0); //Remove card
   players.put(name, players.get(name).intValue() - score);
   }
System.out.println("Best player in this round: " + playerNames.get(index);