Как правильно создать массив объектов? - PullRequest
0 голосов
/ 06 февраля 2020

Так что я только начинаю использовать объекты в Java, и я слышал, что вы можете создать массив объектов, но у меня возникли некоторые проблемы с ним.

public class Minesweeper {

    static int Turns;
    static boolean Won;
    static String Name;
    static int Winnings;
    public Minesweeper(boolean won, int turns,String pName,int score){
        Turns=turns;
        Won=won;
        Name=pName;
        Winnings=score;

    }

    public static void main(String[] args) {

        Scanner inpt = new Scanner(System.in);
        int pl=0,again,respd;
        String ans;
        String pName;
        Minesweeper [] player= new Minesweeper[20];

        do{

        again=0;
        respd=0;

        System.out.println("What's your name?");
        pName=inpt.next();


        Won=false;
        Turns=0;    

        play(inpt);

        System.out.println("");
        System.out.println("Play Again?");

        ans = inpt.next();
        if(ans.charAt(0)=='y'||ans.charAt(0)=='Y'){
            again=1;
        }
        else{
            again=0;
        }

        player[pl]= new Minesweeper(Won,Turns,pName,Winnings);
        pl++;

        }while(again==1);

        System.out.println("Won?:\tName:\tTurns:\t:Score:");
        for(int i=0;i<pl;i++){
            System.out.println(player[i].Won+"\t"+player[i].Name+"\t"+player[i].Turns+"\t"+player[i].Winnings);
        }

    }

Он просто выводит счет последнего игрока повторно (из-за l oop), я хочу, чтобы он печатал каждого игрока, который играл в игру.

Какие строки мне нужно изменить

Весь код https://pastebin.com/hX1kEYcQ

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Поля, в которых вы собираетесь хранить данные для каждого игрока, static. Это противоречит их предполагаемому использованию.

Если у вас есть 5 экземпляров вашего класса, static int Turns; заставляет поле существовать только один раз. Удаление static дает каждому экземпляру отдельное поле, которое вам нужно.

(Кстати, имена полей в Java обычно начинаются со строчной буквы, поэтому лучше использовать turns вместо Turns. )

Если вы превратите

static int Turns;
static boolean Won;
static String Name;
static int Winnings;

в

int turns;
boolean won;
String name;
int winnings;

, вы увидите, что ваш основной l oop больше не работает.

Таким образом, вы должны добавить локальные переменные в свои main():

int turns = 0;
boolean won = false;
String name;
int winnings;

Значения won и turns должны быть получены как чистым способом, так и winnings. (Может быть, вы хотите сделать их отдельным классом GameResult, который возвращается play().)

Тогда вы можете сделать

    player[pl]= new Minesweeper(won,turns,pName,winnings);

(Кстати, имя должно быть помещено первым , но это вопрос стиля.)

0 голосов
/ 06 февраля 2020

Если вы не знаете размер заранее, я бы использовал список вместо массива:

List<Minesweeper> minesweeperList = new ArrayList<>();

Тогда вы можете просто:

minesweeperList.add(new Minesweeper(Won,Turns,pName,Winnings));

Тогда:

for(Minesweeper m : minesweeperList) {
    ...
}

Stati c значения в Java означают, что все объекты в вашей программе имеют только 1 значение,, Как вы пишете, все объекты Minesweeper совместно используют одну и ту же информацию для каждого stati c var. Измените их на переменные «instance», удалив ключевое слово «stati c»:

public class Minesweeper {

    int Turns;
    boolean Won;
    String Name;
    int Winnings;
    public Minesweeper(boolean won, int turns,String pName,int score){
        Turns=turns;
        Won=won;
        Name=pName;
        Winnings=score;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...