2010-08-19 13 views
6

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.

risposta

3

Il mio primo pensiero è, il codice per migliorare la leggibilità e la mancanza di ridondanza prima, e ottimizzare le prestazioni (che presumo è quello che si intende per efficienza) ultimo. Di solito è difficile prevedere dove saranno i colli di bottiglia delle prestazioni e un'app leggermente più lenta è meglio di un sistema bacato o non gestibile. È facile utilizzare un prodotto come dotTrace quando sei pronto per ottimizzare, se trovi che non è abbastanza veloce.

Per quanto riguarda il desiderio di aggiungere funzionalità, consiglio di migliorare con lo refactoring. Questo è uno dei principi fondamentali di TDD: scrivere la quantità minima di codice per completare una funzionalità, quindi rifattorizzare gli odori di codice. E usando TDD, puoi assicurarti che quando applichi, per esempio, Stud, il tuo Hold'em funzioni ancora.

Un buon punto di partenza per il refactoring, poiché sembra che si stiano già verificando problemi di manutenibilità, è cercare di garantire che ogni classe abbia una singola responsabilità (la prima delle SOLID priciples). Il tuo metodo di esempio ha molte responsabilità: scommesse, scambi, cronologia di gioco, ecc.

+0

Oltre al post di @Lachlan in alto, suggerirei di ottimizzare la mancanza di ridondanza. –

+0

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

0

Un esempio di un valutatore a 7 e 5 carte Texas Hold'em già pronto può essere trovato here e ulteriormente spiegato here. Questo potrebbe aiutarti con le prestazioni. Tutti i feedback sono benvenuti all'indirizzo e-mail in esso contenuto.