카드 게임은 어떻게 디자인합니까?


10

나는 카드 게임을위한 좋은 아키텍처를 생각 해낼 수 없다. 게임의 디자인 방식을 이해하려면 도움이 필요합니다.

먼저 게임 규칙을 설명하겠습니다.

게임 규칙

설정
  • 4 명의 선수가 있으며, 각각 2 명이 한 팀을 구성합니다.
  • 각 플레이어는 셔플 카드 12 장을받습니다
  • 탁자 (강)에는 4 장의 장님 카드가 있습니다
  • 플레이어 순서는 다음과 같습니다

여기에 이미지 설명을 입력하십시오

도박
  • 각 플레이어는 현재 내기보다 100에서 160 사이의 숫자를 통과하거나 선택할 수 있습니다
  • 첫 번째 플레이어와 서클에서 베팅이 시작되고 팀이 통과 할 때까지
  • 플레이어가 패스하면 더 이상 내기를 할 수 없습니다
  • 베팅 라운드에서 승리 한 팀은 게임에서 승리하기 위해 베팅과 동일한 포인트를 모아야합니다.
  • 베팅 라운드에서 패배 한 팀은 팀이 목표를 달성 할 수 없어야합니다

  • 베팅 라운드에서 승리 한 팀이 모든 포인트를 얻으면 다른 팀은 베팅과 동일한 마이너스 포인트를 얻습니다

  • 베팅 라운드에서 패한 팀이 모든 포인트를 모으면 다른 팀은 두 배의 마이너스 포인트를 얻습니다

게임 흐름 및 수집 포인트

  • 베팅 라운드에서 승리 한 플레이어 ( )는 테이블에 남은 카드 4 장을 얻습니다.
  • 그런 다음 팀 카드 뱅크에 카드 4 장을 저장하지 않고도 카드를 저장할 수 있습니다.
  • 왕은 양복을 통치자 양복 으로 골라 다른 사람들에게
  • King은 자신의 카드를 손에 놓아 게임을 시작합니다. 다른 플레이어는이 순서대로 플레이해야합니다
    • 그들이 같은 카드를 가지고 있다면, 그 카드 중 하나를 플레이해야합니다
    • 그들이 없다면 다른 옷을 입을 수 있습니다
  • 다른 플레이어가 모두 손을 대면 라운드의 승자는 다음과 같습니다.
    • 모든 카드가 같은 경우 가장 높은 카드를 가진 사람
    • "룰러"카드가 가장 높은 사람
  • 라운드의 승자는 카드를 모아서 은행에 넣습니다.
  • 이전 라운드에서이긴 플레이어는 다음 라운드를 시작합니다
  • 모든 사람의 손이 비워 질 때까지 계속됩니다

계산 포인트

  • 각 라운드마다 5 점을 얻습니다. 이것은 모든 4 장의 카드가 5 점 이상임을 의미합니다.
  • 뱅크에 에이스, 10 또는 5가 있으면 5 점이 추가됩니다

내 디자인

클래스

class Card {
   string suit;
   string rank
}
class Deck {
  List cards = [];
  List suits = ['S', 'H', 'D', 'C'];
  List ranks = ['1', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
  private void init(){..}
  void shuffle(){...}
}

class Game{
  Deck deck = new Deck();
  Player player1;
  Player player2;
  Player player3;
  Player player4;
  int _isOn = 0;

  Game(this.player1, this.player2, this.player3, this.player4){
    deck.makeCards();
    deck.shuffle();
    start();
  }

  void start(){
    player1.cards.addAll( deck.cards.getRange(0, 12) );
    player2.cards.addAll( deck.cards.getRange(12, 24) );
    player3.cards.addAll( deck.cards.getRange(24, 36) );
    player4.cards.addAll( deck.cards.getRange(36, 48) );
    deck.cards.removeRange(0, 48);
  }

  String toJson(){
  }

  String toString(){
  }
}
class Player{
  String name;
  int points;
  List cards = [];

  Player(this.name, {this.points});

  String toJson(){}

  String toString(){}
}

내 문제

이제이 모든 클래스를 정의 했으므로이 정의를 Mongo와 같은 데이터베이스에 바인딩하고 게임 흐름을 제어하는 ​​방법을 모르겠습니다.

  • 모든 논리는 어디로 가야합니까?
  • 서버 / 클라이언트 시나리오에서 어떻게 상태를 유지해야합니까?

노트 :

나는 이것을 프로그래밍하기 위해 다트를 사용하고 있지만 답을 다트에 쓸 필요는 없다.


누구나 코드를보고 시작점으로 사용하는 경우 순위에서 A 또는 1을 선택해야하지만 둘 다 포함하지 마십시오.
Ben

답변:


10

여기서 고전적인 실수를 저지르고 있습니다. 누군가 카드 게임을위한 웹 응용 프로그램을 만들라고 말했고, 한 번에 모든 게임을 만드는 방법을 결정하려고합니다. 연구 결과에 따르면 한 번에 7 가지 정보 만 쉽게 이용할 수 있다는 연구 결과가 나와 있기 때문에이 방법은 최고의 프로그래머에게도 혼란을줍니다. 더 많이 저글링을하려면 집중력이 필요하며이를 유지할 수는 없습니다.

오히려 누군가가 카드 게임을하기 위해 당신의 라이브러리에 전화하려고하는 것처럼 카드 게임 라이브러리를 작성하는 데 더 집중하십시오. 모델을 훌륭하게 시작한 것 같습니다. 좋지만 Game발신자가 make move 등을 사용할 수있는 인터페이스 를 만들어야 합니다.

따라서 Game에는 다음과 같은 몇 가지 새로운 방법이있을 것으로 기대합니다.

getPlayers()        // Get all player info
getCurrentPlayer()  // Get information about the active player in his turn (hand, money to bet with, etc.)
fold()              // Current player folds and current player changes
bet(float amount)   // Current player bets and current player changes

요컨대, 게임을 실행하기 위해 알아야 할 모든 것을 객체를 사용하여 수행 할 수 있습니다 Game. 작업이 완료된 후에 만 2 단계로 진행하십시오.

들어오는 요청을 수신하고 적용한 Game다음 사용자에게 출력을 보내는 것이 유일한 목적인 별도의 클래스를 작성하십시오 . Game출력을 JSON 으로 변환 Game하려면 그 목적이 아닙니다 Game!

이 정보를 유지하기 위해 MongoDB에 대한 인터페이스를 제공하는 다른 클래스를 작성할 수 있습니다. 이 클래스는이 클래스의 존재를 알지 못하며이 클래스의 존재 GameGame알지 못합니다.

요컨대, 개별 구성 요소에 집중하면 괜찮을 것입니다. 프로그램을 작성할 때 너무 많은 측면을 고려하려고 할 때 잘못되기 시작합니다. 현명한 교수님은 한 번 말씀 하셨습니다. " 프로젝트를 위해 작성한 첫 번째 프로그램이 끝까지 완전히 다시 쓰여질 것이라는 사실을 알고 받아들이십시오. "


옆에, 그 숫자는 사람에 따라 3에서 9까지입니다 – 나는 얼마나 경고인지에 따라 4 또는 5를 할 수 있습니다. 일반적인 테스트는 많은 점을보고 정신적으로 그룹화하지 않고 개별적으로 인식 할 수있는 수를 파악하는 것입니다 .6에서 예를 들어 자동으로 3 + 3으로 그룹화하기 시작하여 쉽게 분리 할 수 ​​없습니다 .
이즈 카타

@Izkata 흥미 롭습니다. 나는 이것에 대한 테스트가 있다는 것을 몰랐다. 당신은 링크가 있습니까?
Neil

1
en.wikipedia.org/wiki/… 는 소스입니다.
AakashM

1

모든 논리는 어디로 가야합니까?

Game수업에 넣는 것으로 시작하십시오 .

이것은 제한된 수의 상태를 가진 규칙 기반 게임입니다. 상태 머신 으로 모델링 할 것 입니다 . 상태 패턴은 당신에게 대단히 도움이 될 것입니다.

결국 해당 FSM을 별도의 클래스로 추출하려고하지만 걱정하지 않아도됩니다.

서버 / 클라이언트 시나리오에서 어떻게 상태를 유지해야합니까?

설정에 대해 더 많이 알지 못하면 대답 할 수 없습니다. 매 턴마다 게임 오브젝트와 상태를 데이터베이스에 직렬화하면 트릭이 발생할 수 있습니다.


다음은 주 / FSM에 관한 기사입니다.이 경우 게임에 초점을 맞춘 책에서 : gameprogrammingpatterns.com/state.html
shmup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.