如何设计纸牌游戏?


10

我不能为我的纸牌游戏提出一个好的架构。我需要帮助来了解游戏通常是如何设计的。

首先,我将描述游戏规则。

游戏规则

设定
  • 有四名球员,每两名球员组成一个团队。
  • 每位玩家可获得12张随机洗牌
  • 桌子上有4张盲卡(河牌)
  • 玩家订购是这样的

在此处输入图片说明

下注
  • 每个玩家都可以在100到160之间传递或选择一个大于当前下注的数字
  • 博彩从第一位玩家开始,直到圈子通过为止
  • 一旦玩家通过,就不能再下注
  • 赢得下注回合的球队至少应获得等于其下注的积分才能赢得比赛
  • 输掉了本轮比赛的团队不应允许其团队达到目标

  • 如果赢得比赛的团队获得所有分,则另一支球队将获得等于其赌注的负分

  • 如果输掉比赛的队伍获得了所有积分,另一支队伍将获得双倍负积分

游戏流程和收集点

  • 赢得下注的玩家(国王)在桌上获得了剩余的四张牌。
  • 然后,她/他甚至可以不用玩就将一组四张卡保存在他们的团队卡库中。
  • 国王将挑选一套西装作为尺码西装,并让其他人知道
  • King通过将他/她的手牌放在桌子上来开始游戏。每个其他玩家应按此顺序玩
    • 如果他们手中持有与该张牌相同的花色,则必须打出其中一张
    • 如果他们没有,他们可以玩其他西装
  • 在所有其他玩家玩过手之后,该回合的赢家将是:
    • 如果所有卡都相同,则拥有最高卡的人
    • 拥有最高“统治者”卡的人
  • 一轮获胜者将收集卡并将其放入银行
  • 赢得前一轮的玩家将开始下一轮
  • 这将一直持续到每个人的手都空了

计数点

  • 每个回合赢5分。这意味着每4张卡至少有5分。
  • 拥有Ace,银行中的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,但不要同时包括两者。

Answers:


10

您在这里犯了一个经典错误。有人告诉您制作一个纸牌游戏的网络应用程序,而您正在尝试确定如何一次制作所有应用程序。这种方法甚至使最好的程序员也感到困惑,因为研究表明,一次只能保存7条容易获得的信息。尝试更多地玩弄需要集中精力,而您不能指望保持这种状态。

相反,请尝试着重于编写纸牌游戏库,就像有人要打您的库来玩您的纸牌游戏一样。您似乎在模型上有了一个很好的起点。很好,但是您需要创建Game一个界面,呼叫者可以使用该界面进行举动等等。

因此,我希望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

简而言之,您可以使用object来了解运行游戏所需的所有知识Game只有拥有此权限后,您才能继续执行步骤2。

编写一个单独的类,其唯一目的是接收传入的请求,将它们应用于并将请求Game发送回给用户。如果要将Game输出转换为JSON,请在此之外进行,Game因为这不是目的Game

为了保留此信息,您可以创建另一个类,该类提供到MongoDB的接口。此类不会知道此类的存在,Game也不Game知道此类的存在。

简而言之,专注于各个组件,您会没事的。当您在编写程序时尝试考虑太多方面时,您就会出错。正如一位明智的教授曾经告诉我的那样:“ 知道并接受您为项目编写的第一个程序将在最后全部重写的事实。


撇开这个数字,根据人的不同,数字从3到9不等-根据我的警觉程度,我可以做4或5。通常的测试是查看一堆点,弄清楚在不进行脑力分组的情况下可以单独感知多少个点-例如,在6岁时,我开始自动将它们分组为3 + 3,并且无法轻松地将它们再次分开。
2013年

@Izkata真有趣。我不知道对此有一个测试。你有链接吗?
尼尔

1
我相信en.wikipedia.org/wiki/…是来源。
AakashM

1

所有这些逻辑应该去哪儿?

首先将其放入您的Game班级。

这是具有有限状态的基于规则的游戏。我将其建模为状态机。该状态模式将极大地帮助你。

最终,您将需要将该FSM提取到单独的类中,但是暂时不必担心。

在服务器/客户端方案中应如何保持状态?

如果不了解您的设置,这是无法回答的。每次将游戏对象序列化并声明到数据库状态都可以解决问题。


这是关于state / FSM的随附文章,在本例中是一本专注于游戏的书:gameprogrammingpatterns.com/state.html
shmup
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.