2016-11-13 4 views
3

У меня проблема с проектом, который я делаю; https://codepen.io/argestis/pen/gLraBq?editors=0001Проблемы с функцией, стрельба() несколько раз

У меня есть функция, то есть симон говорит игру. Пока я хочу вывести значения цветов в массив и затем сравнить этот массив с этой функцией. Все работает до тех пор, пока я не опущу значение для массива, который я использую, чтобы вытолкнуть значения, которые пользователь должен ввести из GIU, когда я вернусь к функции GameOn(), и я попытаюсь начать толкать значения триггеров щелчка несколько раз.

Вот эталонная функция, но на консоли codepen, которую я поделил выше, вы, ребята, можете увидеть ошибку, которую я получаю.

function gameOn() { 
    game.blue.on("click", function() { 

     game.guessWhat.push(1); 
     console.log("I were at blue") 
     if (game.guessWhat.length !== game.count.length) { 

     } else { 
      verifySequence(); 
     } 

    }); 

    game.red.on("click", function() { 
     console.log("I were at red") 
     game.guessWhat.push(2); 
     if (game.guessWhat.length !== game.count.length) { 

     } else { 
      verifySequence(); 
     } 
    }); 

    game.green.on("click", function() { 
     console.log("I were at green") 
     game.guessWhat.push(3); 
     if (game.guessWhat.length !== game.count.length) { 

     } else { 
      verifySequence(); 
     } 
    }); 

    game.yellow.on("click", function() { 
     console.log("I were at yellow") 
     game.guessWhat.push(4); 
     if (game.guessWhat.length !== game.count.length) { 

     } else { 
      verifySequence(); 
     } 


    }); 
} 

Благодарим за ваше время, ребята!

+0

Hou вы строите объекта 'game' и сколько раз вы называете' функцию gameOn'? – Sergio

+0

Используйте 'off', чтобы отменить регистрацию события click и связать его снова, если вам нужно, но вы не должны. Вам не нужно связывать события кликов снова и снова. – Ergec

ответ

1

Вы регистрируетесь мультипликатор 'нажмите кнопку' событие того же элемента при вызове verifySequence(). Вы можете отменить регистрацию нажмите событие перед зарегистрировать его, чтобы решить, что

//problem in verifySequence() 
 
function verifySequence() { 
 
... 
 
    if (verify) { 
 
    console.log("this is game.guessWhat: " + game.guessWhat); 
 
    //when you call nextRound() you register click event on the same item (multiple times) 
 
    nextRound(); 
 
    } else { 
 
    clearUser(); 
 
    } 
 
} 
 
} 
 

 

 
//making sure to unregister 'click' event before add one 
 
game.blue.off("click").on("click", function() { 
 
    ... 
 
}); 
 

 
game.red.off("click").on("click", function() { 
 
    ... 
 
}); 
 

 
game.green.off("click").on("click", function() { 
 
    ... 
 
}); 
 

 
game.yellow.off("click").on("click", function() { 
 
    ... 
 
});

+0

Большое вам спасибо за вашу помощь, я помню, как это делалось раньше, но я делал это неправильно. Вы не только решите проблему, я могу понять проблему сейчас! Спасибо, так много! –

+0

Im рад, что это может помочь @AlexandroNavarro приветствует – RizkiDPrast

1

Sergio. Я вызываю функцию gameOn() каждый раз, когда я очищаю значения в массиве, я нажимаю последовательность для нового раунда. Но когда я нажимаю одну кнопку, кнопка запускается до той же длины, что и другой массив, который я использую для сравнения последовательности симона.

function nextRound(){ 

game.guessWhat = []; 
game.count.push(Math.floor((Math.random() * 4) + 1)) 
console.log("this is game.count: " + game.count) 
console.log("this is game.guessWhat inside nextRound function: " + game.guessWhat) 
gameOn(); 

} 


function verifySequence(){ 

verify = true; 

console.log("this is game.guessWhat entering verifySequence function: " + game.guessWhat) 
    for(var i = 0; i < game.count.length; i++){ 
    if(game.count[i] !== game.guessWhat[i]){ 
     verify = false; 
    } 

    } 

if(verify == true){console.log("this is game.guessWhat: " + game.guessWhat); nextRound(); } 
else{clearUser();} 
} 

И это игровой объект;

var game = { 
count : [], 
guessWhat : [], 
red : $("#red"), 
blue : $("#blue"), 
green : $("#green"), 
yellow : $("#yellow") 
}; 
1

Всегда привязывайте один раз к вызову любой функции и предпочитаете готово(). В текущем методе gameOn() вы связываете клик, поэтому много раз вы можете увидеть, что он запущен. Удалите его из gameOn().

Bind щелкает следующим образом,

$(document).ready(function(){ 
game.blue.on("click", function() { 

    game.guessWhat.push(1); 
    console.log("I were at blue") 
    if (game.guessWhat.length !== game.count.length) { 

    } else { 
     verifySequence(); 
    } 

}); 

game.red.on("click", function() { 
    console.log("I were at red") 
    game.guessWhat.push(2); 
    if (game.guessWhat.length !== game.count.length) { 

    } else { 
     verifySequence(); 
    } 


}); 

game.green.on("click", function() { 
    console.log("I were at green") 
    game.guessWhat.push(3); 
    if (game.guessWhat.length !== game.count.length) { 

    } else { 
     verifySequence(); 
    } 


}); 

game.yellow.on("click", function() { 
    console.log("I were at yellow") 
    game.guessWhat.push(4); 
    if (game.guessWhat.length !== game.count.length) { 

    } else { 
     verifySequence(); 
    } 
    }); 
}); 
+0

Сэр. Большое спасибо. Честно говоря, я просто новичок, поэтому не знал, как вызвать функцию if is gameOn(); Я использовал метод off.click(), и он сработал. большое спасибо за ваше время! –

+0

@AlexandroNavarro никаких проблем. Примите мое предложение и ответьте, если это вам помогло. – ScanQR

Смежные вопросы