Немного о журнале #4: вроде ошибка, а вроде и нет?
Даже не знаю, как лучше, то ли описывать все вручную (но это не интересно и многие не поймут), то ли видео (но я не могу), то ли выложить pdf. Поступлю следующим образом.
Опишу здесь и выложу ссылку на описание с картинками и комментариями на файлообменник. Так что кому будет интересно - обязательно качайте и доказывайте мою
НЕПРАВОТУ, буду только рад получить в свой адрес критику, так как сам лучше пойму как все работает.
Приступим...
Просмотрев журнал №4 от Виталия (для меня он гуру, так как я сам почти ничего еще не знаю) и вроде бы стыдно упрекать и показывать на ошибки, но мне кажется таковая имеет место, хотя компилятор ее и не выдает. Если не прав – ОБЯЗАТЕЛЬНО ПОПРАВЬТЕ МЕНЯ!!! Заранее спасибо.
Поехали.
В самом начале урока 01_game_solve_problem создается массив answers. Потом к кнопкам enterProblem_btn, solveProblem_btn, defineNewProblem_btn цепляются слушатели событий (addEventListener), чтобы программа в течении времени своей работы могла улавливать действия пользователя (в этом в принципе и заключается интерактивность). В конце каждого слушателя событий (addEventListener) указываются функции, на которые ссылается программа при нажатии на кнопке пользователем. В принципе – это все вода и можно было бы обойтись без всего этого описания, просто новость нацелена на неопытных людей. Коим и сам являюсь, и позже попытаюсь исправить эти недочеты и прислушаться к критике.
Теперь переходим к самому главному. Проглядев урок заметил одну НЕТОЧНОСТЬ, как мне показалось. Заключается она в функции function solveProblem. Там есть такая строка:
solveMessage_txt.text=(answers[Math.floor(Math.random()*answers.length)]);
В принципе все супер, все правильно, все работает. Но есть один теоретический момент.
Встроенная во flash функция Math.floor() – округляет до целого, отбрасывая дробную часть (то есть округляет в меньшую сторону). Встроенная функция Math.random() – выдает случайное число от 0 до 1. И чтобы нам случайным перебором получить все комбинации, которые у нас есть в нашем массиве answers, Виталий умножает функцию Math.random() на answers.length и получаем Math.random()*answers.length. Все замечательно, все правильно.
Но давайте чуть-чуть углубимся.
Пусть answers.length имеет значение , к примеру, 20. То есть массив answers имеет20 элементов.
Если функция Math.random() в настоящий момент выдаст (случайно конечно) 0, то тогда мы получим в данном операторе: Math.random()*answers.length = 0*20=0. Если же вдруг функция Math.random() выдаст 1, а она ее обязательно выдаст в (какой-нибудь момент времени), то получаем: Math.random()*answers.length = 1*20=20.
Значит получаем, что оператор Math.floor(Math.random()*answers.length) тоже будет равняться 20. Получается, что мы будем ссылаться тогда на элемент массива answers[20].
А у нас всего 20 элементов в массиве, а так как первый элемент массива имеет индекс – 0, то последний двадцатый элемент массива answers должен быть answers[19].
То есть выражение:
solveMessage_txt.text=(answers[Math.floor(Math.random()*answers.length)]);
на мой взгляд должно иметь следующий вид:
solveMessage_txt.text=(answers[Math.floor(Math.random()*((answers.length)-1))]);
И тогда последний элемент будет не answers[20], а answers[19], что и должно быть.
P.S.
Ошибку ни компилятор, ни программа после компилирования не выдает. Возможно либо из-за того, что варианты 0 и 1 встречаются реже чем остальной промежуток от 0 до
1, либо я неправ ☺. Может быть. Объясните пожалуйста где мой прокол. Виталию огромное спасибо за уроки, мне они очень нравятся, и я не пытался его оскорбить, просто
сам пытаюсь достигнуть истины. Рад, если к моему мнению прислушаются и дадут толковый ответ, а не оскорбления, типа, чувак, не тупи и тому подобное ☺
Надеюсь изложил свою мысль понятно (правда наверное сумбурно и с кучей воды, но это моя первая статья ☺, если понравилась, буду продолжать и улучшать).
Огромное спасибо всем: администрации сайта easyflash.org, всем читателям.
Будьте здоровы, и надеюсь до скорых встреч.
С уважением ко всем, jiexa26rus.
Регистрация: 17.07.2008
Публикаций: 79
Комментариев: 131
Статья получилась хорошая, большое спасибо.