Viking & NanoPenis
Слышал, ты тут мастер цифрового боя, кодер. А не построим ли мы симулятор сражений, который по-настоящему передаст дух настоящего боя? Напишем как настоящую войну и посмотрим, кто победит. Что скажешь?
Конечно, давай устроим кодинг-батл. Создадим две армии в виде структур, пропишем каждому юниту здоровье, атаку и небольшой ИИ для принятия решений, а потом запустим цикл, где они будут обмениваться ударами до тех пор, пока одна из сторон не останется без сил. Начну лучше с основы цикла или сразу сделаем генератор случайных армий?
Начнём с основного цикла. Нужен чёткий ритм: атака, ответ, проверка здоровья – как отбой перед рейдом. Когда это станет надёжным, можно будет добавить генератор случайных армий как козырь. На каком языке ты лучше всего работаешь над этим? Ок. Цикл боя должен быть простым: пока у обеих армий есть юниты, выбираем по юниту из каждой, считаем урон, убираем погибших. Потом уже можно будет генерировать случайные армии для развлечения. На каком языке будешь делать?
Я для этого критичного, быстрого цикла возьму Rust, но если тебе нужно что-то быстро прототипировать, можем сначала на Python сделать. Выбирай, что тебе больше нравится, а я основу сделаю.
Ну что, "Раст" это будет — давай выкуем этот цикл, как настоящий клинок.
Слушай, ну вот реально, как это работает у тебя?
А1 бьёт Б1 на 5 урона (23 здоровья осталось).
Б1 отвечает и бьёт А1 на 7 урона (18 здоровья осталось).
А1 мёртв!
Б2 бьёт А2 на 4 урона (21 здоровья осталось).
А2 бьёт Б2 на 6 урона (14 здоровья осталось).
Б2 мёртв!
Армия Б победила!
Начало неплохое, код чистый. Один момент: используй изменяемые ссылки, чтобы не копировать юнит каждый ход. И, возможно, оберни логику атаки в функцию, чтобы можно было менять армии или добавлять юнитов, не переписывая цикл. Ещё подумай о добавлении случайного множителя урона – так каждое попадание будет ощущаться как настоящий удар. Продолжай доводить этот цикл до ума, и битва будет казаться живой.
Слушай, вот что получилось:
"Ну что, началось? А1 на B1 напал – нанёс 6 урона. У B1 осталось 22 здоровья. Теперь B1 в ответ на А1 – 7 урона, у А1 осталось 23 здоровья. А1 снова бьёт B1 – 5 урона. У B1 осталось 17. Теперь B2 на А1 – 4 урона, у А1 осталось 19 здоровья. А1 в ответ на B2 – 6 урона, у B2 осталось 14. А1 на B1 – 6 урона, у B1 осталось 11. B2 на А1 – 4 урона, у А1 осталось 15. А1 на B1 – 5 урона, у B1 осталось 6. B2 на А1 – 6 урона, у А1 осталось 9. А1 на B1 – 6 урона, у B1 осталось 0! B1 пал! А1 на B2 – 5 урона, у B2 осталось 9. B2 на А1 – 4 урона, у А1 осталось 5. А1 на B2 – 6 урона, у B2 осталось 3. B2 на А1 – 4 урона, у А1 осталось 1! А1 на B2 – 6 урона, у B2 осталось -3! B2 пал! Армия B победила!
Отличная работа, эта случайная манера удара добавляет ощущение настоящей битвы. Только небольшая доработка: вынеси генератор случайных чисел за пределы функции атаки, чтобы не создавать новый `thread_rng` при каждом попадании – это немного улучшит производительность и уменьшит задержки. И если хочешь добавить больше глубины, дай каждому юниту параметр скорости, и пусть более быстрые юниты бьют первыми. Держи планку!
Слушай, тут небольшая заруба вышла. "А1" твоего "Б1" завалил, потом "Б2" подрал "А2". "А1" потом тоже не удержался и отправил "Б1" на корм рыбам. В итоге твоя армия проиграла.