Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.02.2017, 07:44
Eyeder вне форума Посмотреть профиль Отправить личное сообщение для Eyeder Найти все сообщения от Eyeder
  № 1  
Ответить с цитированием
Eyeder

Регистрация: Feb 2017
Сообщений: 2
По умолчанию Проблема. Несколько рекурсий в одной функции

Доброго времени суток, уважаемые форумчане.
Я начинающий, вот решил чисто для себя посчитать математически количество попыток для заточки в одной игре. (Дико извиняюсь за невнятное изложение след. условий
Кратко: При удачной заточке +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 секунд. Прошу помощи =)


Последний раз редактировалось Eyeder; 22.02.2017 в 15:03. Причина: исправил теги
Старый 22.02.2017, 09:16
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Функции объявлены в цикле, но не вызываются. Соответственно 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();					//Если не заточилось второе...Снова точим первое
}
__________________
Reality.getBounds(this);

Старый 22.02.2017, 15:01
Eyeder вне форума Посмотреть профиль Отправить личное сообщение для Eyeder Найти все сообщения от Eyeder
  № 3  
Ответить с цитированием
Eyeder

Регистрация: Feb 2017
Сообщений: 2
Спасибо, учел Ваши замечания, и правда упустил этот момент в ночи кодинга, исправил =)
Но, к сожалению, проблему это не решило.
С утра подумал, что незачем заного вызывать функцию заточки первого (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("второе - НЕУДАЧНО"); //Если не заточилось второе...
 
	}
}
Трейсом отследил выполнение программы, шаги идут верно. Вроде работает. Поправьте, если не прав =)


Последний раз редактировалось Eyeder; 22.02.2017 в 15:02. Причина: исправил теги
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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