2014-12-04 1 views
-1

Я пытаюсь показать свою оценку в конце вопросника, но мой способ сделать это показывает только последний балл.Как отобразить все оценки в конце без цикла?

Было бы работать, если бы я поставил его в цикле, 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

+4

Почему? Похоже, он должен работать. Что с этим не так? –

+0

Показывает только последний балл для всех игроков. Если Player1 получил 5, а Player2 получил 10, он отобразит 10 для обоих – Xylus

+0

Вы уверены, что у Player1 есть оценка 10? Вы пробовали смотреть на него в отладчике или делать 'System.out.println (playerScore [0])'? Возможно ли, что вы не ставите оценки игроков в массиве правильно? – Jias

ответ

2

Это кричащий пример из преимуществ Object-Oriented Programming. ООП сделает этот кусок кода более легким для отладки, чтения и записи. Я напишу какой-нибудь быстрый код, чтобы объяснить это лучше (отнюдь не идеально). Обратите внимание, что мы можем легко создать хорошую строку вывода, используя свойства Player. Создайте массив объектов Player и передайте его в свой метод печати.

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

Поскольку вы переопределяете toString, как насчет 'return Arrays.toString (players);' –

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

Таким образом, каждый игрок имеет отдельный список ответов, которые Independ друг от друга.

Затем все, что вам нужно, - это отправить каждого игрока в качестве параметра в функции и прочитать их по мере необходимости.

1

Я лично не буду кодировать эту проблему так, как вы это делали, так как это не ООП и просто очень запутанно. Тем не менее, вот что вы можете использовать, чтобы не полностью нарушить ваш код, но исправить свою проблему.

Главный вопрос, на который вы пытаетесь ответить, - это то, почему последний результат появляется. Как утверждали другие, вы используете один массив для оценки игроков.Вот взломать, чтобы изменить код, чтобы получить его работу:

 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. Я также прокомментировал другой код, чтобы заставить его работать.

Смежные вопросы