Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема. Несколько рекурсий в одной функции (http://www.flasher.ru/forum/showthread.php?t=213909)

Eyeder 22.02.2017 07:44

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

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 минут
Как-то так, если я правильно понял логику
Код AS3:

//Заточка на четырех предметах
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()),
т.к. в случае неудачи цикл начнет выполняться заного так или иначе.
В итоге:
Код AS3:

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("второе - НЕУДАЧНО"); //Если не заточилось второе...
 
        }
}

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


Часовой пояс GMT +4, время: 01:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.