@NoAlazar

Как решить эту задачку?

Недавно наткнулся в на задачку по Java, вроде ничего сложного, но меня поставила в тупик.
Сама задача:
Есть N монстров. У каждого из монстров есть n жизней, целых чисел. И есть охотник который стреляет в каждом цикле в самого "жирного" монстра. Вывести порядок в котором побеждаются монстры.

Если я правильно понимаю, то это должен быть массив монстров с жизнями и каждый цикл происходит "выстрел".
  • Вопрос задан
  • 255 просмотров
Решения вопроса 1
@whatislov
У меня как-то так получилось. Немного доработал условие, чтобы интереснее было.
Смысл программы:
Монстры находятся в списке, список каждую итерацию сортируется(по убыванию жизней). У охотника имеется какое-то количество патрон и он имеет урон наносимый за один выстрел(сколько за один выстрел отнимаем жизней у монстра). Охотник делает выстрел и от жизни самого "жирного" монстра(который всегда будет находиться на 0 позиции списка) отнимается урон охотника. После чего делается проверка на количество жизней монстра, если их меньше 0, то удаляем монстра из списка и выводим сообщение о том, что он побежден.
Если у охотника остаются патроны и все монстры побеждены(список монстров пуст), то охотник победил, иначе победили монстры(патронов у охотника нет, а список не пуст).
Код конечно некрасивый и скорее все неэффективный(из-за постоянной сортировки списка монстров), так как сам ещё учусь, но может Вам поможет. С радостью приму советы по коду.

Файл Monster.java
class Monster implements Comparable<Monster>{
	private String nameMonster;
	//количество жизней монстра
	private int health;
	
	public Monster(int health){
		nameMonster = "unknown";
		this.health = health;
	}
	
	public Monster(String name, int health){
		nameMonster = name;
		this.health = health;
	}
	
	public void setHealth(int health){
		this.health = health;
	}
	
	public String getName(){
		return nameMonster;
	}
	
	public int getHealth(){
		return health;
	}
	
	public int compareTo(Monster m){
		return m.getHealth() - this.health;
	}
	
	@Override
	public String toString(){
		return "Имя: " + nameMonster + ", жизни: " + health;
	}
}


Файл Hunter.java
class Hunter{
	private String nameHunter;
	// количество патрон
	private int numOfBullets;
	// урон наносимый за один выстрел
	private int damage;
	
	public Hunter(int numOfBullets){
		this.numOfBullets = numOfBullets;
	}
	
	public Hunter(String nameHunter, int numOfBullets){
		this.nameHunter = nameHunter;
		this.numOfBullets = numOfBullets;
	}
	
	public Hunter(String nameHunter, int numOfBullets, int damage){
		this.nameHunter = nameHunter;
		this.numOfBullets = numOfBullets;
		this.damage = damage;
	}
	
	public int shot(){
		numOfBullets--;
		System.out.println("патрон осталось: " + numOfBullets);
		return damage;
	}
	
	public int getNumOfBullets(){
		return numOfBullets;
	}
	
	@Override
	public String toString(){
		return "Охотник:" + nameHunter + "\nКоличество патрон:" + numOfBullets + "\n";
	}
}


Файл MainClass.java
import java.util.ArrayList;
import java.util.Collections;

public class MainClass{
	public static void main(String[] args){
		//объект класса охотник
		Hunter hunter = new Hunter("Sebastian", 5, 5);
		
		//список монстров
		ArrayList<Monster> listMonster = new ArrayList<>();
		
		listMonster.add(new Monster("Скелет", (int)(((Math.random() * (10 - 1)) + 1))));
		listMonster.add(new Monster("Призрак", (int)(((Math.random() * (10 - 1)) + 1))));
		listMonster.add(new Monster("Зомби", (int)(((Math.random() * (10 - 1)) + 1))));
		
		System.out.println(hunter);
		
		while(hunter.getNumOfBullets() > 0){
			Collections.sort(listMonster);
			
			System.out.println(listMonster);
			
			//всегда будем стрелять в самого жирного монстра
			Monster monster = listMonster.get(0);
			
			System.out.print("Охотник выстрелил в " + monster.getName() + ", ");
			monster.setHealth(monster.getHealth() - hunter.shot());
				
			// если у монстра не осталось жизней, то удаляем его из списка	
			if(monster.getHealth() <= 0){
				System.out.println("Монстр " + monster.getName() + " убит");
				listMonster.remove(monster);
			}		
			
			// если список пуст, то все монстры убиты
			if(listMonster.isEmpty()){
				System.out.println("Все монстры убиты");
				return;
			}	
		}	
		//если все патроны потрачены, то охотник проиграл
		System.out.println("Монстры победили, охотнику не хватило патрон");		
	}
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dementor
программист, архитектор, аналитик
Есть N монстров. У каждого из монстров есть n жизней, целых чисел. И есть охотник который стреляет в каждом цикле в самого "жирного" монстра. Вывести порядок в котором побеждаются монстры.

Давай включим логику.
1) Что будет происходить с монстром, у которого n жизней, после выстрела? У него станет n-1 жизней или он умрет (ноль жизней).
2) Если с более жирного (на фоне остальных) снять жизни, то каким он станет? Он станет менее жирным (на фоне остальных). Т.е. на следующих циклах в него будут стрелять только при условии, что его количество жизней больше или равно другим.
3) Что мы закономерно имеем ближе к концу? Из-за отстрелов "живучести" мы получаем линейку из все тех же самых изначальных N монстров, только теперь у каждого из них по 1 жизни. Рубикон! С этого момент каждый выстрел приводит к смерти монстра.

Если нет правила по выбору монстра для стрельбы, то просто выводи их по очереди - это и будет верный ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы