firebase打造一个基本的纸牌游戏

时间:2014-04-04 13:32:47

标签: firebase firebase-security

我最近发现了Firebase,我想知道它是否可用于构建具有以下标准的“基本”纸牌游戏应用程序:

  • 为游戏中的每个玩家分配X卡
  • 每张牌必须是唯一的,并且必须是牌组的一部分
  • 每位玩家都不知道每位玩家有哪些牌

这是一副纸牌 :[0,1,3,4,5,6,7,8,9,10]

这是玩家卡 :{player1:[1,6,8],玩家2:[0,2,3],玩家3:[9,7, 10]}

我不知道如何为每位玩家分配牌,而不会将牌从一名​​玩家转移到另一名玩家。

作为一个例子:第一个玩家可能是将牌分配给其他玩家的玩家,然后是将牌保留在Firebase中的玩家。由于是客户正在进行此操作,因此卡不会保密。

我的问题是:如果没有使用Firebase的外部API以及一些客户端代码,我们如何处理这些应用程序(如果可以的话)?

1 个答案:

答案 0 :(得分:2)

只需使用node.js脚本将卡片随机分配给玩家,就可以简化这一过程。

但是,使用以下过程可以很好地完成security rules

  1. 通过编写快速JavaScript来手动生成几百/千“random_decks”,随机订购每个牌组中的牌(使用Firebase中的push()命令);同时生成card_names / values,以便每个套牌中的随机ID映射到特定(未知)卡
  2. 让“经销商”选择下一个可用的牌组(并将其移至存放二手牌组的新路径)
  3. 当玩家想要抽牌时,他们会将它从game_deck移到他们的“手”;在将它们放在手中之前,他们不会知道它是哪张牌
  4. 一旦声明,玩家就无法从他们的手中删除卡片,因此无法进行交易
  5. 只允许在绘制卡片后读取卡片的面值,因此只有所有者才能读取他所拥有的卡片,直到“揭示”
  6. 一旦牌显示出来,也许所有玩家都可以在他们的“牌组”中阅读任何内容,看看哪些牌属于谁(假设游戏中有适当的牌照)
  7. 数据结构如下所示:

    /random_decks/$game_id/$random_generated_id
    /game/$game_id/deck (move deck here when it is claimed)
    /my_hand/$user_id/$game_id/$random_generated_id (once card is here, I can read card_names)
    /card_names/$game_id/$random_generated_id (real card name goes here)
    

    安全规则将类似于以下内容:

    // game_deck/$game_id
    // can only be copied from random_decks
    ".write": "root.child('random_decks/'+$game_id).exists()" 
    
    // game_deck/$game_id/deck/$random_generated_id
    // must exist in random_decks/$game_id to create it here
    ".write": "root.child('random_decks/'+$game_id+'/$random_generated_id).exists()"
    
    // random_decks/$game_id
    // can only delete pre-generated decks (should be done after copying to a game)
    ".write": "!newData.exists()" 
    
    // card_names/$game_id/$random_generated_id
    // can only read it if I own the card
    ".read": "root.child('my_hand/'+auth.uid+'/'+$game_id+'/'+$random_generated_id).exists()"
    // or maybe if the game has reached the "reveal" phase
    ".read": "root.child('game_deck/'+$game_id+'/revealed').val() === true"
    

    希望这会让你开始。