Javascript 向函数添加条件,使其仅在特定情况下运行
我现在正在用javascript开发一个文本游戏,有一个拿起剑的功能Javascript 向函数添加条件,使其仅在特定情况下运行,javascript,Javascript,我现在正在用javascript开发一个文本游戏,有一个拿起剑的功能 var takeSword = function() { if (currentRoom.hasSword) { $("<p>You picked up a sword.</p>").properDisplay(); } else { $("<p>The sword is not here.&l
var takeSword = function() {
if (currentRoom.hasSword) {
$("<p>You picked up a sword.</p>").properDisplay();
}
else {
$("<p>The sword is not here.</p>").properDisplay();
}
};
var=function(){
if(currentRoom.hasSword){
$(“你捡到一把剑。”).properDisplay();
var takeSword = function() {
if (currentRoom.hasSword) {
$("<p>You picked up a sword.</p>").properDisplay();
}
else {
$("<p>The sword is not here.</p>").properDisplay();
}
};
}
否则{
$(“剑不在这里。”).properDisplay();
}
};
我的问题是,只要你和剑在同一个房间,你就可以一遍又一遍地捡起它。您如何设置该功能,以便一旦拿起剑,就不能再拿起它
我最初的想法是设置一个变量,比如var-swarm=false代码>然后当函数运行时设置swarm=true代码>但这不起作用
这不是我的全部代码,还有一个对象设置'hasSword=true;'这样一来,剑就可以在第一时间捡到,而不能在游戏的不同房间里捡到。也许是这样的吧
var GameState = {
worldHasSword: true,
playerHasSword: false,
takeSword: function() {
if( this.worldHasSword ) {
this.worldHasSword = false;
this.playerHasSword = true;
$("<p>You picked up a sword.</p>").properDisplay();
}
else {
$("<p>The sword is not here.</p>").properDisplay();
}
}
}
GameState.takeSword();
var游戏状态={
没错,
playerHasSword:错,
take剑:函数(){
如果(this.worldHasSword){
this.worldHasSword=false;
this.playerHasSword=true;
$(“你捡到一把剑。”).properDisplay();
var takeSword = function() {
if (currentRoom.hasSword) {
$("<p>You picked up a sword.</p>").properDisplay();
}
else {
$("<p>The sword is not here.</p>").properDisplay();
}
};
}
否则{
$(“剑不在这里。”).properDisplay();
}
}
}
游戏状态;
@Kenney让我朝着正确的方向思考。下面是我在不完全重写函数的情况下修复它的方法:
var takeSword = function() {
if (currentRoom.hasSword) {
$("<p>You picked up a sword.</p>").properDisplay();
currentRoom.hasSword = false;
}
else {
$("<p>The sword is not here.</p>").properDisplay();
}
};
var=function(){
if(currentRoom.hasSword){
$(“你捡到一把剑。”).properDisplay();
var takeSword = function() {
if (currentRoom.hasSword) {
$("<p>You picked up a sword.</p>").properDisplay();
}
else {
$("<p>The sword is not here.</p>").properDisplay();
}
};
currentRoom.hasSword=false;
}
否则{
$(“剑不在这里。”).properDisplay();
}
};
我犯的第一个错误是认为“hasSword”本身就是变量。我需要添加当前房间,然后它就可以正常工作了。我已经对它进行了测试,也在没有剑的房间里试用过,它似乎工作得很好。这里最好的解决方案是根本不去碰你原来的函数,而是简单地将它封装在一个通用函数中,这样可以防止它被多次调用。此通用函数可用于代码中任何其他需要“一次通知”的地方:
function once(fn, context) {
var result;
return function() {
if(fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
现在您只需执行以下操作:
var takeSwordOnce = once(takeSword);
并在代码中使用takeSwordOnce
。或者,您可以执行以下操作:
takeSword = once(takeSword);
请参阅以进一步了解once
功能的说明。您可以在拾取currentRoom
后,用拾取剑的状态标记currentRoom.swordPicked=true
为什么不在拾取剑后将hasSword
设置为false
?currentRoom.hasSword=false;player.hasSword=true代码>?@JosephDreamer-不幸的是,这并没有改变任何事情。@Kenney-谢谢!我不是像你那样做的,但你给了我正确的方向。我将在下面公布答案。你可能还想知道玩家携带了多少剑!“也许还有其他事情要做?”肯尼同意。我想我必须使用某种类型的for
循环或forEach
来开始滚动不同的库存项目。因为我是从零开始学习这一点的,所以我选择了一条路径,让一件事情开始工作,在我理解了这一点之后,回头想想如何让它与多件事情一起工作。(也就是说,我现在可以选择一个项目,而不是选择两次。现在,我如何选择5个项目?)--这是下一步。是的,确实是一个非常好的方法!我让你继续干;-)这是一种开发的原型方法。请注意,您可能会达到这样一个程度:您必须重写整个代码板以适应某些新功能。这就是设计过程应该避免的(以及原型通常保持绝对最小的原因)。祝你好运。:-)它也被称为:“这种方法背后的基本思想是通过重复的周期(迭代)和一次更小的部分(增量)开发一个系统,允许软件开发人员利用在系统早期部分或版本的开发过程中所学到的知识。”