我需要想出一个循环,当值低于或等于玩家的设定 stopAtValue 时,从洗牌的牌组中发牌。我有一组牌,Deck,我使用洗牌功能洗牌。如果我从套牌中.shift一张牌,我会得到这种格式:
Card { value: 13, name: 'K', suit: '♥' }
我有一个播放器:
function Player (name, stopAtValue) {
this.name = name
this.stopAtValue = stopAtValue
}
let player = new Player('Player 1', 16)
我想使用交易函数:
function deal () {
if (shuffledDeck.length > 1) {
return shuffledDeck.shift().value
} else {
return null
}
}
然后,我得到移位卡的值,并可以使用它来计算分数。问题是,我怎样才能创建一个循环来发牌,直到附加值达到限制。我想到了这样的事情:
do {
deal()
} while (deal().value <= Player.stopAtValue)
关于我可以为此使用哪种循环的任何指针?
问题是deal()
返回数组中第一个Card
的值,而不是玩家的累积分数。您还指的是不存在的Player
函数的stopAtValue
。相反,您应该引用初始化的player
对象的stopAtValue
。我会向Player
函数添加一个currentScore
属性,并使交易函数添加到该属性中。
选手:
function Player (name, stopAtValue) {
this.name = name
this.stopAtValue = stopAtValue
this.currentScore = 0
}
let player = new Player('Player 1', 16)
交易:
function dealTo (player) {
if (shuffledDeck.length > 0) {
player.currentScore += shuffledDeck.shift().value
}
}
圈:
do {
dealTo(player)
} while (player.currentScore <= player.stopAtValue)
我会根据玩家的stopCount
来计算循环计数,否则拥有它有什么意义。
let player = new Player('Player 1', 16);
var valueReached = false;
while (!valueReached){
if(player.stopAtValue >= deal()) {
valueReached = true;
}
}
实际上,您的deal()
函数通过shuffledDeck.shift().value
返回一个number
,并且您尝试访问deal().value
中的value
属性,这将引发错误。
解决方案是在deal
函数中返回整个Card
对象,然后获取其值,并将该值存储在临时变量中,并在循环条件中进行比较。
并确保引用创建的player
实例的stopAtValue
,而不是循环中Player.stopAtValue
的Player
构造函数。
这是你的代码应该如何:
function deal () {
if (shuffledDeck.length > 1) {
return shuffledDeck.shift();
} else {
return null;
}
}
var lastValue = 0;
do{
lastValue = deal().value;
} while (lastValue && lastValue <= player.stopAtValue);
演示:
var shuffledDeck = [{
value: 13,
name: 'K',
suit: '♥'
},
{
value: 9,
name: 'Q',
suit: '♥'
}, {
value: 20,
name: 'J',
suit: '♥'
},
{
value: 13,
name: '10',
suit: '♥'
}
];
function Player(name, stopAtValue) {
this.name = name;
this.stopAtValue = stopAtValue;
}
let player = new Player('Player 1', 16);
function deal() {
if (shuffledDeck.length > 1) {
return shuffledDeck.shift();
} else {
return null;
}
}
var lastValue = 0;
do {
lastValue = deal().value;
console.log(lastValue);
} while (lastValue && lastValue <= player.stopAtValue);