Как мне создать карточную игру?

10

Я не могу придумать хорошую архитектуру для моей карточной игры. Мне нужна помощь, чтобы понять, как обычно создаются игры.

Сначала я опишу правила игры.

Правила игры

Настроить
  • Есть четыре игрока, каждый из двух игроков формируют команду.
  • Каждый игрок получает 12 перемешанных карт
  • На столе (река) 4 ослепленных карты
  • Порядок игроков такой

введите описание изображения здесь

Делать ставки
  • Каждый игрок может передать или выбрать число больше текущей ставки от 100 до 160
  • Ставки начинаются с первого игрока и кругов до командного паса
  • После того, как игрок прошел, он больше не может делать ставки
  • Команда, которая выиграет раунд ставок, должна набрать как минимум очки, равные их ставке, чтобы выиграть игру
  • Команда, проигравшая раунд ставок, не должна позволять своей команде достигать своей цели

  • Если команда, выигравшая раунд ставок, получает все очки, другая команда получит отрицательные очки, равные их ставке.

  • если команда, проигравшая в раунде ставок, наберет все очки, другая команда получит двойные отрицательные очки

Ход игры и сбор очков

  • Игрок, выигравший раунд ставок ( король ), получает четыре оставшиеся карты на столе.
  • Затем она / он может сохранить набор из четырех карт в банке своих командных карт, даже не разыгрывая их.
  • Король выберет костюм как костюм правителя и скажет другим, что
  • Кинг начинает игру, положив карту со своей руки на стол. Каждый другой игрок должен играть в таком порядке
    • если у них в руке одинаковая масть этой карты, они должны сыграть одну из этих карт
    • если у них его нет, они могут сыграть любой другой костюм
  • После того, как все остальные игроки сыграли свои руки, победителем раунда будет:
    • Тот, у кого самая высокая карта, если все карты одинаковые
    • Тот, кто имеет наивысшую карту «правителя», если она есть
  • Победитель раунда соберет карты и положит их в свой банк
  • Игрок, выигравший предыдущий раунд, начнет следующий раунд
  • Это будет продолжаться до тех пор, пока все руки не опустеют

Подсчет очков

  • Победа в каждом раунде имеет 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) и контролировать ход игры.

  • Куда должна идти вся эта логика?
  • Как сохранить состояние в сценарии сервер / клиент?

Замечания:

Я использую Dart для программирования, но мне не нужно, чтобы ответы были написаны на Dart.

Мохсен
источник
Если кто-то смотрит на ваш код и использует его в качестве отправной точки, учтите, что вы должны выбрать A или 1 в рангах, но не включайте оба.
Бен

Ответы:

10

Вы делаете классическую ошибку здесь. Кто-то сказал вам сделать веб-приложение для карточной игры, и вы пытаетесь определить, как сделать все это сразу. Этот подход сбивает с толку даже самых лучших программистов, поскольку исследования показали, что вы можете хранить только 7 частей информации, легко доступных в вашем уме за один раз. Попытка жонглировать большим количеством требует интенсивной концентрации, и вы не можете ожидать, что продолжите в том же духе.

Скорее, попытайтесь больше сосредоточиться на написании библиотеки карточных игр, как будто кто-то собирался позвонить в вашу библиотеку, чтобы сыграть в вашу карточную игру. Вы, кажется, отлично начали свою модель. Это хорошо, но вам нужно создать 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. Этот класс не знал бы о существовании Gameи не Gameзнал бы о существовании этого класса.

Короче говоря, сосредоточьтесь на отдельных компонентах, и у вас все будет хорошо. Вы начинаете ошибаться, когда пытаетесь принять во внимание слишком много аспектов при написании своей программы. Как однажды сказал мне один мудрый профессор: « Знай и прими тот факт, что первая программа, которую ты пишешь для проекта, будет полностью переписана к концу ».

Нил
источник
Кроме того, это число от 3 до 9 в зависимости от человека - я могу сделать 4 или 5 в зависимости от того, насколько я бдительна. Обычный тест - посмотреть на кучу точек и выяснить, сколько вы можете воспринимать индивидуально, не группируя их мысленно - в 6 я начинаю автоматически группировать их, например, в 3 + 3 и не могу легко разделить их снова ,
Изката
@Izkata Это интересно. Я не знал, что для этого был тест. У вас есть ссылка?
Нил
1
Я считаю, что источником является en.wikipedia.org/wiki/…
AakashM
1

Куда должна идти вся эта логика?

Начните с того, что положите его в свой Gameкласс.

Это игра на основе правил с ограниченным количеством состояний. Я бы смоделировал это как конечный автомат . Состояние картина поможет вам безмерно.

В конце концов вы захотите извлечь этот FSM в отдельный класс (ы), но пока не беспокойтесь об этом.

Как сохранить состояние в сценарии сервер / клиент?

На это невозможно ответить, не зная больше о вашей настройке. Сериализация объекта Game и состояний в базу данных каждый ход может помочь.

Мартин Викман
источник
Вот сопутствующая статья о состоянии / FSM, в данном случае из книги, посвященной играм: gameprogrammingpatterns.com/state.html
shmup