J'écris un cadre de poker en C # et je n'aime pas la conception que j'ai actuellement. Mon objectif est d'avoir un moteur de jeu pouvant jouer de multiples agents AI les uns contre les autres en mode batch très rapidement et de jouer à plusieurs agents d'AI par rapport à plusieurs humains (probablement via un client Silverlight). J'aimerais garder l'efficacité élevée, mais maintenir la flexibilité, par exemple, il devrait être capable de jouer à des jeux comme Limit Hold'em, sans limite Hold'em, limite 7-Card Stud, etc.
Ma conception actuelle est plutôt clunky et inflexible: p>
La classe Handinfo contient toutes les informations sur la manière de configurer la main. La méthode de jeu ressemble à quelque chose comme ceci: p> Les problèmes se posent car il y a tellement de petites choses à considérer comme ramasser les stores, etc. Les cours de Pot et de Bet Manager deviennent un cauchemar et sont invariablement criblés de bugs. En outre, ma conception du moteur prend en charge un type de jeu (Hold'em) par opposition aux autres. P> Mon classement principal est d'abord pour l'efficacité, car le moteur est utilisé principalement comme un simulateur AI sur des milliards de mains. Cependant, j'aimerais penser qu'il existe une manière plus élégante que cela pourrait être fait. P> p>
3 Réponses :
J'ai vraiment aimé l'interface Quel est le meilleur cuir de bataille AI? P>
Oh et j'ai récemment vu ceci:
http: //visualsturogallery.msdn. Microsoft.com/EN-US/BA4638AD-A2D2-49E5-AE46-94E0F747CAE0?SRC=Vside P> iopponent code> écrit par
John Gietzen Code> pour le Battleship Ai Tourney. Je regarderais son cadre pour une inspiration. P>
Ma première pensée est, code de lisibilité et manque de redondance en premier, et optimiser les performances (que je suppose, c'est ce que vous entendez par efficacité) en dernier. Il est généralement difficile de prévoir que le cou de la bouteille de performance sera, et une application légèrement plus lente est meilleure qu'une buggy ou un système immunitaire. Il est facile d'utiliser un produit comme DotTrace lorsque vous êtes prêt à optimiser, si vous le trouvez ISN 't assez rapide. p>
En ce qui concerne votre désir d'ajouter une fonctionnalité, je vous recommande de devenir meilleur à refactoring . C'est l'un des principaux croyances de TDD: écrivez le moins de code pour compléter un morceau de fonctionnalité, puis refroidissez tout code sent. Et en utilisant TDD, vous pouvez vous assurer que lorsque vous implémentez, disons, Stud, votre Hold'em fonctionne toujours. P>
Un bon endroit pour commencer avec votre refactoring, car il semble que vous rencontriez déjà des problèmes de maintenabilité, c'est essayer de vous assurer que chaque classe a une seule responsabilité (le premier des Solid Popers ). Votre exemple de méthode a de nombreuses responsabilités: parier, traiter, historique du jeu, etc. p>
En plus de la publication de @ Lachlan ci-dessus, je suggérerais d'optimiser le manque de redondance.
Je suis d'accord avec "d'abord le faire fonctionner, puis le rendre rapide" en général. Toutefois, si la performance est une partie importante (comme dans de nombreuses simulations), il est généralement utile de faire quelques estimations (ce qui aura besoin de la fréquence à laquelle?) Et peut-être écrire un prototype pour obtenir une première estimation sur la durée de la durée de certaines choses. Parce que parfois, une belle conception oo est entendue pour devenir vraiment rapide. Et j'ai peur, parfois, vous avez besoin exactement de cela. Mais s'il vous plaît vérifier si c'est vraiment le cas pour vous!
Un exemple d'un évaluateur de Texas Hold'em TeXas Hold'em 7 et 5 est prêt à être trouvé ici et expliqué davantage ici A >. Cela pourrait vous aider avec la performance. Tous les commentaires bienvenus à l'adresse e-mail qui y sont trouvés. P>