2014-02-10 2 views
0

ОК, поэтому у меня есть калькулятор оценки игры в боулинг, и у меня есть основной класс, который читает ввод из командной строки и создает объект PlayerScore для каждого игрока, у объекта PlayerScore есть аррайалист и способ добавить к этому arraylist, игра должна идти кадр за кадром и чередовать между игроками, прося количество штырей, которые они сбивали в каждом кадре, а затем вычислять и генерировать отформатированный лист оценки. So for Например, я ввожу, что будут два игрока, тогда я храню имена игроков в String ArrayList, а затем пустой объект playcore в отдельном сопутствующем игроком Arrayalist PlayerScore, у меня есть цикл for, который чередуется между игроками, вложенными в цикл for, который поддерживает отслеживать текущий кадр. Поэтому, когда я вводим оценки для одного игрока, он должен ссылаться на свой объект playercore, вот мой код:Игра Java Bowling - ссылки на разные объекты

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Scanner; 
import java.util.Set; 
/* 
* In each iteration call the add method of each players PlayerScore object 
*/ 

public class BowlingGameCalculator { 
    static int Frame = 1; 
    private static String res; 
    static ArrayList<PlayerScore> playerArrays = new ArrayList<PlayerScore>(); 
    //static HashMap<String, PlayerScore> play = new HashMap<String, PlayerScore>(); 
    static ArrayList<String> newscore = new ArrayList<String>(); 
    static ArrayList<String> players = new ArrayList<String>(); 
    static String[] scores = new String[21]; 
    static int rscore; 
    static ArrayList<Integer> running_score = new ArrayList<Integer>(); 

    public static void main(String[] args) throws IOException { 
     System.out.println("Enter the number of bowlers"); 
     Scanner in = new Scanner(System.in); 
     int num = in.nextInt(); 
     for(int i =0; i<num; i++) { 
      System.out.println("enter bowlers name:"); 
      Scanner inp = new Scanner(System.in); 
      String input = inp.next(); 
      PlayerScore scr = new PlayerScore(); 
      // play.put(input, scr); 
      players.add(input); 
      playerArrays.add(scr); 
     } 
     System.out.println(players); 
     outerloop: 

     for(int j=0; j<players.size();) { 
      for(int k=0; k< 10;) { 
       if(j > players.size()-1) { 
        j = j-players.size(); 
        Frame++; 
       } 

       System.out.println("Frame : " + Frame); 
       if(Frame == 11) { 
        break outerloop; 
       } 
       String playr = players.get(j); 
       System.out.println("enter rolls for " + playr); 
       System.out.println("roll 1 : "); 

       Scanner inp = new Scanner(System.in); 
       int input = inp.nextInt(); 
       if(input == 10) { 
        PlayerScore score = playerArrays.get(j); 
        System.out.println(score); 
        score.addRoll(input); 
        score.show(); 
        // PlayerScore scr = play.get(j); 
        // scr.addRoll(input); 
        j++; 
       } 
       else { 
        System.out.println("roll 2 :"); 
        Scanner inp2 = new Scanner(System.in); 
        int input2 = inp2.nextInt(); 
        PlayerScore score = playerArrays.get(j); 
        System.out.println(score); 
        score.addRoll(input); 
        score.addRoll(input2); 
        score.show(); 
        // PlayerScore scr = play.get(playr); 
        // scr.addRoll(input); 
        //scr.addRoll(input2); 
        // System.out.println(scr); 
        // scr.show(); 
        //System.out.println(play); 
        j++; 
       } 
      } 
      //System.out.println(play); 
     } 
    } 
} 

А вот PlayerScore класс

import java.util.ArrayList; 
public class PlayerScore { 
    static ArrayList<Integer> score = new ArrayList<Integer>(); 
    static ArrayList<Integer> newscore = new ArrayList<Integer>(); 
    static ArrayList<Integer> running_score = new ArrayList<Integer>(); 
    public static int rscore; 

    public PlayerScore() { 

    } 
    public PlayerScore(int[] in) { 

    } 
    public void addRoll(int x) { 
     score.add(x); 
    } 

    //public boolean isComplete(){ 

    //} 
    //public int getScore(){ 

    //} 

    public ArrayList<Integer> show() { 
     System.out.println(this.score); 
     return this.score; 
    } 

теперь вот выход из пробного запуска

Enter the number of bowlers 
2 
enter bowlers name: 
matt 
enter bowlers name: 
derp 
[matt, derp] 
Frame : 1 
enter rolls for matt 
roll 1 : 
5 
roll 2 : 
5 
[email protected] 
[5, 5] 
Frame : 1 
enter rolls for derp 
roll 1 : 
5 
roll 2 : 
5 
[email protected] 
[5, 5, 5, 5] 
Frame : 2 
enter rolls for matt 
roll 1 : 

Ok, так как вы можете видеть, что это добавляет рулоны [5, 5] для arraylist в playcore объекта мата, но затем он добавляет рулоны в тот же ArrayList, который заставлял меня думать, что я случайно ссылался на один и тот же объект, но, как вы можете видеть, я распечатывал идентификаторы объектов на консоли и показывает t Шляпа я действительно вызывая различные ссылки объекта PlayerScore, оно должно быть [5,5] на мой счет, то [5,5] для derps забьет в кадре 1, любая помощь ценится

ответ

3
  • Один из вас» Проблема заключается в том, что вы используете статические поля, в частности, для класса ArrayList класса PlayerScore. Это проблема, поскольку один и тот же ArrayList используется всеми экземплярами PlayerScore, которые, как я считаю, вызывают основные ошибки. Решение легко: не используйте здесь статические поля, и когда вы их используете, делайте это экономно и для определенной цели.
  • Другая проблема заключается в том, что ваш код имеет ненужный мусор в нем. Почему вы объявляете два совершенно разных поля новостей и run_score в двух разных классах? Вы захотите устранить один из них.
  • Также вы создаете слишком много объектов сканера, где требуется только один.
  • Форматирование вашего кода, особенно ваш отступ, является ужасным. Почему это важно? Чем лучше форматирование кода, тем проще видеть, какая строка кода принадлежит какому блоку исполнения, тем проще сказать, что делает ваш код, тем легче вам и вам, и нам отлаживать его. Не пытайтесь усложнять свою работу и работу, не заботясь о том, чтобы хорошо отформатировать код. Немного усилий предстоит пройти долгий путь.
+3

+1 за подсказками, но не в последнюю очередь и для, казалось бы, бесконечного терпения и не испугается от первоначально размещен код – Marco13

+0

@ Marco13: спасибо. –

+0

Да, извиняюсь за неряшливый код, я просто вложил его из затмения. В следующий раз, когда я буду форматировать, те ненужные ArrayLists использовались в более ранней версии кода, и я забыл их удалить. Спасибо за отзыв о сканере, а также, наконец, как @ Marco13 снова поблагодарил за то, что потратил время на чтение моего отвратительного кода. –

0

Вы указали переменную счёта как статическую в классе PlayerScore, что означает, что она является переменной класса - существует только одно, которое будет совместно использоваться двумя созданными вами объектами PlayerScore.

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

+0

Спасибо, не уверен, как я переглянулся примерно так. –

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