首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设计纸牌游戏?

如何设计纸牌游戏?
EN

Software Engineering用户
提问于 2013-07-31 03:46:38
回答 2查看 23.3K关注 0票数 10

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

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

游戏规则

设置

  • 有四名球员,每两名球员组成一支球队。
  • 每位玩家得到12张洗牌。
  • 桌子上有4张盲卡(河面)
  • 球员的订单是这样的

博彩

  • 每个玩家可以在100到160之间通过或选择一个比当前赌注更大的数字。
  • 博彩从第一名球员开始,一直到球队通过为止。
  • 一旦玩家通过,他们就不能再下注了
  • 赢了这一轮博彩的球队至少应该获得与他们的赌注相等的积分,才能赢得比赛。
  • 输了一轮博彩的球队不应该让他们的球队达到他们的目标。
  • 如果赢了博彩的球队得到了所有的分数,另一支球队就会得到与他们的赌注相等的负面分数。
  • 如果输掉本轮博彩的球队获得所有积分,则另一队将获得双负积分。

博弈流与集点

  • 赢了博彩的人(国王)会得到剩下的四张牌。
  • 然后她(他)可以在他们的团队卡片库中保存一组四张牌,甚至不用玩它们。
  • 国王将挑选一套西装作为统治者的西服,并让其他人知道
  • 游戏开始时,金把一张牌放在桌子上。每个玩家都应该按的顺序来玩
    • 如果他们手上有同样的牌,他们必须打其中一张牌。
    • 如果他们没有,他们可以玩任何其他的西装

  • 在所有其他球员上场之后,本轮的赢家将是:。
    • 拥有最高卡的人,如果所有的牌都一样
    • 拥有最高“统治者”卡的人(如果有的话)

  • 本轮比赛的胜利者将收集卡片并将其存入银行。
  • 赢得前一轮的球员将在下一轮开始。
  • 这将持续到每个人的手都是空的

计数点

  • 每一轮获胜都有5分。这意味着每4张牌至少有5分。
  • 拥有Ace,10或5在银行各增加5分

我的设计

代码语言:javascript
运行
复制
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写答案。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2013-07-31 09:17:54

你犯了一个典型的错误。有人告诉你要为一个纸牌游戏制作一个网络应用程序,而你正试图确定如何同时制作所有的应用程序。这种方法甚至让最好的程序员感到困惑,因为研究表明,您一次只能保留7条随时可用的信息。试图与更多的人打交道需要集中注意力,你不能指望继续这样下去。

相反,试着把注意力更多地放在写纸牌游戏库上,就像有人为了玩纸牌游戏而打电话给你的图书馆一样。你的模型似乎有一个很好的开端。这很好,但是您需要使Game成为调用者可以使用的接口,等等。

所以我希望游戏会有几种新的方法,比如:

代码语言:javascript
运行
复制
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来完成。只有在你有了这个之后,你才会进入第二步。

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

为了持久化这些信息,您可以创建另一个类,它提供了一个MongoDB接口。这个类不会知道Game的存在,Game也不会知道这个类的存在。

总之,专注于各个组件,您就会没事的。当你试图在编写程序时考虑太多的方面时,你就开始出错了。正如一位睿智的教授曾经告诉我的那样:“要知道并接受这样一个事实:你为一个项目编写的第一个程序将在项目结束前被全部重写。”

票数 11
EN

Software Engineering用户

发布于 2013-07-31 09:07:22

那么这些逻辑应该去哪里呢?

从将其放入您的Game类开始。

这是一个基于规则的游戏,只有有限的几个州。我会把它建模成一个状态机状态模式会给你很大的帮助。

最终,您将希望将FSM提取到单独的类(Es)中,但暂时不要担心这一点。

如何在服务器/客户端场景中保持状态?

这是不可能回答不知道更多关于你的设置。序列化您的游戏对象和状态到数据库,每一回合可能会发挥作用。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/206609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档