Domanda

Sto scrivendo un quadro di poker in C # e non mi piace il design ho attualmente. Il mio obiettivo è quello di avere un motore di gioco che può giocare più agenti di intelligenza artificiale contro l'altro in modalità batch molto rapidamente, e giocare più agenti AI vs multipli esseri umani (probabilmente tramite un client Silverlight). Mi piacerebbe mantenere alta efficienza, ma mantenere flexibility-- per esempio, dovrebbe essere in grado di giocare a giochi come Limit Hold'em, No-Limit Hold'em, Limit 7-Card Stud, ecc.

Il mio progetto attuale è piuttosto goffo e poco flessibile:

  • HandHistory: contiene tutte le informazioni sulla mano corrente (. Giocatori, le scommesse fatte, ecc)
  • IPlayer:. Ogni giocatore definisce un metodo getAction (storia HandHistory)
  • GameEngine:. Metodo definisce una Play (HandInfo info) che restituisce un oggetto HandHistory
  • PotManager:. Gestisce la pentola e determina la quantità di ogni giocatore deve chiamare e quanto possono vincere (ad esempio, se hanno stack diseguali e sono all-in)
  • BetManager:. Gestisce le scommesse e determina quando un giro di scommesse è terminato

La classe HandInfo contiene tutte le informazioni su come impostare la mano. Il metodo di esecuzione appare quindi 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 pentola e classi Gestore scommesse diventano un incubo e sono invariabilmente crivellati di bug. Inoltre, il mio disegno di motore supporta solo un tipo di gioco (Hold'em) al contrario di altri.

La mia classifica principale è prima per l'efficienza, come il motore viene utilizzato principalmente come un simulatore di AI nel corso di miliardi di mani. Tuttavia, mi piacerebbe pensare che ci sia un modo più elegante che questo potrebbe essere fatto.

È stato utile?

Soluzione

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) scorso. Di solito è difficile prevedere dove saranno i colli di bottiglia di prestazioni, e un'applicazione leggermente più lento è meglio di un buggy o sistema impossibile da mantenere. E 'facile da usare un prodotto come dotTrace quando si è pronti ad ottimizzare, se lo trovate isn 't abbastanza veloce.

Per quanto riguarda il vostro desiderio di aggiungere funzionalità, vi consiglio di diventare meglio a refactoring . Questo è uno dei principali di priciples TDD: scrivere la quantità minima di codice per completare un pezzo di funzionalità, quindi refactoring qualsiasi codice odori. E utilizzando TDD, è possibile fare in modo che quando si implementa, diciamo, Stud, il vostro Hold'em funziona ancora.

Un buon posto per iniziare con il refactoring, dal momento che suona come è già in esecuzione in problemi di manutenibilità, è quello di cercare di garantire che ogni classe ha una sola responsabilità (il primo della priciples SOLID ). Il tuo metodo esempio ha molte responsabilità:. Scommesse, intermediazione, storia del gioco, etc

Altri suggerimenti

Mi è piaciuto molto il IOpponent interfaccia che è stato scritto da John Gietzen per il torneo Battleship AI. Vorrei dare un'occhiata al suo quadro di qualche ispirazione.

Qual è il miglior Battleship AI?

Oh, e di recente ho visto questo: http: //visualstudiogallery.msdn. microsoft.com/en-us/ba4638ad-a2d2-49e5-ae46-94e0f747cae0?SRC=VSIDE

Un esempio di un ready made Texas Hold'em 7 e valutatore di 5 carte possono essere trovati qui e ulteriormente spiegato href="http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html" qui . Questo potrebbe aiutare con le prestazioni. Tutte le valutazioni di benvenuto presso l'indirizzo di posta elettronica ha trovato in esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top