我正在制作纸牌游戏,需要在游戏开始之前洗牌。通过在将数组插入数据库之前对数组进行改组,可以毫无问题地完成此操作。但是,在游戏开始后,有些情况下玩家需要洗牌。我想到的唯一方法是在再次洗牌后重新插入卡座,但这肯定无效。
这是插入前改组的代码。

deck = _.shuffle (Card_Reference.find deck_id: hoster.deck).fetch()


    _.each deck, (card) ->
        Deck.insert
            userId: opponent._id
            game_id: id
            card: card.card

插入后
deck = Deck.find().fetch()
ids = _.pluck deck, "_id"
shuffled = _.shuffle deck
Deck.remove {_id: $in: ids}

_.each shuffled, (card) ->
    Deck.insert
       userId: opponent._id
       game_id: id
       card: card.card

这当然是无效且不必要的。
那么,如何洗牌呢?
谢谢。

最佳答案

是的,删除和重新插入是一种低效的随机播放方式,尤其是在渲染卡片很耗时的情况下。我建议使用以下方法,例如,仅在moved中呈现Deck时才生成{{#each}}操作:

无论在哪里使用需要改组的牌组,请使用按改组顺序排序的光标:

deck = Deck.find({}, {sort: {order: 1}}).fetch()

现在,在需要洗牌时更改订单:
newOrder = _.shuffle [1..52] # or whatever Deck.find().count() is
Deck.find({}).forEach (card, idx) ->
  Deck.update(card._id, $set: {order: newOrder[idx]})

这种改组方法不会导致任何内容删除并重新出现在集合中。只要您为玩家和游戏适当地确定查找操作的范围,以便其他套牌在不知不觉中被改组,您就应该从事业务。

10-05 21:01