Як створити карткову гру?


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(){}
}

Моя проблема

Тепер, коли я визначив усі ці класи, я не знаю, як пов’язати це визначення з базою даних (наприклад, Монго) та контролювати потік гри.

  • Куди має піти вся ця логіка?
  • Як слід зберігати стан у сценарії сервер / клієнт?

Примітка:

Я використовую 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 в окремі класи, але поки що не турбуйтеся про це.

Як слід зберігати стан у сценарії сервер / клієнт?

На це неможливо відповісти, не знаючи більше про вашу установку. Серіалізація вашого ігрового об’єкта та конвертація в базу даних кожного кроку може зробити трюк.


Ось супровідний твір про стан / FSM, в цьому випадку з книги, орієнтованої на ігри: gameprogrammingpatterns.com/state.html
shmup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.