Я создаю приложение для карточных игр с Node / Express / MongoDB и использую для l oop, чтобы раздать 4 карты каждому игроку. Команда for l oop продолжает следующую итерацию до того, как она завершила присвоение значения объекту cards.
В приведенном ниже примере в игре участвуют 4 игрока, которым должно быть роздано по 4 карты каждый.
Функция для сдачи карт:
exports.start = async (_id) => {
const deck = await this.get(_id);
deck.cards = casinoDeck.cards; // json object with the cards initial state
// deal 4 cards to each player
for (let i=0; i<4; i++) {
for (const player of deck.players) {
const remainingDeckCards = deck.cards.filter(card => card.state === 'deck').length
console.log(remainingDeckCards);
const randomCardIndex = this.getRandomInt(remainingDeckCards);
deck.cards[randomCardIndex].player = player;
deck.cards[randomCardIndex].state = 'hand';
};
};
deck.save();
return deck;
};
Назначение случайного индекса оставшихся карт:
exports.getRandomInt = max => Math.floor(Math.random() * Math.floor(max));
Схема колоды:
const deckSchema = new Schema({
cards: [{
name: {type: String, enum:['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2']},
suit: {type: String, enum:['C', 'D', 'H', 'S']},
rank: {type: Number},
altRank: {type: Number},
player: {type: Schema.Types.ObjectId, ref: 'user', default: null},
state: {type: String, enum: ['deck', 'table', 'hand', 'won'], default: 'deck'},
image: {type: String}
}],
players: [{type: Schema.Types.ObjectId, ref:'user', default: null}]
});
Журналы console.log(remainingDeckCards)
ниже, где на некоторых итерациях оставшиеся карты в колоде остаются неизменными. Это указывает на то, что для l oop продолжается итерация до того, как она присвоит значение deck.cards.state
(и возможно также deck.cards.player
). Это приводит к тому, что некоторые карты «сдаются дважды» ...
52 51 50 49 48 47 46 45 44 43 42 42 41 40 39 39
Как обеспечить присвоение колоды .cards before для l oop продолжается до следующей итерации?