Я пишу покерный фреймворк на C #, и мне не нравится дизайн, который у меня сейчас есть. , Моя цель состоит в том, чтобы иметь игровой движок, который может очень быстро играть несколькими агентами ИИ друг против друга в пакетном режиме и играть несколькими агентами ИИ против нескольких людей (возможно, через клиента Silverlight). Я хотел бы сохранить высокую эффективность, но сохранить гибкость - например, он должен уметь играть в такие игры, как лимитный холдем, безлимитный холдем, лимитный 7-карточный стад и т. д.
Мой нынешний дизайн довольно неуклюжий и негибкий:
Класс 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;
}
Проблемы возникают из-за того, что нужно учесть множество мелочей, таких как сбор блайндов и т. Д. Классы менеджеров Пот и Бет становятся кошмаром и неизменно пронизаны ошибками. Кроме того, мой дизайн движка поддерживает только один тип игры (Hold'em) в отличие от других.
Мой главный рейтинг - в первую очередь по эффективности, так как движок используется главным образом как симулятор ИИ на миллиардах рук. Однако я хотел бы думать, что есть более элегантный способ сделать это.