Проблема с дублированием фунции с при каждом вызове функции. Проблема при отладке игры
Спрашиваю в первый раз, так что если что то делаю не так , готов к конструктивной критике.
Пишу игру, где игроку необходимо нажать кнопки в той последовательности, в которой ему их показывает программа. В случае если игрок ввел все правильно, игра должна начаться с начала и количество элементов увеличится на один. Столкнулся с проблемой что каждый раз когда игра начинается с начала $("button").click(function(){.......} вызывается столько, раз сколько прошло уровней , а не один как необходимо.
В итоге console.log("приняли значение с кнопки " + numberOfButten );
вызывается столько раз сколько прошло уровней.
как мне ограничить или закрыть считыватель кликов $("button").click(function(){.......} что бы он работал только один раз. Не понимаю что спросить у интернета.
все целиком тут github
// Variabl List
var level = 2;
var tracNextLevelArray = [];
var ansverArray = [];
var count = 0;
var misakeNumber = 0;
var gameIsOn = 1;
var numbercOfLeftButtons = 0;
//funcion List
//enter in Game
function main() {
// refreshAllSkrioInfo();
if (gameIsOn == 1) {
console.log("функция майн запущена");
gameIsOn = 0;
count = 0;
misakeNumber = 0;
ansverArray = [];
refreshAllSkrioInfo();
tracGenerator();
showTrac();
chekAll();
goLevel();
chekAll();
} else {
console.log("отмена повторного запуска");
}
return 0;
}
$("button").click(main);
// trackGnenerator
function tracGenerator() {
tracNextLevelArray = [];
for (var i = 0; i < level; i++) {
var randomNumber1_4 = Math.floor((Math.random() * 4) + 1);
tracNextLevelArray.push(randomNumber1_4);
}
console.log(tracNextLevelArray);
// console.log( "длинна" + tracNextLevelArray.length);
// console.log("level " + level);
}
//function sleep
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// function pressBTN
function pressButI(qq) {
setTimeout(function() {
$(`.button_${qq}`).toggleClass("pushButton");
}, 300);
$(`.button_${qq}`).toggleClass("pushButton");
}
//shouTrac
async function showTrac() {
for (var i = 0; i < tracNextLevelArray.length; i++) {
if (tracNextLevelArray[i] == 1) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
} else if (tracNextLevelArray[i] == 2) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
} else if (tracNextLevelArray[i] == 3) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
// alert("это 3");
} else if (tracNextLevelArray[i] == 4) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
}
}
}
function goLevel() {
// $("button").click(chekAll());
// console.log(" goLevel is activ")
$("button").click(function() {
var numberOfButten = $(event.target).text();
console.log("приняли значение с кнопки " + numberOfButten);
console.log("щелчок номер" + count);
if (numberOfButten == tracNextLevelArray[count]) {
console.log("сравнили значение " + numberOfButten + " с итым эл. массива " + tracNextLevelArray[count])
ansverArray.push(numberOfButten);
console.log("добавили в массив " + ansverArray);
count = count + 1;
numbercOfLeftButtons = level - ansverArray.length;
refreshAllSkrioInfo();
if (ansverArray.length == tracNextLevelArray.length) {
level++;
gameIsOn = 1;
ansverArray = [];
count = 0;
refreshAllSkrioInfo();
console.log("Next level is " + level + " . Click any button to start.");
return 0;
}
numbercOfLeftButtons = tracNextLevelArray.length - ansverArray.length;
refreshAllSkrioInfo();
} else {
// misakeNumber++;
$("body").addClass("errorClass");
// console.log("ошибка");
//await sleep(200);
$("body").removeClass("errorClass");
refreshAllSkrioInfo();
}
return 0;
});
return 0;
}
// function addInformationInHTML (information,adressHTML)
// addInformationInHTML("levelNumberClass", levelNunber, Level number = );
function refreshAllSkrioInfo() {
$(".levelNumberClass").text("Yore level is " + level);
$(".mistakeNumberClass").text(" You have " + misakeNumber + " mistake");
$(".numbercOfLeftButtonsClass").text("Left " + numbercOfLeftButtons + " buttons");
}
function clean() {
var tracNextLevelArray = [];
var ansverArray = [];
var count = 0;
var misakeNumber = 0;
console.log("очистка произошла");
}
function chekAll() {
console.log("count = " + count);
console.log("ansverArray = " + ansverArray);
console.log("tracNextLevelArray" + tracNextLevelArray);
console.log("level = " + level);
}
body {
background-color: #110d40;
}
h1 {
text-align: center;
font-size: 8rem;
font-family: fantasy;
color: #5fe3d1;
margin-top: 1%;
margin-bottom: 1%;
padding-bottom: 1%
}
.allButton {
text-align: center;
}
.buttonSise {
height: 250px;
width: 250px;
display: inline-block;
padding: 50px, 50px;
margin: 10px;
border-radius: 20px;
border-style: solid;
border-width: 3px;
border-color: black;
}
.allButton {
margin-top: 1%;
}
/* BUTTEN */
.pushButton {
height: 230px;
width: 230px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0, 2);
opacity: .3;
}
.button_1 {
background-color: green;
}
.button_2 {
background-color: red;
}
.button_3 {
background-color: yellow;
}
.button_4 {
background-color: Blue;
}
/* class erore */
.errorClass {
background-color: red;
}
.informClass {
color: #fff;
font-size: 2rem;
}
.informDiv {
position: absolute;
margin-left: 10%;
}
.win {
background-color: green;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Simon_Game</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Simon Game </h1>
<div class="informDiv">
<h2 class=" informClass levelNumberClass">Press any key </h2>
<h2 class=" informClass mistakeNumberClass">Press any key </h2>
<h2 class=" informClass numbercOfLeftButtonsClass"> Press any key</h2>
</div>
<div class="allButton">
<div class="firsSlayd">
<button class="buttonSise button_1" type="button" name="button">1</button>
<button class="buttonSise button_2 " type="button" name="button">2</button>
</div>
<div class="secondSlayd">
<button class="buttonSise button_3" type="button" name="button">3</button>
<button class="buttonSise button_4" type="button" name="button">4</button>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="index.js" charset="utf-8"></script>
</body>
</html>
Ответы (2 шт):
Каждый раз, когда выполняется функция goLevel, она добавляет новый обработчик события click элементам button.
В функции goLevel(), которую вы вызываете каждый раз при вызове функции main навешиваются обработчики на те же кнопки. В JS на одном и том же элементе может быть сколько угодно обработчиков событий.
Если вам надо вызывать функцию goLevel при клике, уберите установку обработчика события и вызывайте тело функции напрямую.
// Variabl List
var level = 2;
var tracNextLevelArray = [];
var ansverArray = [];
var count = 0;
var misakeNumber = 0;
var gameIsOn = 1;
var numbercOfLeftButtons = 0;
//funcion List
//enter in Game
function main() {
// refreshAllSkrioInfo();
if (gameIsOn == 1) {
console.log("функция майн запущена");
gameIsOn = 0;
count = 0;
misakeNumber = 0;
ansverArray = [];
refreshAllSkrioInfo();
tracGenerator();
showTrac();
chekAll();
goLevel();
chekAll();
} else {
console.log("отмена повторного запуска");
}
return 0;
}
$("button").click(main);
// trackGnenerator
function tracGenerator() {
tracNextLevelArray = [];
for (var i = 0; i < level; i++) {
var randomNumber1_4 = Math.floor((Math.random() * 4) + 1);
tracNextLevelArray.push(randomNumber1_4);
}
console.log(tracNextLevelArray);
// console.log( "длинна" + tracNextLevelArray.length);
// console.log("level " + level);
}
//function sleep
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// function pressBTN
function pressButI(qq) {
setTimeout(function() {
$(`.button_${qq}`).toggleClass("pushButton");
}, 300);
$(`.button_${qq}`).toggleClass("pushButton");
}
//shouTrac
async function showTrac() {
for (var i = 0; i < tracNextLevelArray.length; i++) {
if (tracNextLevelArray[i] == 1) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
} else if (tracNextLevelArray[i] == 2) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
} else if (tracNextLevelArray[i] == 3) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
// alert("это 3");
} else if (tracNextLevelArray[i] == 4) {
pressButI(tracNextLevelArray[i]);
await sleep(1000);
}
}
}
function goLevel() {
var numberOfButten = $(event.target).text();
console.log("приняли значение с кнопки " + numberOfButten);
console.log("щелчок номер" + count);
if (numberOfButten == tracNextLevelArray[count]) {
console.log("сравнили значение " + numberOfButten + " с итым эл. массива " + tracNextLevelArray[count])
ansverArray.push(numberOfButten);
console.log("добавили в массив " + ansverArray);
count = count + 1;
numbercOfLeftButtons = level - ansverArray.length;
refreshAllSkrioInfo();
if (ansverArray.length == tracNextLevelArray.length) {
level++;
gameIsOn = 1;
ansverArray = [];
count = 0;
refreshAllSkrioInfo();
console.log("Next level is " + level + " . Click any button to start.");
return 0;
}
numbercOfLeftButtons = tracNextLevelArray.length - ansverArray.length;
refreshAllSkrioInfo();
} else {
// misakeNumber++;
$("body").addClass("errorClass");
// console.log("ошибка");
//await sleep(200);
$("body").removeClass("errorClass");
refreshAllSkrioInfo();
}
return 0;
}
// function addInformationInHTML (information,adressHTML)
// addInformationInHTML("levelNumberClass", levelNunber, Level number = );
function refreshAllSkrioInfo() {
$(".levelNumberClass").text("Yore level is " + level);
$(".mistakeNumberClass").text(" You have " + misakeNumber + " mistake");
$(".numbercOfLeftButtonsClass").text("Left " + numbercOfLeftButtons + " buttons");
}
function clean() {
var tracNextLevelArray = [];
var ansverArray = [];
var count = 0;
var misakeNumber = 0;
console.log("очистка произошла");
}
function chekAll() {
console.log("count = " + count);
console.log("ansverArray = " + ansverArray);
console.log("tracNextLevelArray" + tracNextLevelArray);
console.log("level = " + level);
}
body {
background-color: #110d40;
}
h1 {
text-align: center;
font-size: 8rem;
font-family: fantasy;
color: #5fe3d1;
margin-top: 1%;
margin-bottom: 1%;
padding-bottom: 1%
}
.allButton {
text-align: center;
}
.buttonSise {
height: 250px;
width: 250px;
display: inline-block;
padding: 50px, 50px;
margin: 10px;
border-radius: 20px;
border-style: solid;
border-width: 3px;
border-color: black;
}
.allButton {
margin-top: 1%;
}
/* BUTTEN */
.pushButton {
height: 230px;
width: 230px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0, 2);
opacity: .3;
}
.button_1 {
background-color: green;
}
.button_2 {
background-color: red;
}
.button_3 {
background-color: yellow;
}
.button_4 {
background-color: Blue;
}
/* class erore */
.errorClass {
background-color: red;
}
.informClass {
color: #fff;
font-size: 2rem;
}
.informDiv {
position: absolute;
margin-left: 10%;
}
.win {
background-color: green;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Simon_Game</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Simon Game </h1>
<div class="informDiv">
<h2 class=" informClass levelNumberClass">Press any key </h2>
<h2 class=" informClass mistakeNumberClass">Press any key </h2>
<h2 class=" informClass numbercOfLeftButtonsClass"> Press any key</h2>
</div>
<div class="allButton">
<div class="firsSlayd">
<button class="buttonSise button_1" type="button" name="button">1</button>
<button class="buttonSise button_2 " type="button" name="button">2</button>
</div>
<div class="secondSlayd">
<button class="buttonSise button_3" type="button" name="button">3</button>
<button class="buttonSise button_4" type="button" name="button">4</button>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="index.js" charset="utf-8"></script>
</body>
</html>