1
var input = document.querySelector("input");
var button = document.querySelector("button");
var inventory = ["jacket","pants","map"];
var actionsIKnow = ["north","east","west","south"];
var messages = ["A group of dangerous minions. Turn back, you do not have a sword",
  "You have gone too deep into the forest. Want to go further?",
  "A giant ruby crystal",
  "A silent lake; you see your reflection in the water",
  "Clear patch of land",
  "A sleeping dragon. Bettwe not wake it up",
  "A solitary cottage. Faint music can be heard from the inside",
  "Looks like this path leads to the cottage of the flute maker",
  "A lot of tombstones, looks like an old graveyard"
];

var userInput;
var startingPos = 4;

button.addEventListener("click",takeMeThere,false);

function takeMeThere(){
  userInput = input.value;
  userInput = userInput.toLowerCase();
  if(userInput!=null){
    validateInput();
  }
}
function validateInput(){
  for(var i=0;i<actionsIKnow.length;i++){
    if(userInput.indexOf(actionsIKnow[i]!=-1)){
      move(actionsIKnow[i]);
    }
  }
}
function move(where){
  console.log(where);
}

我正在制作一个基于文本的探索游戏,用户可以在其中选择去哪里。用户想去的地方取决于在文本字段中输入的内容。然后将此数据传递到move(where)I 所在的位置console.log(where)。它不是打印北、东等,而是打印整个actionsIKnow数组。为什么 ?

4

2 回答 2

4

简单的错误。改变

if(userInput.indexOf(actionsIKnow[i]!=-1)){

对此:

if (userInput.indexOf(actionsIKnow[i]) !== -1 ) {

http://jsfiddle.net/bz8k5/

编辑。根据评论中的讨论。为了能够以不同的格式验证输入,例如向东移动,向东移动,但不允许复活节,您可能还需要使用更复杂的验证规则。也许使用正则表达式:

if (userInput.match(new RegExp("\\b" + actionsIKnow[i] + "\\b"))) {
    move(actionsIKnow[i]);
}

http://jsfiddle.net/bz8k5/2/

于 2013-04-06T06:40:39.447 回答
3

仔细看这行代码:

if(userInput.indexOf(actionsIKnow[i]!=-1)){

让我们添加空格以使其更易于查看:

if( userInput.indexOf( actionsIKnow[i]!=-1 ) ) {

看到了吗?让我们把空格变成换行符和缩进:

if(
    userInput.indexOf(
        actionsIKnow[i] != -1
    )
) {

现在你看到问题了吗?:-)

无论如何,您在这里的真正意思可能很简单:

if( userInput == actionsIKnow[i] ) {

或者,正如@nnnnnn 建议的那样,您可以使用.indexOf() 而不是自己的循环,如下所示:

function validateInput(){
    if( actionsIKnow.indexOf(userInput) >= 0  ) {
        move( userInput );
    }
}

但要注意一个问题:.indexOf()在 IE8 及更早版本的 IE 中不提供 on an array。如果您需要支持 IE8,这将不起作用。

所以这是我最喜欢的方法:使用对象查找而不是数组。

更改actionsIKnow为:

var actionsIKnow = { north:1, east:1, west:1, south:1 };

然后更改validateInput()为:

function validateInput(){
    if( userInput in actionsIKnow ) {
        move( userInput );
    }
}

这适用于所有浏览器,如果 中有大量项目actionsIKnow,则此对象查找将比.indexOf(). 对于少数项目,性能无关紧要,但我认为in操作员可以提供最好的阅读代码。

这是一个比较大量字符串之间的性能的jsperf 。.indexOf()in

于 2013-04-06T06:43:27.237 回答