2010-08-19 19 views
6

Escribo un póker en C# y no me gusta el diseño que tengo actualmente. Mi objetivo es tener un motor de juego que pueda jugar múltiples agentes de IA uno contra el otro en modo por lotes muy rápidamente, y jugar múltiples agentes de IA contra múltiples humanos (probablemente a través de un cliente de Silverlight). Me gustaría mantener la eficiencia alta pero mantener la flexibilidad, por ejemplo, debería poder jugar juegos como Limit Hold'em, No-Limit Hold'em, Límite de 7 cartas Stud, etc.A Better C# Poker Framework Design?

Mi diseño actual es más bien torpe e inflexible:

  • HandHistory: contiene toda la información sobre la mano actual (jugadores en, las apuestas realizadas, etc.)
  • iPlayer: Cada jugador define un método getAction (historia HandHistory).
  • GameEngine: define un método Play (HandInfo info) que devuelve un objeto HandHistory.
  • PotManager: Administra el pozo y determina cuánto debe igualar cada jugador y cuánto puede ganar (por ejemplo, si tienen stacks desiguales y están all-in).
  • BetManager: Administra las apuestas y determina cuándo termina una ronda de apuestas.

La clase HandInfo contiene toda la información sobre cómo configurar la mano. El método de reproducción a continuación, se ve algo como esto:

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

Los problemas surgen porque hay tantas pequeñas cosas a considerar como la recogida de las persianas, etc. Las clases de administrador Pot y la apuesta se convierten en una pesadilla y son invariablemente plagados de errores . Además, el diseño de mi motor solo admite un tipo de juego (Hold'em) en comparación con otros.

Mi clasificación principal es la primera por eficiencia, ya que el motor se usa principalmente como un simulador de AI sobre miles de millones de manos. Sin embargo, me gustaría pensar que hay una forma más elegante de hacerlo.

Respuesta

3

Mi primer pensamiento es, el código para facilitar la lectura y la falta de redundancia en primer lugar, y optimizar el rendimiento (que supongo que es lo que entendemos por eficiencia) último. Por lo general, es difícil prever dónde se encontrarán los cuellos de botella de rendimiento, y una aplicación un poco más lenta es mejor que un sistema defectuoso o inmanejable. Es fácil usar un producto como dotTrace cuando esté listo para optimizar, si encuentra que no es lo suficientemente rápido.

En cuanto a su deseo de agregar funcionalidad, recomiendo mejorar en refactoring. Ese es uno de los principios básicos de TDD: escribir la menor cantidad de código para completar una pieza de funcionalidad, luego refactorizar el código huele. Y al usar TDD, puedes asegurarte de que cuando implemente, por ejemplo, Stud, tu Hold'em aún funcione.

Un buen lugar para comenzar con su refactorización, ya que parece que ya se está encontrando con problemas de mantenimiento, es tratar de garantizar que cada clase tenga una sola responsabilidad (la primera de SOLID priciples). Su método de ejemplo tiene muchas responsabilidades: apostar, repartir, historial del juego, etc.

+0

Además de la publicación de @ Lachlan, sugeriría la optimización por falta de redundancia. –

+0

Estoy de acuerdo con "primero haz que funcione, luego hazlo rápido" en general. Sin embargo, si el rendimiento es una parte importante (como en muchas simulaciones), generalmente es útil hacer algunas estimaciones (¿qué se necesitará con qué frecuencia?) Y quizás escribir un prototipo para obtener una primera estimación sobre el tiempo que tardan algunas cosas. Porque a veces se escucha un buen diseño OO para obtener REALMENTE rápido. Y, me temo, a veces necesitas exactamente esto. ¡Pero por favor verifique si este es realmente el caso para usted! – Philipp

0

Un ejemplo de un evaluador de Texas Hold'em de 7 y 5 tarjetas ya está disponible here y más información here. Esto podría ayudarte con el rendimiento. Todos los comentarios son bienvenidos en la dirección de correo electrónico que se encuentra allí.