@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты

Как правильно посчитать бонусы в карточной игре?

Доброго времени суток, Тостер!

Чтобы подтянуть свои знания, занялся разработкой коллекционной карточной игры. По задумке должно получиться что-то среднее между Heartstone и Gwint. Два игрока, у каждого есть своя колода и рука (карты в быстром доступе, так сказать), есть игровое поле, разделенное на четыре линии у каждого игрока. Каждая карта обладает своими характеристиками и специальными бонусами. Все, в-общем, стандартно. Разметив более менее баланс игры, я приступил к разработке и столкнулся с рядом проблем, где особняком стоит расчет бонусов на каждую карту. Например, если две карты с одинаковым бонусом лежат рядом, то у каждой карты увеличивается определенная характеристика на несколько пунктов.
Сейчас у меня есть класс Card с характеристиками карты, класс Field (игровое поле игрока). Проблема в том, что я не знаю как лучше рассчитывать бонусы. Пока идея такая: у класса Card добавить список бонусов, которые распространяются на эту карту и при любом действии пересчитывать этот список для всех карт.
Но что-то мне подсказывает, что можно сделать проще. Может, кто-то разрабатывал нечто похожее и поможет дельным советом? Ну и я всегда буду рад качественной литературе по программированию компьютерных игр.
  • Вопрос задан
  • 281 просмотр
Пригласить эксперта
Ответы на вопрос 3
terrier
@terrier
Выглядит как PubSub-задача. Допустим у нас есть карта "Король гоблинов" 5/5 таунт, класс - гоблины.
Когда мы кладем ее на стол она ( в смысле соответствующий объект ) отписывается от канала "для тех, кто лежит в руке" и подписывается на каналы "Лежим на столе", "Класс - гоблины", "Карты с таунтом" и тэ дэ.
И посылает в соответствующие каналы сообщение - "Я 5/5 гоблин пришел на стол на такую-то позицию".

Таким образом мы можем баффать гоблинов, уничтожать вражеские таунты или баффать соседей по столу без перебора всех карт. Ну и добавление новых эффектов тоже с меньшей болью происходит
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
Я думаю, лучше обрабатывать с другой стороны - в игровом поле иметь список карт и список применённых бонусов. При использовании карты изменять характеристики как самой карты, так и игрового поля. И возможно, что придётся перерасчитывать каждую карту (зависит от применённой карты). Взяв карту и обработав её, игровое состояние сразу станет изменённым, и не нужно будет при каждой проверке перепроверять состояния каждой карты.
Ответ написан
@dmitryKovalskiy
программист средней руки
Если решать немножко в лоб. Предположим у вас не класс Card а иерархия классов ICard для каждого класса или типа карты(тут уже полно фантазии для реализации). И весь этот зоопарк классов реализует интерфейс IBonus с методом StartBonusEffect который на вход получает ссылку на окружение(класс доски, из которого можно вытащить свои карты или оппонента, жизни каждого игрока и прочее). А в реализации этого метода можете уже куражиться как хотите. Выиграть, проиграть, убить всех оппонентов, сделать своих имбами, и т.д. и т.п.

Ну это на коленке если набросать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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