gpt4 book ai didi

javascript - 洗牌 meteor 集合

转载 作者:行者123 更新时间:2023-11-29 14:54:36 39 4
gpt4 key购买 nike

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

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

这当然是无效和不必要的。那么,如何洗牌一个集合呢?谢谢。

最佳答案

是的,移除并重新插入是一种低效的洗牌方式,尤其是当渲染卡片是一项耗时的操作时。我建议使用以下方法,如果 Deck{{#each}} 中呈现,它只会生成 moved 操作,例如:

无论你在哪里使用需要洗牌的牌组,都使用按洗牌顺序排序的游标:

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]})

这种洗牌方法不会导致任何东西从集合中移除并重新出现。只要您为玩家和游戏适本地确定查找操作的范围,以便其他套牌在不知不觉中被洗牌,您就应该在做生意。

关于javascript - 洗牌 meteor 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037332/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com