Продолжаю экспериментировать в C# - программа для игры в 21 (очко)

Продолжаю экспериментировать в C# - программа для игры в 21 (очко)

Пока в курсе идут простые задания, я экспериментирую и умышленно усложняю себе задачу. Недавно наткнулся в Play Market на интересную игру Void Tyran, боевая механика данного рогалика завязана на игре в "очко".

Для тех кто не знает, 21 или "очко" - это карточная игра. Суть в том, что игроки поочереди берут карты, накапливая очки. Задача - набрать 21 или близкое к нему значение, но никак не больше - иначе проигрыш.

Так же и в Void Tyran, только вместо 21 стоит 12, а колода представляет из себя 24 карты (по 4 карты каждого значения от 1 до 6). Оба участника боя поочередно вытягивают карты из своей колоды накапливая очки, а когда оба решают остановиться - идет сравнение их результатов. Например, вы остановились на 11, а соперник на 8 - разница ровна 3 очкам. Значит, вы наносите по противнику три удара.

Согласитесь, что спустя десяток партий такая игра могла бы наскучить, но тут на помощь приходят особые карты. Какие то добавляют очки к результату, какие то усиливают атаку или защиту, а некоторые и вовсе обнуляют вражеский счетчик.

Void Tyran - геймплей
Void Tyran - геймплей

Игра зацепила и я решил повторить ее механику на C#, но для начала нужно сделать базу игры в "очко" до 12. Для начала накидал простой алгоритм, который дает игроку выбор - сделать бросок или остановиться.

База для игры в "очко"
База для игры в "очко"

Однако игра не имела смысла, потому что противник продолжал бросать пока не проиграет. Нужно "научить" его принимать решение, стоит ли останавливать выдачу или нет.

Шанс проиграть появляется в тот момент, когда сумма очков больше шести. Чем выше данный шанс, тем больше становится вероятность, что противник решит остановиться. Таким образом на 7-8 очках, он в большинстве случаев продолжит играть, но на 9-11 очках наверняка остановит свои броски.

Противник поднял лапки и остановился
Противник поднял лапки и остановился

Игра идет до тех пор, пока у одного из игроков не будет перебор или оба не выберут остановку. Во втором случае сравниваются результаты и тот у кого больше - побеждает.

Победа!
Победа!

В дальнейшем добавлю в данный алгоритм здоровье и урон наносимый в соответствии с разницей в очках у победителя и проигравшего. А вишенкой на торте станут карты...

Конечно, в консоли это выглядит не так впечатляюще, но сам алгоритм работает, а это значит что я уже не такой криворукий. В следующий раз попробую реализовать данную систему в GDevelop или Godot.

Низкий гоблинский поклон всем кто дочитал до конца статьи! Если вам интересно наблюдать за развитием новичка (или посмеиваться над банальными ошибками) - подписывайтесь на мой блог!

22
5 комментариев

На DTF только и разговоров что про очко...

2

Как говорится: «Сложнее всего пришлось разработчику игры 21. Ведь он целый год разрабатывал очко»

1

удачи, когда-то я тоже пытался в игры (на винформах), ни одного релиза у меня там не вышло по итогу

Я пока что просто экспериментирую, чтобы лучше понять язык. Тот же Void Tyran вывозит в первую очередь за счет дополнительных карт влияющих на бой, а так же визуально приятен глазу.

Я же лишь пытаюсь повторить сам алгоритм боевки, хотя в будущем может и дойдут руки сделать это в виде играбельного проекта.