Sto scrivendo una struttura di poker in C# e non mi piace il design che attualmente ho. Il mio obiettivo è quello di avere un motore di gioco in grado di giocare più agenti di IA l'uno contro l'altro in modalità batch molto rapidamente, e giocare più agenti AI contro più umani (probabilmente tramite un client Silverlight). Mi piacerebbe mantenere alta l'efficienza ma mantenere la flessibilità, ad esempio, dovrebbe essere in grado di giocare a Limit Hold'em, No-Limit Hold'em, Limit 7-card Stud, ecc.Un design per framework di poker migliore C#?
Il mio attuale design è piuttosto goffo e poco flessibile:
- HandHistory: contiene tutte le informazioni sulla mano corrente (attori, le scommesse fatte, ecc)
- IPlayer: Ogni giocatore definisce un metodo getAction (storia HandHistory).
- GameEngine: definisce un metodo Play (informazioni HandInfo) che restituisce un oggetto HandHistory.
- PotManager: Gestisce il piatto e determina quanto ogni giocatore deve chiamare e quanto può vincere (ad esempio, se ha stack disuguali e è all-in).
- BetManager: gestisce le scommesse e determina quando un round di scommesse è finito.
La classe HandInfo contiene tutte le informazioni su come impostare la mano. Il metodo di esecuzione appare poi qualcosa di simile:
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;
}
I problemi sorgono perché ci sono tante piccole cose da considerare come la raccolta le persiane, ecc Le classi di gestione Pot e la scommessa diventano un incubo e sono invariabilmente pieni di bug . Inoltre, il mio design del motore supporta solo un tipo di gioco (Hold'em) rispetto ad altri.
La mia classifica principale è in primo luogo per l'efficienza, in quanto il motore viene utilizzato principalmente come un simulatore di intelligenza artificiale per miliardi di mani. Tuttavia, mi piacerebbe pensare che ci sia un modo più elegante per farlo.
Oltre al post di @Lachlan in alto, suggerirei di ottimizzare la mancanza di ridondanza. –
Sono d'accordo con "prima farlo funzionare, quindi renderlo veloce" in generale. Tuttavia, se le prestazioni sono una parte importante (come in molte simulazioni), di solito è utile fare alcune stime (cosa sarà necessario con quale frequenza?) E magari scrivere un prototipo per ottenere una prima stima di quanto tempo durano certe cose. Perché a volte si sente un buon design OO per essere REALMENTE veloce. E, temo, a volte ti serve esattamente questo. Ma per favore controlla se questo è davvero il tuo caso! – Philipp