2010-08-19 9 views
6

Piszę framework do pokera w C# i nie podoba mi się projekt, który mam obecnie. Moim celem jest posiadanie silnika gry, który może bardzo szybko rozgrywać ze sobą wiele agentów AI w trybie wsadowym i grać wielu agentów AI kontra wielu ludzi (prawdopodobnie za pośrednictwem klienta Silverlight). Chciałbym utrzymać wydajność na wysokim poziomie, ale zachować elastyczność - np. Powinno być w stanie grać w takie gry, jak Limit Hold'em, No-Limit Hold'em, limit 7-card Stud itp.A Better C# Poker Framework Design?

Mój obecny projekt jest raczej niezgrabne i nieelastyczne:

  • HandHistory: Zawiera wszystkie informacje na temat bieżącej strony (graczy w zakłady dokonane, etc.)
  • iPlayer: Każdy gracz definiuje metodę getAction (historia HandHistory).
  • GameEngine: Definiuje metodę Play (informacje o HandInfo), która zwraca obiekt HandHistory.
  • PotManager: zarządza pulą i określa, ile każdego gracza musi sprawdzić i ile może wygrać (np. Jeśli ma nierówne stosy i wchodzi all-in).
  • BetManager: Zarządza zakładami i określa, kiedy runda zakładów zostanie zakończona.

Klasa HandInfo zawiera wszystkie informacje dotyczące konfiguracji ręki. Metoda play wtedy wyglądać tak:

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; 
} 

Problemy pojawiają się, ponieważ istnieje tak wiele małych rzeczy do rozważenia, jak zbieranie rolety itp garnka i postawić klasy menedżera stać się koszmarem i są niezmiennie usiane błędami . Ponadto mój projekt silnika obsługuje tylko jeden typ gry (Hold'em) w przeciwieństwie do innych.

Mój główny ranking to przede wszystkim wydajność, ponieważ silnik jest używany przede wszystkim jako symulator sztucznej inteligencji przez miliardy rąk. Jednak chciałbym myśleć, że istnieje bardziej elegancki sposób, w jaki można to zrobić.

Odpowiedz

3

Moja pierwsza myśl to, kod dla czytelności i braku redundancji pierwszy i optymalizacji pod kątem wydajności (co zakładam jest to, co masz na myśli efektywność) ostatni, ubiegły, zeszły. Zazwyczaj trudno jest przewidzieć, gdzie będą występować wąskie gardła, a nieco wolniejsza aplikacja jest lepsza niż system buggy lub nieosiągalny. Gdy będziesz gotowy do optymalizacji, możesz łatwo użyć produktu takiego jak dotTrace, jeśli uznasz, że nie jest wystarczająco szybki.

Odnośnie chęci dodania funkcjonalności, polecam stać się lepszym pod numerem refactoring. To jedna z głównych zasad TDD: napisać najmniejszą ilość kodu, aby uzupełnić element funkcjonalności, a następnie zrestrukturyzować wszelkie zapachy kodu. Za pomocą TDD możesz upewnić się, że po zaimplementowaniu, powiedzmy, Stud, Twój Hold'em nadal działa.

Dobre miejsce na rozpoczęcie refaktoryzacji, ponieważ wygląda na to, że już masz problemy z konserwacją, należy upewnić się, że każda klasa ma jedną odpowiedzialność (pierwsza z SOLID priciples). Twoja przykładowa metoda ma wiele obowiązków: obstawianie, rozdawanie, historia gier itp.

+0

Oprócz posta @ Lachlana powyżej sugerowałbym optymalizację z powodu braku nadmiarowości. –

+0

Zgadzam się z "najpierw spraw, aby działało, potem szybko". Jeśli jednak wydajność jest istotną częścią (jak w wielu symulacjach), zwykle pomocne jest dokonanie pewnych szacunków (co będzie potrzebne jak często?) I może napisanie prototypu, aby uzyskać pierwszą ocenę tego, jak długo trwają pewne rzeczy. Ponieważ czasami słychać miły projekt OO, aby uzyskać NAPRAWDĘ szybko. I obawiam się, że czasami potrzebujesz tego. Ale sprawdź, czy rzeczywiście tak jest w twoim przypadku! – Philipp

0

Przykład gotowej wycinanki Texas Hold'em w wersji 7- i 5-kartowej można znaleźć pod numerem here i dalej wyjaśnić: here. Może to pomóc w osiągnięciu wydajności. Wszystkie opinie są mile widziane na adres e-mail w nim znaleziony.