PDA

Просмотр полной версии : Проблема. Несколько рекурсий в одной функции


Eyeder
22.02.2017, 07:44
Доброго времени суток, уважаемые форумчане.
Я начинающий, вот решил чисто для себя посчитать математически количество попыток для заточки в одной игре. (Дико извиняюсь за невнятное изложение след. условий:)
Кратко: При удачной заточке +1, При неудачной всегда обнуление. Шанс 75%
Код для заточки одного предмета написал, работает. Задумал посчитать, будет ли меньше попыток для заточки нужного предмета, если после каждой успешной его заточки ждать неудачи на других трех предметах, и только после неудачи снова переходить к заточке первого.
Собственно код:

var enchant = 0; //Изначальная заточка необходимого предмета
var chance1: Number; //
var chance2: Number; //Переменные для хранения шансов заточки для каждого из четырех предметов
var chance3: Number; //
var chance4: Number; //
var tries = 0; // Изначальное количество попыток

button.addEventListener(MouseEvent.CLICK, enchantingOne); //Кнопка заточки на одном предмете
button2.addEventListener(MouseEvent.CLICK, enchantingFour); //Кнопка заточки на четырех предметах

//Заточка единственного предмета
function enchantingOne(event: MouseEvent): void { //Нажимаем на кнопку
while (enchant < 10) { //До тех пор, пока не заточилось на + 10
chance1 = Math.random() //Точим
if (chance1 * 100 < 76) { //Шанс 75%
enchant++ //Прибавляем уровень заточки
tries++ //Увеличиваем счетчик попыток
} else { //Если не заточилось
enchant = 0 //Обнуление заточки
tries++ //Увеличиваем счетчик попыток

}
}
//Вывод количества попыток в динамическое текстовое поле, обнуление переменных для повтора.
memo.text = tries + " Попыток";
enchant = 0;
tries = 0;
}

//Заточка на четырех предметах
function enchantingFour(event: MouseEvent): void { //Нажимаем на кнопку
while (enchant < 10) { //До тех пор, пока не заточится на + 10
function enFirst(): void { //Точим первое
chance1 = Math.random() //Шанс заточки 75%
if (chance1 * 100 < 76) { //Если успешно заточилось первое
enchant++ //Прибавляем уровень заточки
tries++ //Увеличиваем счетчик попыток заточки первого
function enRest(): void { //Точим другие
chance2 = Math.random() //Шанс 75%
if (chance2 * 100 < 76) { //Если успешно заточилось второе, точим третье
chance3 = Math.random() //Шанс 75%
if (chance3 * 100 < 76) { //Если успешно заточилось третье, точим четвертое
chance4 = Math.random() //Шанс 75%
if (chance4 * 100 < 76) { //Если успешно заточилось и четвертое...
enRest() //...Возвращаемся к заточке со второго
} else { //Если не заточилось четвертое...
enFirst() //...Снова точим первое
}
} else { //Если не заточилось третье...
enFirst() //...Снова точим первое
}
} else { //Если не заточилось второе...
enFirst() //...Снова точим первое
}
}
} else { //Если не заточилось первое
enchant = 0 //Сбрасываем заточку
tries++ //Увеличиваем счетчик попыток заточки первого
}
}
}
//При успешной заточке на +10 вывод в динамическое текстовое поле количества попыток заточки первого ...
//...и обнуление переменных для повторения заточки с нуля.
memo.text = tries + " Попыток";
enchant = 0;
tries = 0;
}

Компилируется, но при запуске счетчика заточки на четырех предметах приложение перестает отвечать и оживает через 15 секунд. Прошу помощи =)

Wolsh
22.02.2017, 09:16
Функции объявлены в цикле, но не вызываются. Соответственно enchant не растет, условие цикла не выполняется и цикл повторяется бесконечно.

Добавлено через 46 минут
Как-то так, если я правильно понял логику//Заточка на четырех предметах
function enchantingFour(event: MouseEvent): void { //Нажимаем на кнопку
while (enchant < 10) enFirst(); //До тех пор, пока не заточится на + 10 Точим первое
//При успешной заточке на +10 вывод в динамическое текстовое поле количества попыток заточки первого ...
//...и обнуление переменных для повторения заточки с нуля.
memo.text = tries + " Попыток";
enchant = 0;
tries = 0;
}

function enFirst(): void { //Точим первое
chance1 = Math.random(); //Шанс заточки 75%
if (chance1 * 100 < 76) { //Если успешно заточилось первое
enchant++; //Прибавляем уровень заточки
enRest();
} else enchant = 0; //Если не заточилось первое Сбрасываем заточку
tries++; //Увеличиваем счетчик попыток заточки первого
}

function enRest(): void { //Точим другие
chance2 = Math.random(); //Шанс 75%
if (chance2 * 100 < 76) { //Если успешно заточилось второе, точим третье
chance3 = Math.random(); //Шанс 75%
if (chance3 * 100 < 76) { //Если успешно заточилось третье, точим четвертое
chance4 = Math.random(); //Шанс 75%
if (chance4 * 100 < 76) { //Если успешно заточилось и четвертое...
enRest(); //...Возвращаемся к заточке со второго
} else enFirst(); //Если не заточилось четвертое...Снова точим первое
} else enFirst(); //Если не заточилось третье...Снова точим первое
} else enFirst(); //Если не заточилось второе...Снова точим первое
}

Eyeder
22.02.2017, 15:01
Спасибо, учел Ваши замечания, и правда упустил этот момент в ночи кодинга, исправил =)
Но, к сожалению, проблему это не решило.
С утра подумал, что незачем заного вызывать функцию заточки первого (enFirst()) при неудаче в (enRest()),
т.к. в случае неудачи цикл начнет выполняться заного так или иначе.
В итоге:

function enchantingFour(event: MouseEvent): void { //Нажимаем на кнопку

enFirst();
//При успешной заточке на +10 вывод в динамическое текстовое поле количества попыток заточки первого ...
//...и обнуление переменных для повторения заточки с нуля.
memo.text = tries + " Попыток";
enchant = 0;
tries = 0;
}
function enFirst(): void { //Точим первое
while (enchant < 10) { //До тех пор, пока не заточится на + 10
chance1 = Math.random(); //Шанс заточки 75%
if (chance1 * 100 < 76) { //Если успешно заточилось первое
enchant++; //Прибавляем уровень заточки
tries++; //Увеличиваем счетчик попыток заточки первого
trace("ПЕРВОЕ - удачно");
enRest(); //Точим остальные

} else { //Если не заточилось первое
enchant = 0; //Сбрасываем заточку
tries++; //Увеличиваем счетчик попыток заточки первого
trace("ПЕРВОЕ - НЕудачно");
}
}
}
function enRest(): void { //Точим другие
chance2 = Math.random(); //Шанс 75%
if (chance2 * 100 < 76) { //Если успешно заточилось второе, точим третье
trace("второе - удачно");
chance3 = Math.random(); //Шанс 75%
if (chance3 * 100 < 76) {
trace("третье - удачно"); //Если успешно заточилось третье, точим четвертое
chance4 = Math.random(); //Шанс 75%
if (chance4 * 100 < 76) {
trace("четвертое - удачно"); //Если успешно заточилось и четвертое...
enRest(); //...Возвращаемся к заточке со второго
} else {
trace("четвертое - НЕУДАЧНО"); //Если не заточилось четвертое...

}
} else {
trace("третье - НЕУДАЧНО"); //Если не заточилось третье...

}
} else {
trace("второе - НЕУДАЧНО"); //Если не заточилось второе...

}
}

Трейсом отследил выполнение программы, шаги идут верно. Вроде работает. Поправьте, если не прав =)