我试图在调查问卷的最后显示我的分数,但我这样做的方式只显示最后一个分数。
如果我把它放在一个循环中,那将是有效的,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
我知道我需要将方法更改为其他方法,但我还能怎样做呢?
答案 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];
这样,每个玩家都有一个单独的答案列表,彼此独立。
然后,你需要的只是将每个玩家作为参数发送给函数并根据需要阅读。