2015-08-17 27 views
1

(Stack Overflow没有“提示符”标签,所以我使用了警报,因为我猜测它足够类似于吸引正确的回答者。)用数组元素填充提示并将它们编号为

你好, 我目前正在为大学的作业制作基于JavaScript的游戏。我通常在解决问题方面表现不错,但一直都被这个问题困扰。

为了解释,我有一个数组,它命名了玩家可以选择的可能的装甲插槽。以任何顺序,这些可以被挑选出来,并且每当选择被推送到第二个数组时,该数组处理已经被挑选的(以什么顺序)并且该项目从原始数组拼接。有一段时间循环直到全部3个被选中。

var armourSlotToPick = ["Head", "Chest", "Legs"],  
    armourSlotPicked = [], 
    armourLoop = 1, 
    indexArmour = 0; 

function numInArray() { 
    indexArmour++; 
    return (indexArmour + ". " + armourSlotToPick[indexArmour - 1] + "\n"); 
} 


function armour() { 
    while (armourLoop < 4) { 
     var armourPick = prompt("Pick an armour slot to generate an item for:\n" + armourSlotToPick.forEach(numInArray)); 
     if (armourPick == 1) { 
      armourSlotPicked.push(armourSlotToPick[0]); 
      armourSlotToPick.splice(0,1); 
     } else if (armourPick == 2) { 
      armourSlotPicked.push(armourSlotToPick[1]); 
      armourSlotToPick.splice(1,1); 
     } else if (armourPick == 3) { 
      armourSlotPicked.push(armourSlotToPick[2]); 
      armourSlotToPick.splice(2,1); 
     } else { 
      alert("Invalid choice, you suck"); 
      break; 
     } 
     armourLoop++; 
    } 
} 

我知道它可能不会做到numInArray()中的整个返回提示,但它显示了一些工作。

现在的问题:我得到了它的工作,以便数组中的每个项目都被编号(var armourSlotToPick = [“1. Head”,“2. Chest”,“3. Legs”),但尽可能如果玩家选择了2,那么下一次它会显示“1. Head(new line)3. Legs”,当玩家选择3时,会出现问题,因为他们真的打算选择2。在提示中可以对数组中的项目进行编号?

我可能在想这个,但我已经忍受了几个小时了。

我可以提前感谢您的任何见解,您可能有,

丹尼尔。


编辑:解决。

以下是最终结果,与Jonathan Brooks编辑答案略有不同。

var armourSlotToPick = [null, "Head", "Chest", "Legs"] 
var armourSlotPicked = [null]; 
var armourLoop = 1; 

function armour() { 
    while (armourLoop < 4) { 
     var message = "Pick an armour slot to generate an item for:\n"; 
     for (var i = 0; i < armourSlotToPick.length; i++) { 
      if (armourSlotToPick[i] !== null) { 
       message += "" + i + ". " + armourSlotToPick[i] + "\n"; 
      }    
     } 
     var armourPick = prompt(message); 
     if (armourPick > armourSlotToPick.length-1 || armourPick < 1) { 
      alert("Invalid choice, you suck"); 
     } else { 
      var insert = armourSlotToPick.splice(armourPick, 1); 
      armourSlotPicked.push(insert); 
     } 
     armourLoop++; 
    } 
    armourSlotPicked.splice(0,1); 
} 

armour(); 
alert(armourSlotPicked.join("\n")); 

我感谢所有那些为这次讨论和最终的结果作出了贡献,我希望这是一个未来的问题的人可能有类似的一个很好的例子。

回答

1

看看我的fiddle,我想我有一个工作解决方案。你真正想使用的是带有你自己索引的Object Literals(从1开始) - 如果是我,我会创建自己的方式来迭代这个自定义索引,方法是在Object的原型中添加一个方法,但我离题了。

你使用while循环过于复杂的代码,而大宗的if语句是不必要的;相反,你需要的是输入一些基本的验证,然后你可以相信任何通过输入这个验证。这在这里展示:

if (armourPick > armourSlotToPick.length || armourPick < 1) { 
    alert("Invalid choice, you suck"); 
} 
else { 
    armourSlotPicked.push(armourSlotToPick[armourPick-1]) 
    alert (armourSlotPicked[armourSlotPicked.length-1].value); 
} 

仔细阅读我的代码,并且您应该更好地了解如何处理某些问题。

编辑:

按照您的要求,我想我有一个适合您需求的解决方案。基本上所有你需要做的有数组“启动” 1的指数是一个null价值,填补了零个元素,像这样:

var armourSlotToPick = [null, "Head", "Chest", "Legs"] 
var armourSlotPicked = [null]; 

你只需要记住借此null对象成例如:

if (armourSlotToPick[i] !== null) { 
    message += "" + i + "\n"; 
} 

指数会自动更新。有关更多详细信息,请参阅此updated fiddle

+0

谢谢你,是的,我明白如何处理这些问题,我只有1个问题, '钥匙'仍然硬编码为'价值',就像我三次这样做时一样,每次玩家选择下一个装甲槽时,2将永远是胸部,3将永远是腿部。我希望在第一次选择后动态改变,剩余2现在是关键字1,而关键字2不是,比如说,关键字2和关键字3(用于胸部和腿部)。我猜这是可能的。 –

+0

@DanielJochem查看我的编辑 –

+0

谢谢@JonathanBrooks,我已经结束了使用您编辑的答案,因为我确实想保留Henrik建议我不这样做的提示窗口。感谢您对我的耐心。 –

1

使用结构/对象作为数组中的内容而不仅仅是值。

的基本概念:

armourSlotPicked.push({ "key": 1, "value":armourSlotToPick[1]}) 
alert("value: " + armourSlotPicked[0].value) 
alert("key: " + armourSlotPicked[0].key) 

编辑:应对意见可以采取一些空间。

恕我直言,一个提示是完全错误的工具,因为大多数浏览器会要求用户权限以防止多个弹出窗口,并且由于promt只能返回1条信息,所以每个弹出窗口只能请求1件。相反,你应该使用一个div元素,每个信息的复选框。

这就是说,它可以很容易地在promt中使用。 提示符只是一个内置函数,它将字符串作为参数(在弹出窗口中显示为文本),并返回一个字符串与用户输入。

这对你来说有什么妙处: array.foreach():forEach()方法为每个数组元素执行一次提供的函数。

在你的情况下,它意味着它调用一个函数,它为数组中的每个元素返回一个字符串,并连接字符串。

在过去

你会这样写:

var messageText= "Pick an armour slot to generate an item for:\n" 
for(var i = 1; i < armourSlotToPick.length; i++){ 
    messageText += i + ". " + armourSlotToPick[i- 1] + "\n"; 
} 
var armourPick = prompt(messageText); 

但在这个现代化的时代,你定义打印功能,并用它来生成循环:

function numInArray() { 
    indexArmour++; 
    return (indexArmour + ". " + armourSlotToPick[indexArmour - 1] + "\n"); 
} 

//more code before we get to where the function is used.... 

indexArmour = 0; 
var messageText = "Pick an armour slot to generate an item for:\n" + armourSlotToPick.forEach(numInArray); 
var armourPick = prompt(messageText); 

或一行代码如下: indexArmour = 0; //你忘记了这一点 - 否则列表只会完成一次? var armourPick = prompt(“选择一个装甲槽以生成一个物品:\ n”+ armourSlotToPick.forEach(numInArray));

它产生相同的输出,因为它做同样的事情,它只是写得非常不同!

如果数组保存“对象文本”,而不是简单地值,我建议,老式的代码看起来是这样的:

function contains(a, value) { 
    try{ 
     for (var i = 0; i < a.length; i++) { 
      if (a[i].value == value) { 
       return true; 
      } 
     } 
    } 
    catch(err) { 
     // do nothing 
    }; 
    return false; 
} 

后来..

for(var j = 0; j < 4; j++){ 
    for(var i = 0; i < Math.min(armourSlotToPick.length); i++){ 
     if(contains(armourSlotPicked, armourSlotToPick[i- 1])) 

继续; “+ i +”\ n“ messageText + = armourSlotToPick [i-1] +”\ n“; }

var armourPick = prompt(messageText); 
    if (armourPick > 0 && armourPick < armourSlotToPick.length) { 
     armourSlotPicked.push({"key":j, "value":armourSlotToPick[armourPick]); 
    } 
    ... 
} 
//now we have an array that holds information about when what was picked.. 

或东西沿着这些线路..这是bt.w没有经过充分测试,这只是为了说明

+0

没错。对象文字是一个更好的方法来解决这个问题 –

+0

所以这可以很容易地在提示中使用呢?这将如何发生? –

+0

@Henrik,我非常感谢你在这个答案中的努力,你已经指出了我对这种情况的一些懈怠的方法,并且我会接受你建议通过我的大学课程帮助我提高的指标。正如我对乔纳森所说的那样,我确实想保留提示框,我只需要每次返回1条信息,它还显示了我在大学的导师,我可以分离出元素并遍历它们,直到所有元素都被占。你的答案对未来人们可能会遇到的问题是有益的,我承认,这是一个更好的方法。 –

0

你想要使用数组索引编号的项目。由于您的数字是基于一个数字的,并且该索引是从零开始的,所以在输出和解释响应时,您需要在两者之间进行转换。

这种方法还可以让你消除if-else语句中除两个以外的所有情况。

相关问题