我正在用Javascript创建一个二十一点纸牌游戏。到目前为止,我感谢你的评论。 我正在寻找反馈,为什么我只能在cardDealer函数中调用cardFace函数一次。目前cardFace(0)给了我一个值,而cardFace(1)或任何其他数字都没有,除非它是cardDealer函数中唯一被调用的cardFace(x)。任何想法,将不胜感激。谢谢
下面的代码并不完整,但我相信足以从中辨别出足够的信息。谢谢
function card(name, suit, face, value)
{
this.name = name;
this.suit = suit;
this.face = face;
this.value = value;
}
aceOfHearts = new card("aceofhearts","hearts", "ace", 11);
kingOfHearts = new card("kingofhearts","hearts", "king", 10);
queenOfHearts = new card("queenofhearts","hearts", "queen", 10);
jackOfHearts = new card("jackofhearts","hearts", "jack", 10);
tenOfHearts = new card("tenofhearts","hearts", "ten", 10);
nineOfHearts = new card("nineofhearts","hearts", "nine", 9);
eightOfHearts = new card("eightofhearts","hearts", "eight", 8);
sevenOfHearts = new card("sevenofhearts","hearts", "seven", 7);
sixOfHearts = new card("sixofhearts","hearts", "six", 6);
var deck;
deck = [];
deck.push(aceOfHearts);
deck.push(aceOfDiamonds);
deck.push(aceOfClubs);
deck.push(aceOfSpades);
deck.push(kingOfClubs);
deck.push(kingOfDiamonds);
deck.push(kingOfHearts);
deck.push(kingOfSpades);
deck.push(queenOfClubs);
deck.push(queenOfDiamonds);
deck.push(queenOfHearts);
deck.push(queenOfSpades);
deck.push(jackOfClubs);
deck.push(jackOfDiamonds);
deck.push(jackOfHearts);
deck.push(jackOfSpades);
deck.push(tenOfClubs);
deck.push(tenOfDiamonds);
deck.push(tenOfHearts);
deck.push(tenOfSpades);
var cardDealer = function()
{
fisherYates(deck);
document.getElementById("yourFirstCard").textContent = "Your First Card is " + cardFace(0) ;
document.getElementById("yourSecondCard").textContent = "Your Second Card is " + cardFace(1) ;
};
var cardFace = function(x)
{
cardFace = deck[x].face;
return cardFace;
};
var cardSuit = function(x)
{
cardSuit = deck[x].suit;
return cardSuit;
};
<body>
<div>Black Jack 1.1</div>
<br/>
<button type="button" onClick="cardDealer()">Deal</button>
<div id="yourFirstCard"></div>
<div id="yourSecondCard"></div>
<div id="yourThirdCard"></div>
<div id="yourFourthCard"></div>
<div id="yourFifthCard"></div>
<div id="playerTotal"></div></div>
<div id="playerSit"></div>
<div id="playerMessage"></div>
<div id="sitter"><button type="button" onClick="sit()">Sit</button></div>
<div id="hitter"><button type="button" onClick="hitMe()">Hit</button></div>
<br/>
<br/>
<div id="dealersFirstCard"></div></div>
<div id="dealersSecondCard"></div></div>
<div id="dealersThirdCard"></div></div>
<div id="dealersFourthCard"></div></div>
<div id="dealersFifthCard"></div></div>
<div id="dealerTotal"></div></div>
<div id="dealerSit"></div></div>
<div id="dealerMessage"></div></div>
</body>
答案 0 :(得分:0)
以下是我看到问题的地方:
var cardFace = function(x)
{
cardFace = deck[x].face;
return cardFace;
};
首先,声明一个名为cardFace
的变量并将其分配给一个函数。实际上这个函数重新分配了你的cardFace
变量并将其作为结果返回。就是这样,你的功能现在已经消失,你不能再引用它,因为cardFace
已被重新分配。
您需要做的是更改函数的主体,使其不重新分配变量:
var cardFace = function(x)
{
var cardFaceValue = deck[x].face;
return cardFaceValue;
};
cardSuit
功能也是如此。
答案 1 :(得分:0)
将cardFace
移到cardDealer
之上或将其更改为function cardFace(x)
定义。
这是一个js行为的事情。以function x
格式定义的函数可以从上面编写的代码中调用。 var x = function()
无法在运行时确定的位置。
请参阅:http://ejohn.org/apps/learn/#4了解Resig先生的更多示例。
试试:http://ejohn.org/apps/learn/这是一件好事。
编辑:在这个帖子中你也应该考虑很多好的建议。包括其他发布的答案。你应该研究scopes
。
编辑2
在再次查看您的代码之后,我相信我的解决方案实际上并不是正确的,因为它让我想到cardFace
在cardDealer
的范围内被调用,这意味着它可能是由您致电cardDealer
的时间定义。因此,我认为当你将其改为function
时,你可能会改变名称,正如另一个答案所暗示的那样。而且实际上是正确的答案。
//Test function calling forward defined function
var f = function() { x(); };
var x = function() { console.log('a'); }
f()
>>> a
// Test function modifying it's own scoped name
var f = function() { f = 'test'; return f; };
f()
>>> "test"
f()
>>> TypeError: string is not a function
// Test function modifying it's own scoped name when declaring as function
function f() { f = 'test'; return f; };
f()
>>> "test"
f()
>>> TypeError: string is not a function