You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Данный проект представляет собой систематизацию знаний, полученных после написания мейнстримных консольных игр: змейка,морской бой, просто в один день пришло в голову, что я хотел бы написать свою "игрушку", где персонажи бы дрались между собой, выясняя у кого круче яйца. Хоть папку я и назвал Console_RPG_fight по своей сути это не игра, а просто симуляция гладиаторского боя между двумя ботами с разными особенностями и рандомизированными попаданиями по врагу(присутствует логика парирования ударов).
Данный проект позволил мне:
Попрактиковаться в создании своего виртуального класса
Продумать логику программы:как я вижу реализацию данной симуляции
Применить лямбда-функцию
Классы бойцов
Класс
Параметры
Урон персонажей из main()
Тип класса
Character
Имя; Особенность; Отображение; Уровень здоровья; Урон в ближнем бою; Тип оружия; Координаты на арене.
-
Базовый виртуальный класс
Warrior
Название брони; Урон выстрелом из арбалета; Защита брони(+HP к текущему уровню); Острота клинка(+DMG к урону ближней атакой).
Ближняя атака - 30 Дальняя атака - 10
Производный
Orc
Раса; Дополнительный урон в зависимости от расы.
Ближняя атака - 40
Производный
Magician
Сила, которой повелевает маг; Урон магической атакой.
Ближний бой - 10 Дальняя атака - 25
Производный
Перемещение по арене
Разрешается перемещаться только на 1 клетку в любую из 4 сторон:вверх/вниз,вправо/влево. Перемещение по диагонали запрещено,т.к. я посчитал что это было бы нечестно, ведь перемещение по диагонали это шаг сразу и по x и по y, а это уже читерство,поэтому BANNED!
Если персонажи находятся не в зоне видимости друг друга, то направление перемещения выбирается с помощью функции rand(),ограниченной по количеством статических констант enum{UP=0,DOWN=1,LEFT=2,RIGHT=3}. Функция реализующая изменение координат объявлена в базовом классе как void move(int dx,int dy,Character& o), в ней осуществляется проверка на незанятость следующей клетки с помощью функции, объявленной в этом же классе:bool isOccupied(int y, int x, Character& o). Таким образом, если клетка занята, то персонаж будет стоять на месте в текущей итерации, иначе сделает шаг по одной из осей. В файле main.cpp объявлены две функции, которые и вызываются в main(): void move_ch(int& d, Character& o, Character& check) и void move_ch_opposite(int& d, Character& o, Character& check). В первой функции содержится логика выбора направления движения, в то время как другая нужна для выбора противоположного направления, если в следующем шаге боец "должен пройти" сквозь стену.
Алгоритм для боя между классами Warrior и Orc
Для класса Warrior
Выбрать любое направление.
Если враг в поле досягаемости арбалетного болта, то атаковать врага из арбалета.
Если врага можно атаковать вблизи, проверить кто наносит удар в цикле if(), если ведьмак, то снять HP у азога, если азог, то вывести сообщение о том, что ведьмак парировал первую атаку.
Если враг нанес урон в ближнем бою, то отойти(бежать конечно тут не верно,ведь ведьмак никогда не бежит от резни).
Если у азога осталось 0 HP - вывести информацию что ведьмак победил.
Для класса Orc
Выбрать любое направление.
Если враг в области видимости орка, то преследовать его.
Если врага можно атаковать вблизи, проверить кто наносит удар в цикле if(), если азог, то снять HP у ведьмака, если ведьмак, то вывести сообщение о том, что азог заблокировал первую атаку.
Если у ведьмака 0 HP - вывести информацию что азог победил.
Алгоритм для боя между классами Orc и Magician
Для класса Orc
Выбрать любое направление.
Если враг в области видимости, то преследовать его.
Если врага можно атаковать вблизи, проверить кто наносит удар в цикле if(), если азог, то снять HP у мага, если маг, то вывести сообщение о том, что азог заблокировал атаку первую атаку.
Если у мага 0 HP - вывести информацию что азог победил.
Для класса Magician
Выбрать любое направление.
Если враг в поле досягаемости магической атаки, то запустить в него огненный шар.
Если врага можно атаковать вблизи, проверить кто наносит удар в цикле if(), если маг, то снять HP у азога, если азог, то вывести сообщение о том, что маг парировал первую атаку.
Если враг нанес урон в ближнем бою, то отбежать.
Если у азога осталось 0 HP - вывести информацию что маг победил.
Алгоритм для боя между классами Warrior и Magician
Для класса Warrior
Выбрать любое направление.
Если враг в поле досягаемости арбалетного болта, то атаковать врага из арбалета.
Если враг в поле зрения, то преследовать его.
Если врага можно атаковать вблизи, проверить кто наносит удар в цикле if(), если ведьмак, то снять HP у мага, если маг, то вывести сообщение о том, что ведьмак парировал первую атаку.
Если у мага осталось 0 HP - вывести информацию что ведьмак победил.
Для класса Magician
Выбрать любое направление.
Если враг в поле досягаемости магической атаки, то запустить в него огненный шар.
Если врага можно атаковать вблизи, проверить кто наносит удар в цикле if(), если маг, то снять HP у ведьмака, если ведьмак, то вывести сообщение о том, что маг парировал первую атаку.
Если враг нанес урон в ближнем бою, то отбежать.
Если у ведьмака осталось 0 HP - вывести информацию что маг победил.
Как улучшить проект?
Вынести реализацию функций OrcVSWarrior,OrcVSMagician,WarriorVSMagician в одну шаблонную функцию.
Продумать алгоритм ИИ более детально, сделать его УМНЕЕ.
Исправить функцию animateRemoteAttack(), поскольку количество шагов вычисляется с помощью вектора, а число получается не целым при стрельбе по диагонали из-за чего отображение на экране иногда корявое.
Вынести информацию о победителе в одну общую функцию showWinner(string name,int attack_type).
Добавить новые классы: вампир,гном,чудовище и т.д.