Рост уровней игры
Пытаюсь реализовать расчет получения новых уровней. За каждое действие игрок получает определенное количество очков, от 1 до 8, плюс еще за нужную комбинацию этих действий даются очки. Понятно, что чем сложней действие, тем больше очков он получит.
Как в таком случае написать алгоритм, что бы при получении нового уровня значение next_lvl возвращалось только один раз? Так как от это влияет на выполнение еще нескольких методов.
protected int next_lvl = 1;
protected int LVL_UP(int income) {
if (income >= 15 && income <= 20) {
this.next_lvl = 2;
} else if (income >= 21 && income <= 40) {
this.next_lvl = 3;
} else if (income >= 41 && income <= 60) {
this.next_lvl = 4;
}
return next_lvl;
}
Ответы (2 шт):
Метод расчёта уровня по income можно сделать статическим. Для вывода сообщения о повышении уровня можно сделать другой метод, в котором будет проверяться, что уровень увеличился. Насколько я понял, вы хотите что-то такое получить?
protected int next_lvl = 1;
protected static int LVL_UP(int income) {
if (income >= 15 && income <= 20) {
return 2;
} else if (income >= 21 && income <= 40) {
return 3;
} else if (income >= 41 && income <= 60) {
return 4;
}
return 1;
}
void printIfLeveledUp(int income) {
int new_lvl = LVL_UP(income);
if (new_lvl > next_lvl) {
next_lvl = new_lvl;
System.out.println(next_lvl);
}
}
Опишу свою идею в ответе. Надеюсь, что вы найдете тут что-то для решения своей проблемы:
У вас так или иначе должен быть класс Player, который обладает этими уровнями и так далее, поэтому все вычисления уровня и прибавления опыта лучше реализовать внутри этого класса, а не внутри функций, обозначающих действия игрока.
public class Player
{
private int exp_points = 0;
public void addExperience(int income)
{
this.exp_points += income;
if (this.exp_points < 0)
this.exp_points = 0;
}
public int getLevel()
{
if (this.exp_points < 15)
return 1;
else if (this.exp_points <= 20)
return 2;
else if (this.exp_points <= 40)
return 3;
else if (this.exp_points <= 60)
return 4;
return 5;
}
}
Или аналогично:
public class Player
{
private int exp_points = 0;
private int lvl = 1;
public void addExperience(int income)
{
this.exp_points += income;
if (this.exp_points < 0)
this.exp_points = 0;
this.updateLevel();
}
private void updateLevel()
{
if (this.exp_points < 15)
this.lvl = 1;
else if (this.exp_points <= 20)
this.lvl = 2;
else if (this.exp_points <= 40)
this.lvl = 3;
else if (this.exp_points <= 60)
this.lvl = 4;
else
this.lvl = 5;
}
public int getLevel()
{
return this.lvl;
}
}
Тогда при реализации функции, обозначающей действие игрока, можно использовать уже реализованные в классе методы:
void playerAction1(Player player)
{
//...
player.addExperience(15);
}
Если при этом вы хотите проверять, получил ли игрок новый уровень, то это можно достичь отдельным методом или, например, так:
public class Player
{
private int exp_points = 0;
private int lvl = 1;
public boolean addExperience(int income)
{
this.exp_points += income;
if (this.exp_points < 0)
this.exp_points = 0;
return this.updateLevel();
}
private boolean updateLevel()
{
int old_lvl = this.lvl;
if (this.exp_points < 15)
this.lvl = 1;
else if (this.exp_points <= 20)
this.lvl = 2;
else if (this.exp_points <= 40)
this.lvl = 3;
else if (this.exp_points <= 60)
this.lvl = 4;
else
this.lvl = 5;
return (this.lvl > old_lvl);
}
public int getLevel() {}
}
void playerAction1(Player player)
{
//...
if (player.addExperience(15))
//...
}