Javascript中的纸牌游戏,构造函数错误

时间:2017-12-29 23:20:29

标签: javascript oop object constructor this

我正在用JavaScript创建一个基本的纸牌游戏(21),每个玩家都有一手牌。玩家从2张牌开始,但我想根据牌的总价值添加新牌,并调整是否存在牌。

不幸的是,我收到此错误:FATAL ERROR:CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足。我认为问题必须与this.newCard方法,我似乎无法理解为什么它不起作用。

function Hand () {
    this.cards = []
    this.cardsAtStart = function() {
        this.cards.push(new DealCards, new DealCards)
        return this.cards
    }
    this.checkValue = function () {
        let cardsInHand = this.cardsAtStart()

        let ace = false
        let value = 0
        for (let i = 0; i < cardsInHand.length; i++) {
            if (cardsInHand[i].cardnumber === 'A' && !ace) {
                ace = true
                value = value + 13
            }
            value = value + cardsInHand[i].cardvalue
        }
        if (ace && value  > 21) {
            value = value - 13
        }
        console.log(value)

        return value
    }
    this.newCard = function () {
        let value = this.checkValue()
        console.log(value)
        while (value < 15) {
            this.cards.push(new DealCards)
        }
        if (value > 15) {
            endGame()
        }
        console.log(this.cards)
    }
}

卡片对象如下所示: { suit: '♦', cardnumber: 'K', cardvalue: 13 }

4 个答案:

答案 0 :(得分:2)

您永远不会退出while循环,因为value无法更改:

while (value < 15) {
   this.cards.push(new DealCards)
}

您需要更改value循环内的while变量,以便条件可以为false

这样的事情:

while (value < 15) {
    this.cards.push(new DealCards);
    value++;
}

答案 1 :(得分:2)

您不会检查每个循环的值:

this.newCard = function () {
    let value = this.checkValue()
    console.log(value)
    while (value < 15) {
        this.cards.push(new DealCards);
        // check value again here!
        value = this.checkValue()
    }
    if (value > 15) {
        endGame()
    }
    console.log(this.cards)
}

但是也要修改checkValue以将cardsAtStart移出那里并进入构造函数。

<击> 或者,检查以下值:

while (value < 15) {
  this.cards.push(new DealCards);
  value = this.cards.reduce((all, current) => all + current.cardvalue, 0),
}

<击>

划伤一下,Ace逻辑与我的减速器混在一起。坚持原计划。将调用cardAtStart移动到构造函数方法中。然后使用checkValue来检查值。

答案 2 :(得分:0)

你收到这个错误是因为你在这一行被困在一个无限循环中,

 while (value < 15) {
     this.cards.push(new DealCards)
 }

问题是当这个函数运行时,值永远不会大于15,所以它只是不断重复。

如果您希望这张卡在卡片少于15张时发牌,那么您可以做其他事情,

if (value < 15) {
       this.cards.push(new DealCards)
 }

因此,为了解决您的问题,您需要在每次调用this.checkValue()函数时更新值。

while (value < 15) {
     this.cards.push(new DealCards);
     value = this.checkValue();
 }

答案 3 :(得分:0)

这个for循环永远不会结束

while (value < 15) {
            this.cards.push(new DealCards)
        }

您需要调用值++或++值才能结束

while (value < 15) {
            this.cards.push(new DealCards);
            value++;
        }