Я пишу покерный фреймворк на C #, и мне не нравится дизайн, который у меня сейчас есть. Моя цель состоит в том, чтобы иметь игровой движок, который может очень быстро играть несколькими агентами ИИ друг против друга в пакетном режиме и играть несколькими агентами ИИ против нескольких людей (вероятно, через клиента Silverlight). Я хотел бы поддерживать высокую эффективность, но сохранять гибкость - например, он должен уметь играть в такие игры, как лимитный холдем, безлимитный холдем, лимитный 7-карточный стад и т. Д.
Мой текущий дизайн довольно неуклюжий и негибкий:
- HandHistory: содержит всю информацию о текущей руке (игроки, сделанные ставки и т. Д.)
- IPlayer: каждый игрок определяет метод GetAction (история HandHistory).
- GameEngine: определяет метод Play (информация о HandInfo), который возвращает объект HandHistory.
- PotManager: управляет банком и определяет, сколько должен сделать колл каждого игрока и сколько он может выиграть (например, если у него неравные стеки и олл-ин).
- BetManager: управляет ставками и определяет, когда заканчивается круг торговли.
Класс HandInfo содержит всю информацию о том, как настроить руку. Тогда метод Play выглядит примерно так:
HandHistory Play(HandInfo info)
{
PotManager pots = new PotManager(info);
BetManager bets = new BetManager(info);
HandHistory history = CreateHistory(info);
bets.CollectBlinds();
if(!bets.GameOver)
{
DealHoleCards();
if(bets.PlayersThatCanStillBet > 1)
bets.CollectBets();
if(!bets.GameOver)
{
DealFlop();
... and on and on
}
}
return history;
}
Проблемы возникают из-за того, что нужно учесть множество мелочей, таких как сбор блайндов и т. Д. Классы менеджеров банка и пари становятся кошмаром и неизменно пронизаны ошибками. Кроме того, мой дизайн движка поддерживает только один тип игры (Холдем) в отличие от других.
Мой главный рейтинг - в первую очередь по эффективности, поскольку движок используется в основном в качестве симулятора искусственного интеллекта на миллиардах рук. Однако я хотел бы подумать, что есть более элегантный способ сделать это.