Как оценить коэффициент выигрыша в java - PullRequest
0 голосов
/ 22 апреля 2020

Я строил классическую игру Nim с тремя java классами. Пока что я строю почти все, и последнее, что мне нужно сделать, это расположить игрока в порядке убывания на winning ratio, то есть score, деленное на gamePlayed. То, что я пытался, было реализовать сопоставимые в NimPlayer классе. Вот мой код:

public class NimPlayer implements Comparable<NimPlayer>{ //initialize comparable
private String userName;
private String familyName;
private String givenName;

static int counter;
private int score;
private int gamePlayed;
private int winRatio = score / (gamePlayed+1); //avoid 0/0, mathmatically wrong

static NimPlayer[] playerList = new NimPlayer[10]; // set an array here

//define NimPlayer data type
public NimPlayer(String userName, String surName, String givenName) {
    this.userName = userName;
    this.familyName = surName;
    this.givenName = givenName;

}
// create new data using NimPlayer data type
public static void createPlayer(String userName, String familyName, String givenName) {
    if (counter<10) {
        playerList[counter++] = new NimPlayer(userName, familyName, givenName);
    } else {
        System.out.println("Cannot add more players.");
    }
}
public static int getCounter() {
    return counter;
}
public static NimPlayer [] getPlayer() {
    return playerList;
}
// the getter and the setter of userName, familyName, givenName, score, gamePlayed

@Override
public String toString() {
    return winRatio+"% | "+gamePlayed+" games | "+givenName+" "+familyName;
}
@Override
public int compareTo(NimPlayer o) {
    return this.winRatio - o.winRatio;
}
}

В основном методе, который называется Nimsys, я попробовал:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    while (true) {
    System.out.print('$');
    String commandin = in.next();

    if (commandin.equals("rankings")) {

       Arrays.sort(NimPlayer.getPlayer());//sorting with the object type           
       System.out.println(Arrays.toString(NimPlayer.getPlayer()));
    }          
}

Однако, когда у меня в игре два игрока и их score и gamePlayed не равны NULL, выполнение все еще продолжается до NullPointerException. Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 22 апреля 2020

Ошибка, которую вы получаете, заключается в том, что вы инициализируете массив размером 10. Операция сортировки пройдет все 10 позиций, а некоторые из них будут нулевыми. Если вы создаете 10 игроков, это должно работать без проблем.

Чтобы иметь размер Dynami c, используйте вместо него ArrayList, обновляя следующее:

static List<NimPlayer> playerList = new ArrayList<>();
public static void createPlayer(String userName, String familyName, String givenName) {

    if (counter < 10) {
        playerList.add(new NimPlayer(userName, familyName, givenName));
        counter++;
    } else {
        System.out.println("Cannot add more players.");
    }
}

Для сортировка списка:

Collections.sort(NimPlayer.playerList);

Кроме того, я думаю, что у вас есть код fl aws.

Сначала вы инициализируете winRatio в объявлении поля и, по крайней мере, из того, что я вижу в вашем коде, не обновляется никогда, поэтому всегда будет 0. Способ преодолеть это - использовать методы получения и установки для запуска вычисления каждый раз, когда вы запрашиваете значение.

public Float getWinRatio() {
    return Float.valueOf(getScore()) / (getGamePlayed() + 1);
}

Во-вторых, вы устанавливаете winRatio как int. Это будет игнорировать все десятичные дроби в делениях, поэтому результаты не будут точными.

Кроме того, вы, похоже, объединяете данные игроков с логами c игры. Вы должны отделить класс NimPlayer от логики c, содержащей всех игроков в игре.

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