如何在没有循环的情况下显示所有分数?

时间:2014-12-04 15:15:34

标签: java methods

我试图在调查问卷的最后显示我的分数,但我这样做的方式只显示最后一个分数。

如果我把它放在一个循环中,那将是有效的,JOptionPane.showMessageDialog但是我只希望它在结束时显示一次。

这是我的代码。

//Main method

JOptionPane.showMessageDialog(null, printPlayerScore(playerName, playerAge, playerScore, playerCount));

//printPlayerScore method

public static String printPlayerScore(String playerName[], int playerAge[], int playerScore[], int playerCount) {
   String displayResult = "";

   for(int i = 0; i < playerCount; i++) {
        displayResult += "\nName: " + playerName[i] + "\nAge: " + playerAge[i] + "\nScore: " +  playerScore[i] + "\n";
   }

   return displayResult;
}

示例运行:

Player1: 12

Player2: 12

什么时候应该

Player1: 10

Player2: 12

我知道我需要将方法更改为其他方法,但我还能怎样做呢?

完整代码:http://pastebin.com/NME8Dh7N

3 个答案:

答案 0 :(得分:2)

这是Object-Oriented Programming的好处的一个尖叫的例子。 OOP将使这块代码更容易调试,读取和写入。我会写一些快速代码来更好地解释这一点(绝不是完美的)。请注意我们如何使用Player的属性轻松创建一个不错的输出字符串。创建一个Player个对象数组,并将其传递给print方法。

public class Player
{
    public String name;
    public int age;
    public int score;

    public String toString()
    {
        return String.format("\nName : %s\nAge: %d\nScore: %s\n", name, age, score);
    }
}

public static String printPlayerScore(Player[] players) 
{
   String displayResult = "";

   for(Player player : players)
   {
        displayResult += player.toString();
   }

   return displayResult;
}

答案 1 :(得分:1)

我个人不会像你那样编码这个问题,因为它不是OOP而且非常令人困惑。但是,您可以使用以下内容,以便不会完全破坏您的代码,但可以解决您的问题。

您要回答的主要问题是为什么最后得分会出现。正如其他人所说,你正在使用一个阵列来获得球员得分。以下是修改代码以使其正常工作的方法:

        List<int[]> playerScoresList = new ArrayList<int[]>();
        for (int i = 0; i < playerCount; i++)
        {
            int playerScore[] = new int[1];
            JOptionPane.showMessageDialog(null, "It is " + playerName[i] + "'s turn now!");

            checkQuestion(question, questionAnswer, userAnswer);

            System.out.println("Name: " + playerName[i] + " || Age: " + playerAge[i] + "\n\n ~~~~ Results ~~~~");
            System.out.println(printQuestionnaireResults(question, userAnswer) + " ~~~~ End of Results ~~~~\n");

            playerScore = calculatePlayerScore(userAnswer, playerScore, playerCount);
            // double playerScorePercentage = ((double)playerScore[i] / (double)question.length) * 100;
            double playerScorePercentage = ((double)playerScore[0] / (double)question.length) * 100;

            System.out.println(playerName[i] + " got " + playerScore[0] + " questions correct out of " + question.length + "! (" +
                    playerScorePercentage + "%)\n");

            playerScoresList.add(playerScore);
        }

        JOptionPane.showMessageDialog(null, printPlayerScore(playerName, playerAge, playerScoresList, playerCount));

需要更改的其他方法:

        public static int[] calculatePlayerScore(boolean userAnswer[], int playerScore[], int playerCount) {

        for (int i = 0; i < 1; i++) {
            playerScore[i] = 0;
            for (int ii = 0; ii < userAnswer.length; ii++) {
                if (userAnswer[ii]) {
                    playerScore[i] += 1;
                }
            }
        }

        return playerScore;

    }

并且:

        public static String printPlayerScore(String playerName[], int playerAge[], List<int[]> playerScore, int playerCount) {

        String displayResult = ""; // Maybe use StringBuilder

        for(int i = 0; i < playerCount; i++)
        {
            int[] score = playerScore.get(i);
            displayResult += "\nName: " + playerName[i] + "\nAge: " + playerAge[i] + "\nScore: " + score[0] + "\n";
        }

        return displayResult;
    }

现在,您将为每个用户创建一个每个元素都有一个元素的新数组。

请注意,我们提供了这样的黑客攻击,以便您的当前代码应该进行微小的更改。您应该认真考虑重写整个IMO程序。我还注释了其他一些代码,以便让它正常工作。

答案 2 :(得分:0)

根据您的pastebin,您只有1个数组用于存储问题答案。这意味着n + 1玩家正在覆盖n个玩家的答案。

你可以做一个矩阵(阵列数组),或者更容易阅读的替代方案,为玩家制作一个类并让该类管理玩家数据,程序只有一个玩家列表。它将减少函数调用中的参数数量,并允许轻松个性化答案。

public class Player {
  private String name;
  private List<boolean> answers;
  private int playerId;
}

矩阵的工作原理如下:

boolean answers[][] = new boolean[playerCount][questionCount];

这样,每个玩家都有一个单独的答案列表,彼此独立。

然后,你需要的只是将每个玩家作为参数发送给函数并根据需要阅读。