Игра в баскетбол


У меня много строк кода, которые - для меня - выглядит очень странно, и я хотел бы конденсироваться, но я не знаю как.
Эта часть мне нравится больше всего:

if(random.nextInt(50) == 26) {
    int rnteam = random.nextInt(twoteams.size());
    String rndteam = "";
    if(rnteam == 0) rndteam = team1.getName();
    else if(rnteam == 1) rndteam = team2.getName();
    String rndplayfrndteam = "";
    int rndplayer = random.nextInt(5);
    if(rndteam == team1.getName()) rndplayfrndteam = team1.getPlayers().get(rndplayer);
    else if(rndteam == team2.getName()) rndplayfrndteam = team2.getPlayers().get(rndplayer);
    // Determining this player's score
    // Team 1
    if(rndplayfrndteam == team1.getPlayers().get(0)) t1p1score += scoreAmount;
    if(rndplayfrndteam == team1.getPlayers().get(1)) t1p2score += scoreAmount;
    if(rndplayfrndteam == team1.getPlayers().get(2)) t1p3score += scoreAmount;
    if(rndplayfrndteam == team1.getPlayers().get(3)) t1p4score += scoreAmount;
    if(rndplayfrndteam == team1.getPlayers().get(4)) t1p5score += scoreAmount;
    // Team 2
    if(rndplayfrndteam == team2.getPlayers().get(0)) t2p1score += scoreAmount;
    if(rndplayfrndteam == team2.getPlayers().get(1)) t2p2score += scoreAmount;
    if(rndplayfrndteam == team2.getPlayers().get(2)) t2p3score += scoreAmount;
    if(rndplayfrndteam == team2.getPlayers().get(3)) t2p4score += scoreAmount;
    if(rndplayfrndteam == team2.getPlayers().get(4)) t2p5score += scoreAmount;

    if(rnteam == 0) {
        t1sofar += scoreAmount;
    } else {
        t2sofar += scoreAmount;
    }
    int[] t1scores = {t1p1score, t1p2score, t1p3score, t1p4score, t1p5score};
    int t1maxScore = findGreatestInt(t1scores);
    int t1bestPlayer = 0;
    if(t1maxScore == t1p1score) t1bestPlayer = 1;
    if(t1maxScore == t1p2score) t1bestPlayer = 2;
    if(t1maxScore == t1p3score) t1bestPlayer = 3;
    if(t1maxScore == t1p4score) t1bestPlayer = 4;
    if(t1maxScore == t1p5score) t1bestPlayer = 5;

    int[] t2scores = {t2p1score, t2p2score, t2p3score, t2p4score, t2p5score};
    int t2maxScore = findGreatestInt(t2scores);
    int t2bestPlayer = 0;
    if(t2maxScore == t2p1score) t2bestPlayer = 1;
    if(t2maxScore == t2p2score) t2bestPlayer = 2;
    if(t2maxScore == t2p3score) t2bestPlayer = 3;
    if(t2maxScore == t2p4score) t2bestPlayer = 4;
    if(t2maxScore == t2p5score) t2bestPlayer = 5;
    hangOver(rndplayfrndteam + " scored " + scoreAmount, team1, team2, t1bestPlayer, t1maxScore, t2bestPlayer, t2maxScore, t1sofar, t2sofar);
} else {
    int[] t1scores = {t1p1score, t1p2score, t1p3score, t1p4score, t1p5score};
    int t1maxScore = findGreatestInt(t1scores);
    int t1bestPlayer = 0;
    if(t1maxScore == t1p1score) t1bestPlayer = 1;
    if(t1maxScore == t1p2score) t1bestPlayer = 2;
    if(t1maxScore == t1p3score) t1bestPlayer = 3;
    if(t1maxScore == t1p4score) t1bestPlayer = 4;
    if(t1maxScore == t1p5score) t1bestPlayer = 5;

    int[] t2scores = {t2p1score, t2p2score, t2p3score, t2p4score, t2p5score};
    int t2maxScore = findGreatestInt(t2scores);
    int t2bestPlayer = 0;
    if(t2maxScore == t2p1score) t2bestPlayer = 1;
    if(t2maxScore == t2p2score) t2bestPlayer = 2;
    if(t2maxScore == t2p3score) t2bestPlayer = 3;
    if(t2maxScore == t2p4score) t2bestPlayer = 4;
    if(t2maxScore == t2p5score) t2bestPlayer = 5;
    hangOver("No one", team1, team2, t1bestPlayer, t1maxScore, t2bestPlayer, t2maxScore, t1sofar, t2sofar);
}

Все если-заявления сочетании просто плохо выглядят, и не очень эффективно. Есть ли способ я могу изменить это в петлю и оно все еще работает? Если да, то как?



738
3
задан 28 января 2018 в 01:01 Источник Поделиться
Комментарии
2 ответа

Вот мои замечания в порядке тяжести:

1) ошибки


  1. Проверка равенства строк, используя equals() не ==

  2. использование else if
    давайте рассмотрим этот кусок кода

    String rndteam = "";
    if(rnteam == 0) rndteam = team1.getName();
    else if(rnteam == 1) rndteam = team2.getName();


он присваивает значение в строку rndteam. теперь, я полагаю, что логика была означало, что rndteam должно быть назначено имя team1 или team2 но код на самом деле позволяет if заявления ложными и значение будет пустой строкой. Вы можете исправить это путем изменения потока if else один

String rndteam = "";   
if(rnteam == 0) rndteam = team1.getName();
else rndteam = team2.getName();

на мой взгляд, в случае выбора между двух вариантов, краткой формы оператора if можно использовать, чтобы было понятно:

String rndteam = rnteam == 0 ? team1.getName() : team2.getName();   

2) проблемы проектирования


  1. Теперь мы подошли к вопросу о всех этих if заявления. У вас уже есть массивы, которые можно присвоить переменным в так почему бы не использовать их, когда вы просите об игроках команды?

    int[] t1scores = new int[team1.size()];
    for (int i = 0 ; i < team1.size(); i++) {
    if(rndplayfrndteam.equals(team1.getPlayers().get(i))) t1scores[i] += scoreAmount;
    }


  2. Но на самом деле, как уже было предложено, вы должны разработать класс, который содержит всю информацию игрока и другой команды.

2
ответ дан 28 января 2018 в 03:01 Источник Поделиться

Если у вас есть несколько переменных с похожими именами, например t?p?scoreвы должны рассмотреть вопрос об изменении их в массивы (в 2D можно было бы смысла в вашем случае), которые можно перебирать в цикле, чтобы уменьшить повторения.

Что является настолько особенным о if(random.nextInt(50) == 26) состояние? Некоторые константы будут полезны здесь.

Старайтесь избегать удалением букв из имен переменных, чтобы укоротить их, иначе они теряют смысл. Я не могу разобрать, что rndplayfrndteam значит.

Метод, называемый hangOver говорит абсолютно ничего о том, что он делает, и вы должны рассмотреть другое имя.

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

2
ответ дан 28 января 2018 в 03:01 Источник Поделиться