【问题标题】:Keeping track of undefined variables跟踪未定义的变量
【发布时间】:2016-03-27 01:21:59
【问题描述】:

我正在基于名为 War 的游戏构建一个简单的纸牌游戏。它适用于两个玩家,但我需要对其进行修改以适用于用户一开始输入的任意数量的玩家。我无法弄清楚如何跟踪球员和得分,因为我不再有具体的变量可以使用(无法为每个可能的球员创建一个变量,所以球员是动态添加的)。我碰壁了,不知道从这里去哪里。

这是我的主要方法:

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());

            }
        }

此方法检查抽出的牌的值并分配一个点值。

int currentScore = 0;

    boolean checkAce = deck.get(0).startsWith("Ace");
    boolean checkTwo = deck.get(0).startsWith("Two");
    boolean checkThree = deck.get(0).startsWith("Three");
    boolean checkFour = deck.get(0).startsWith("Four");
    boolean checkFive = deck.get(0).startsWith("Five");
    boolean checkSix = deck.get(0).startsWith("Six");
    boolean checkSeven = deck.get(0).startsWith("Seven");
    boolean checkEight = deck.get(0).startsWith("Eight");
    boolean checkNine = deck.get(0).startsWith("Nine");
    boolean checkTen = deck.get(0).startsWith("Ten");
    boolean checkJack = deck.get(0).startsWith("Jack");
    boolean checkQueen = deck.get(0).startsWith("Queen");
    boolean checkKing = deck.get(0).startsWith("King");


    if (checkAce) {
        currentScore = 14;
    }else if (checkTwo) {
        currentScore = 2;
    }else if (checkThree) {
        currentScore = 3;
    }else if (checkFour) {
        currentScore = 4;
    }else if (checkFive) {
        currentScore = 5;
    }else if (checkSix) {
        currentScore = 6;
    }else if (checkSeven) {
        currentScore = 7;
    }else if (checkEight) {
        currentScore = 8;
    }else if (checkNine) {
        currentScore = 9;
    }else if (checkTen) {
        currentScore = 10;
    }else if (checkJack) {
        currentScore = 11;
    }else if (checkQueen) {
        currentScore = 12;
    }else if (checkKing) {
        currentScore = 13;
    }


    return currentScore;

}

我的主要问题是什么是处理未知数量的多个玩家的最佳方式,以使我能够跟踪分数并宣布获胜者。到目前为止,我所拥有的内容会打印出我的名字以及他们每轮获得多少分,但我没有办法操纵或相互比较这些值。

我使用dictionary 让玩家key 与分数value 相关联。

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

【问题讨论】:

    标签: java dictionary arraylist


    【解决方案1】:

    您可以在每一轮结束时对您的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;
    }
    

    那么您只需拨打:entriesSortedByValues(players);

    示例来自这里: Sorting the Map<Key,Value> in descending order based on the value

    更新: 您可以通过将scorebest 的值进行比较,为每一轮中的最佳玩家存储index,例如:

    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);
    

    【讨论】:

    • 这看起来让我朝着正确的方向前进。但是在调用该方法时,我会按数字顺序获得一个键列表。有没有办法然后根据其价值选择顶部并执行操作?我需要将这一轮的获胜者得分添加到他们的总得分中,并从他们自己的总得分中减去其他玩家的得分。
    • 您可以遍历已排序的 HashMap,从顶部(第一个元素)到末尾(最后一个元素)分配每轮得分。而且,我不明白你的意思是我得到一个按数字顺序排列的键列表?您将收到按降序排列的 HashMap。使用上述方法,第一个元素将永远是赢家。
    • 这个方法给了我基于每个玩家总分的分数顺序(这对这个项目的另一个方面非常有帮助),但我还需要能够获得每一轮的顺序。我试图为当前分数创建一个 arrayList,但我找不到让我对它们进行排序并准确宣布获胜者的等效方法。
    • 您可以简单地存储 q 参数。我将编辑答案。
    • 不,它应该可以正常工作,我正在初始化最好并将每轮索引为 0 -> int best = 0, index = 0;请接受答案;)
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多