2010-08-19 8 views
6

저는 C#으로 포커 프레임 워크를 작성 중이며 현재 가지고있는 디자인이 마음에 들지 않습니다. 내 목표는 일괄 모드에서 서로에 대해 여러 AI 에이전트를 매우 빠르게 재생할 수있는 게임 엔진을 사용하고 여러 AI 에이전트를 재생하는 것입니다 (아마도 Silverlight 클라이언트를 통해). 효율성을 높게 유지하면서 유연성을 유지하고 싶습니다. 예를 들어 리미트 홀덤, 노 리미트 홀덤, 리미트 7 카드 스터드 등의 게임을 할 수 있어야합니다.더 나은 C# 포커 프레임 워크 디자인?

현재 디자인

  • HandHistory : 다소 투박하고 유연성있는 현재 손에 대한 모든 정보 (선수, 만들어 내기 등)
  • 아이 플레이어를 포함합니다 : 모든 플레이어가 GetAction (HandHistory 역사) 메소드를 정의합니다.
  • GameEngine : HandHistory 개체를 반환하는 Play (HandInfo 정보) 메서드를 정의합니다.
  • PotManager : Pot을 관리하고 각 플레이어가 호출해야하는 양과 승리 할 수있는 양을 결정합니다 (예 : 불균등 스택이 있고 올인 인 경우).
  • BetManager : 베팅을 관리하고 베팅 라운드가 완료된 시점을 결정합니다.

HandInfo 클래스에는 손을 설정하는 방법에 대한 모든 정보가 들어 있습니다. 재생 방법은 다음과 같은 :

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

냄비 및 베팅 관리자 클래스 악몽이되어 변함 버그으로 가득되는 등, 블라인드를 수집 같은 고려해야 할 많은 작은 일들이 존재하기 때문에 문제가 발생 . 또한, 내 엔진 디자인은 다른 게임과는 달리 하나의 게임 유형 (Hold'em) 만 지원합니다.

엔진이 수십억 개가 넘는 인공 지능 시뮬레이터로 주로 사용되므로 효율성 측면에서 내 우선 순위가 가장 먼저 나옵니다. 그러나 이것이 가능할 수있는보다 우아한 방법이 있다고 생각하고 싶습니다.

답변

3

내 첫번째 생각은 첫째, 가독성과 중복의 부족에 대한 코드, 그리고 효율성 무엇을 의미 인 내가 가정 (성능 최적화) 마지막. 일반적으로 성능 병목이 어디에 있는지 예측하기는 어렵습니다. 버그가 있거나 유지하기 어려운 시스템보다 약간 느린 앱이 좋습니다. 빠른 속도가 아니라면 최적화 할 준비가되었을 때 dotTrace과 같은 제품을 사용하는 것은 쉽습니다.

기능 추가를 원하시는 분께서는 refactoring에서 개선하는 것이 좋습니다. 그것이 TDD의 핵심 잣대 중 하나입니다. 최소한의 코드를 작성하여 기능을 완성한 다음 코드 냄새를 리팩터링하십시오. 그리고 TDD를 사용하여 Stud를 구현할 때 Hold가 여전히 작동하는지 확인할 수 있습니다.

리팩터링을 시작하기에 좋은 장소는 이미 유지 관리 문제가있는 것처럼 들리므로 각 클래스가 단일 책임을 지도록하십시오 (SOLID priciples 첫 번째). 예제 메소드에는 베팅, 거래, 게임 기록 등 많은 책임이 있습니다.

+0

위의 @ Lachlan의 게시물 외에 중복성 부족으로 최적화 할 것을 제안합니다. –

+0

나는 "일을 먼저 만든 다음 빨리"일반적으로 동의합니다. 그러나 성능이 중요한 부분 인 경우 (대다수의 시뮬레이션에서와 같이) 일반적으로 몇 가지 예측 (얼마나 자주 필요합니까?)을 작성하고 프로토 타입을 작성하여 특정 작업의 소요 시간에 대한 첫 번째 추정을 얻는 것이 도움이됩니다. 때로는 멋진 OO 디자인이 정말 빨리 듣기 때문에 들립니다. 그리고, 나는 두려워, 때로는 정확히 이것을 필요로합니다. 그러나 이것이 정말로 당신을위한 경우인지 확인하십시오! – Philipp

0

준비가 완료된 텍사스 홀덤 7 및 5 카드 평가자의 예는 here이며 자세한 내용은 here입니다. 이는 실적에 도움이 될 수 있습니다. 모든 의견은 전자 메일 주소에서 환영합니다.

관련 문제