我正在制作纸牌游戏,需要在游戏开始之前洗牌。通过在将数组插入数据库之前对数组进行改组,可以毫无问题地完成此操作。但是,在游戏开始后,有些情况下玩家需要洗牌。我想到的唯一方法是在再次洗牌后重新插入卡座,但这肯定无效。
这是插入前改组的代码。
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]})
这种改组方法不会导致任何内容删除并重新出现在集合中。只要您为玩家和游戏适当地确定查找操作的范围,以便其他套牌在不知不觉中被改组,您就应该从事业务。