#javascript #settimeout #puzzle
#javascript #settimeout #Головоломка
Вопрос:
надеюсь, этот вопрос не заставит мою задницу пылать. В настоящее время я работаю над игрой-головоломкой, и у меня есть весь мой базовый код. Теперь, чтобы сделать его более «профессиональным», я хотел бы реализовать функцию для перетасовки всех карт. Что касается алгоритма перетасовки, я хорошо подготовлен, и у меня уже есть один, но, чтобы сделать его более приятным для глаз, я бы хотел, чтобы скрипт останавливался на несколько миллисекунд после каждого успешного обмена картами, вместо того, чтобы показывать головоломку, уже перетасованную после щелчкакнопка, которая и есть то, что происходит сейчас (даже если я уже пытался использовать функцию «setTimeout»).
Мой сценарий следующий, надеюсь, кто-нибудь поможет мне разобраться в этом:
function shuffleCards() {
var temp;
for ( var i=0 ; i<50 ; i ) {
setTimeout(function(){
temp = Math.floor((Math.random() * 3) 1);
if (temp === 1)
move( "t1" );
else if (temp === 2)
move( "t2" );
else if (temp === 3)
move( "t3" );
} , 500);
}
}
(К вашему СВЕДЕНИЮ: функция draw() вызывается в конце функции move() )
Комментарии:
1. ваш вопрос не заставит вас вспыхнуть, если вы не опубликуете какой-либо html или функцию перемещения, хотя 🙂
2. Ну, я не считаю это необходимым для решения моей проблемы. Все, что мне нужно сделать, это установить интервал паузы между каждой итерацией моего цикла.
Ответ №1:
ваш setTimeout
внутренний цикл for выполнит все действия в целом с задержкой в 500 мс.
Попробуйте setInteval
вместо setTimeout
.
function shuffleCards() {
var temp;
var i=0;
var shuffle = setInterval(function () {
if (i < 50) {
i ;
temp = Math.floor((Math.random() * 3) 1);
if (temp === 1)
move("t1");
else if (temp === 2)
move("t2");
else if (temp === 3)
move("t3");
} else {
clearInterval(shuffle);
}
}, 500);
}
Комментарии:
1. Хорошо, спасибо, я попробую. Только один вопрос о вашем решении: почему вы не использовали цикл for, как я? Это неправильно / бесполезно или что-то в этом роде?
2. ваш setTimeout внутри цикла for будет выполнять все действия в целом с задержкой в 500 мс, если вы не используете закрытие
3. О, спасибо, это где-нибудь задокументировано, чтобы я мог изучить поведение setTimeout ?
4. проверьте это: brackets.clementng.me/post/24150213014 /…
Ответ №2:
Если вы также хотите отложить действия после перетасовки карт, вы можете использовать рекурсивный подход с обратным вызовом в конце:
function shuffleCardsWait( i, ms, limit, cb ) {
var temp = Math.floor((Math.random() * 3) 1);
if (temp === 1)
move( "t1" );
else if (temp === 2)
move( "t2" );
else if (temp === 3)
move( "t3" );
if ( i < limit ) {
setTimeout( function( ) {
i ;
shuffleCardsWait( i, ms, limit, cb );
}, ms );
} else {
if ( cb ) cb( );
}
}