2016-07-23 2 views
1

Я пытаюсь написать цикл while, так что игра будет продолжать играть до тех пор, пока не будут выполнены условия победы 4-го игрока. Игроки хранятся как объекты в массиве, а также имеют «активный» ключ, который отслеживает, если это их очередь.Написание существующего условия, которое прерывает цикл while

Я выделил все, что игрок делает в свою очередь в функции takeTurn(), но я пытаюсь найти способ продолжить цикл через массив allPlayers и дать каждому игроку поворот до 4 условия победы. Что мне делать? Я пробовал написать функцию «newActivePlayer», но он не работает в цикле while из-за проблем с областью, которые я пока не понимаю.

var allPlayers = [player1, player2, player3, player4] 
var activePlayer = player1; 

while (!win) { 
    takeTurn(); 
    if (activePlayer.wincondition1 === true && activePlayer.wincondition2 === true && activePlayer.wincondition3 === true && activePlayer.wincondition4 === true) { 
     win = true; 
    }; 
}; 
+1

В JavaScript, вы должны почти никогда не делает такой цикл, потому что это означает, что JS-движок не имеет возможности обрабатывать очередь событий. Вам нужно будет показать нам, что на самом деле происходит в 'takeTurn()', чтобы мы знали, что предложить, но, вероятно, вам следует решить, что делать дальше с разных обработчиков событий, а не на цикл. – jfriend00

+0

Ваша настоящая проблема в дизайне. Удалите цикл while и покажите нам функцию takeTurn. – Ibu

ответ

0

Эта петля не даст JS необходимого пространства для дыхания.

Все, что происходит внутри функции takeTurn(), вы должны возвращающие promise

Таким образом, вы сообщаете браузеру «выполнить takeTurn() и ждать, пока мои указания»

var activePlayer, i = 0; 

takeTurn().then(promiseDone()); //Way to say "check conditions and launch again" 

//This function checks the condition and call takeTurn() if game is still on 
function promiseDone(){ 

    if (!activePlayer.wincondition1 || !activePlayer.wincondition2 || !activePlayer.wincondition3 || !activePlayer.wincondition4) { 

     i === 3 ? i = 0 : i++ // see "ternary operators" if you don't get this 

     activePlayer = allPlayers[i] 
     takeTurn().then(promiseDone()); 

    } 
    else 
     alert('Game over'); 

} 
+0

Кажется, что-то не хватает - когда я запускаю программу, первый игрок переходит в свою очередь, а затем бросает сообщение «Ошибка: невозможно прочитать свойство», а затем «неопределенный». Любая идея, почему это было бы? –

+0

Вам необходимо включить механизм Promise в вашу программу. Изучите ссылку, которую вы указали, и посмотрите, как она может помочь вашей игре. Затем вы можете использовать мое решение для дальнейшего понимания того, как все должно работать, –