Я не могу придумать хорошую архитектуру для моей карточной игры. Мне нужна помощь, чтобы понять, как обычно создаются игры.
Сначала я опишу правила игры.
Правила игры
Настроить- Есть четыре игрока, каждый из двух игроков формируют команду.
- Каждый игрок получает 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.
architecture
Мохсен
источник
источник
Ответы:
Вы делаете классическую ошибку здесь. Кто-то сказал вам сделать веб-приложение для карточной игры, и вы пытаетесь определить, как сделать все это сразу. Этот подход сбивает с толку даже самых лучших программистов, поскольку исследования показали, что вы можете хранить только 7 частей информации, легко доступных в вашем уме за один раз. Попытка жонглировать большим количеством требует интенсивной концентрации, и вы не можете ожидать, что продолжите в том же духе.
Скорее, попытайтесь больше сосредоточиться на написании библиотеки карточных игр, как будто кто-то собирался позвонить в вашу библиотеку, чтобы сыграть в вашу карточную игру. Вы, кажется, отлично начали свою модель. Это хорошо, но вам нужно создать
Game
интерфейс, с помощью которого звонящие могут использовать ходы и так далее.Поэтому я ожидаю, что в игре появятся несколько новых методов, таких как:
Короче говоря, все, что вам нужно знать, чтобы запустить игру, вы можете сделать это, используя свой объект
Game
. Только когда у вас есть это , вы переходите к шагу 2.Напишите отдельный класс, единственная цель которого - получать входящие запросы, применять их
Game
и отправлять выходные данные пользователю. Если вы хотите преобразоватьGame
вывод в JSON, вы делаете это вне,Game
поскольку это не является цельюGame
!Чтобы сохранить эту информацию, вы можете создать другой класс, который предоставляет интерфейс для MongoDB. Этот класс не знал бы о существовании
Game
и неGame
знал бы о существовании этого класса.Короче говоря, сосредоточьтесь на отдельных компонентах, и у вас все будет хорошо. Вы начинаете ошибаться, когда пытаетесь принять во внимание слишком много аспектов при написании своей программы. Как однажды сказал мне один мудрый профессор: « Знай и прими тот факт, что первая программа, которую ты пишешь для проекта, будет полностью переписана к концу ».
источник
Начните с того, что положите его в свой
Game
класс.Это игра на основе правил с ограниченным количеством состояний. Я бы смоделировал это как конечный автомат . Состояние картина поможет вам безмерно.
В конце концов вы захотите извлечь этот FSM в отдельный класс (ы), но пока не беспокойтесь об этом.
На это невозможно ответить, не зная больше о вашей настройке. Сериализация объекта Game и состояний в базу данных каждый ход может помочь.
источник