[14]: Генератор случайных чисел

Приветствую вас, киноманы :) Сегодня расскажу вам как сделать генератор случайных чисел в action script 3.0. :) Очень важная вещь, потому что элемент случайности в играх обязательно нужен :) Ну так вот сегодня пойдёт речь о таких методах как: Math.random, Math.floor, Math.ceil, Math.round.

Math.random(); – возвращает случайное число от 0 включительно до 1 невключительно, т.е. [0, 1).
Math.floor() - возвращает целую часть числа, будем пользоваться в основном этим.
Math.ceil() - округляет до целого числа В БОЛЬШУЮ СТОРОНУ.
Math.round() - округляет в большую или меньшую сторону до ближайшего целого числа, как округляли числа в школе. Не будем пользоваться, оно несправедливое :)

Да вот собстнно и всё :) Что бы получать какие либо числа - от 0 до 10 или 1 до 25, и прочие вариант нужно манипулировать с перемножением и делением чисел.
Допустим мы хотим получить случайное число от 0 до 10. Для этого мы сначала создаём случайное число от 0 до 1:

var number1 = Math.random();

а потом мы проворачиваем вот такое дело:

var number2 = Math.floor(number1*11);

т.е. мы наше случайное число умножаем на 11 и получаем число от 0 до 11 [0, 11) и берем от этого числа целую часть, и это как раз будут числа от 0 до 10, потому что 11 - не входит в пределы этого числа.  Так же можно делать различные интервальные генераторы, о чём рассказано в видео.

Обо всём этом (и не только этом) смотрите в видеоуроке ниже:

Исходник: yadi.sk/d/hMBv-DumF48e3
Код ActionScript 3.0 из урока:

Всё подробно рассказано в видео :) Если будут какие-либо вопросы, пишите в комментариях к видео. Надеюсь, данный урок по реализации скорости в action script 3.0 в программе adobe flash, поможет вам в разработке игр. :)

 

Комментарии
  1. Dmitriy154

    Прекрасно! Очень хорошо подготовлены уроки. Кратко и понятно. Евгений, как вы осваивали flash? Очень интересно

    • admin

      спасибо :) начинал в 2003-2004 году с рисования мультиков. Потом уже простые команды as2. потом разбирал готовые примеры во флеше (в папке examples что ли), как что работает. Оттуда научился как делать команды с клавиатуры и мыши. Потом уже купил себе книгу Джоба Макара по разработке игр на as2 :) Оттуда многое применяю. Некоторые тонкости на форумах ищу. Некоторые придумываю сам. Потом, когда вышел AS3 и книга Коли Мука, я её вообще не понял, т.к. был завал в универе полный и на 100 странице я забил на неё. Да и на сам флеш года на 2… Потом приобрел курс ActionScript 3. От нуля до ООП, с помощью которого смог легко перейти с as2 на as3. Так всё так легко было описано, в отличие от заумной Муковой книги. А да, ещё откопал инфу как сделать подсветку кода, и автокод. У меня он не работал. Там в реестре надо было химичить и сделать привязку fla-файлов к флешу. Но мне всё равно as2 нравится больше :) )) Не люблю классы… Поэтому их и не использую. Хотя порой бывает удобнее использовать классы, но как-то будет не особо, если часть кода в кадрах, а часть в классах.. С 2005 года уже платформеры собирал про друзей :D И самолёты, типа как galaxy на денди :) в каком-то 2008-10 году под заказ делал игры. Тоже платформеры. Вот, как-то так :)

  2. Dmitriy154

    Чувствуется опыт. Спасибо!

  3. Тарас

    Скажите пожалуйста, а как сделать, чтобы не повторялся случайный рисунок в AS 3, например я должен кликнуть 4 раза и при каждом новом клике должен появится новый рисунок. А меня есть такой код, но он работает только в AS 2 что нужно изменить, чтобы заработало в AS 3(скрипте).

    stop();
    var rArray:Array = new Array();
    var rand:Number = Math.floor(Math.random() * rArray.length);

    this.onLoad = function() {
    rArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
    gotoAndStop(rArray[rand]);
    rArray.splice(rand, 1);
    trace(rArray);
    }

    b.onRelease = function() {
    rand = Math.floor(Math.random() * rArray.length);

    gotoAndStop(rArray[rand]);
    rArray.splice(rand, 1);
    trace(rArray);

    }

    • admin

      ну, картинок я не вижу, но код будет таким:

      import flash.events.MouseEvent;

      stop();
      var rArray:Array = new Array();
      var rand:Number = Math.floor(Math.random() * rArray.length);

      rArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
      gotoAndStop(rArray[rand]);
      rArray.splice(rand, 1);
      trace(rArray);

      b.addEventListener(MouseEvent.CLICK, mc);
      function mc (e:MouseEvent) {
      if (rArray.length>0) {
      rand = Math.floor(Math.random() * rArray.length);
      gotoAndStop(rArray[rand]);
      rArray.splice(rand, 1);
      trace(rArray);
      }
      }

  4. Тарас

    Спасибо – заработало. Алексей, это ваш яндекс кошелек: 41001461813695 хочу поблагодарить материально, как говорится пиво с меня

    • admin

      Так-то кошелёк мой, но я Евгений пока ещё :D

  5. Тарас

    А понятно, лучше оставайтесь Евгением, это я по ссылке перешел “Box2D Бесплатный курс” а том об авторе, извините, перепутал. Еще раз спасибо, ваши видео уроки очень полезны.

    • admin

      Благодарю :) Будет теперь чем оплатить хостинг на 2 месяца :) )) Курс по box2d не мой :) Просто влепил ссылку желающим изучить, по боксу и так много курсов, не вижу смысла делать их ещё и мне. Я сделаю по quickbox2d (упрощенный box2d), хотя может и нет, может уйду сразу в unity. :)

  6. Тарас

    Еще раз стучусь Евгений к вам за помощью. Чтобы посмотреть на проблему, я создал пример, посмотреть можно скачав файл, там вы все увидите

    https://disk.yandex.ua/public/?hash=mjWQ7D2AcyRMj/1EPeOKnKf7Y3RFZu186Ono3/483xo%3D
    Суть в том, что у меня через малое количество знаний, не получается прописать скрипт на главной сцене, пришлось заходить в символ и прописывать отдельно. Как вы могли заметить, чтобы у меня карты не повторились, я в каждый символ загружал другие карты, то есть в крайней левой стопке никогда не будет пик, как в правой крайней стопки никогда не будет бубны. Конечно, это не правильно, сам понимаю, что сделал по аборигенки но, это я на все что могу, надеюсь, что со временем руки выпрямляться. Если вам не трудно, можете сделать как должно быть, а я потом по шаблону продолжу – конечно, что не за спасибо, ваша цена?

    • admin

      цена – как сам хочешь. хоть за спасибо :) опиши игру, просто есть несколько вариантов как сделать, но непонятно, в чем суть игры. Какие карты используются, правила игры, условия выигрыша, сколько игроков и т.д.

  7. Тарас

    Нууу, сегодня просто так даже птички не поют, когда смотрел на создание косынки, мне вас аж жалко стало, столько работы…
    Это не игра, делаю на эзотерический собственный сайт. Раскладов много будет, планирую сделать на рунах и на картах 36 шт. По ходу дела изучаю как сам адоб флеш так и скрипт. С вашей помощью (вчера) сделал шаг вперед, но опять препятствие. На сегодняшний день не знаю, как сделать, чтобы карты летели в три стопки и не повторялись, и чтобы расклад был случайным (рамдомный). Мне бы хоть один вариант, а по нему я как по шаблону следующие расклады буду делать.

    • admin

      Вот, сделал такой вариант. Желательно бы, всё знать про приложение, и от этого плясать. Руны и карты в одном или в разных приложениях?, что должно происходить при комбинациях, нужно ли определять какие карты мы вынули из колоды? Цифры, масти, или всё равно? Просто от этого зависит какой код писать. Он будет разный. :)
      http://yadi.sk/d/aeO9AjLQMqwV6
      Надеюсь у тебя откроет этот файл. Сохранен под cs5.5.

  8. Тарас

    К сожалению не открывается версия 5.5, щас в нете прогу поищем 5.5
    Открываться будут масти, то есть рисунки, а комбинации разные будут, пока что мои знания не такие сильны, чтобы сложные комбинации делать, начну с самых простых.

    • admin

      я могу сохранить ещё в cs5 или cs4, но не cs3.

  9. Тарас

    у меня cs5 Если можно еще раз бросьте в сs5 версии

  10. Тарас

    Очень спасибо, совсем другой ход мысли чем у меня, начну разберутся. Кстати в интернете и в ютюбе такого расклада с рамдомон нету, дня три наверно рыл, так и не нашел чтобы картинки не повторялись.

    • admin

      Если что непонятно, спрашивай :)
      Подобный расклад с рандомом я использовал в косынке :) Только у меня сразу для всех карт, а у тебя выдёргиваются по одной :)

  11. Тарас

    Да я смотрел расклад с косынкой, даже несколько раз, этот урок далеко не для начинающихся. Как говорится материально спасибо я сказал, если мало так говори, ты ведь мое время сэкономил, а свое потратил, не хочу тебя обидеть.

    • admin

      Справедливо :) Никаких обид ;)

  12. Тарас

    Здравствуйте Евгений, в процессе работы столкнулся с такой проблемой. Как сделать, чтобы перед пользователем лежали десять карт все активные, но пользователь должен вытащить только одну, после чего, остальные карты уже не должны быть активными..
    По вашему примеру, я делаю так var rArray:Array = [1 ]; но постоянно выпрыгивает карта из первого кадра, а мне нужно чтобы из 36 кадров выпрыгивала одна карта, но чтобы была всегда разная.

    • admin

      Вот такой вариант могу предложить :) Только подделай под свои задачи. Не знаю сколько и куда должны уезжать… Кнопку рестарт переделал под этот код :) Можешь тестить этой кнопкой :)
      http://yadi.sk/d/fGvPnzNKNSVFa

  13. Тарас

    Очень спасибо, ты опять предусмотрел с неактивными картами как в прошлый раз с кнопкой restart. Жаль, что у тебя нету видео или простых уроков.

    • admin

      В смысле нет видео?:) А все простые уроки у меня есть :) Те 32 видеоурока и есть по основам. Дальше просто нужно грамотно их совмещать :) Единственное, я не рассматривал типы переменных, а остальное всё там есть :)

  14. Тарас

    Видео урокам цены нету. И я об этом, что грамотно нужно их совмещать, но если не знаешь, как совмещать между собой скрипты, то есть значение всех скриптов и как они работают, тяжело совмещать графику со скриптами. Возможно по этому, что нужно сначала учить скрипты, за что отвечает каждая команда.
    Твои уроки не все для чайников, например, когда я смотрел твою косынку, я многое не понимал, а когда ты мне написал программу, я понял, куда ты складывал все карты и откуда, потом вытаскивал. А то что ты мне написал с рамдомами, такого не сделаешь по твоих уроках, да и в интернете не найдешь. И все таки наверное самая большая проблема это скрипты, как они работают.

    • admin

      Возможно стоило сделать аннотации в видео, и в разных частях ролика делать ссылки на другие уроки. Где про рандомы, отсылать на генератор случайных чисел, там, где перекладывал карты – на массивы, и т.д. Просто не все смотрят обычные уроки. Многие сразу хотят обучалки сложных игр.) А когда смотрят – не понимают как это всё работает :D
      По поводу “умения совмещать” – это придёт с практикой.
      По поводу “нужно сначала учить скрипты, за что отвечает каждая команда.” – я вроде в уроках и так дал практически всё что требуется и их действительно надо бы выучить. Хотя бы все, за исключением уроков про столкновения линий и кругов. Что-то новое бывает, но этого очень мало или интуитивно понятно. Если что-то не понятно, то я рассказываю. А так – любую игру можно собрать просто грамотно совмещая те уроки.
      То, что я сделал с рандомами, я ж не искал нигде. Я просто знаю с чем я могу оперировать во флеше, и как из этого можно собрать то, что мне нужно :) А когда не знаешь, проблематично конечно :) Опять же. 90% того, чего нужно знать, есть в тех уроках :) Но уроков для чайников, или людей незнакомых с программированием вообще, у меня и правда нет :)

  15. Тарас

    Только с одним разобрался, сразу вторая проблема. Во втором твоем примере у меня после анимации (расклада карт) переходило в другой монтажный кадр и все работало, а в тратим (последнем примере) уже так не работает. Если я удаляю все предыдущие анимационные кадры, все начинает работать. Вопрос в том, как сделать, чтобы проигрывалась анимация, другими словами с одного кадра переходило к тому месту, где нужно вытаскивать карты и чтобы все это работало. Как например сделать здесь http://yadi.sk/d/YMyc2a1WNecdV чтобы оно заработало. Как бы ты это сделал?

    • admin

      А можешь кинуть пример, где есть анимация (расклада карт) и всё работает?
      То что ты скинул, чтобы это заработало нужно убрать все кнопки в картах. Вообще ума не дам зачем ты туда кнопок напихал, да ещё в кнопках кнопки. Всё должно быть только в мувиклипах! Если хочешь, чтобы карта при наведении выезжала вверх, то пропиши одну одинаковую функцию MouseEvent.MOUSE_OVER для каждой карты.
      Просто я не пойму о какой раскладке идёт речь, если её вообще нету в этом файле.

    • admin

      касаемо твоего файла, чтобы он работал надо убрать все кнопки из карт.
      http://yadi.sk/d/rNO-schuNfWZ8
      Да, и непонятно зачем ты каждой карте сделал отдельный клип… 100 лет уходит чтобы в каждом менять одно и тоже. Они же одинаковые… Вполне хватает 1 карты. Чтобы в одной поменял и поменялось во всех.
      Кстати, классы придуманы для этого же. Типа поменял в одном, а поменялось везде, но я и без классов делаю функции, чтобы поменял там и поменялось везде. :)

  16. Тарас

    То что я сделал ну или хочу с твоей помощью сделать, мне точно так же не понятно как это ты делаешь, я так же удивляюсь как ты это делаешь, но разница в том, что ты с моей работы смеёшься а я удивляюсь. Так что выкладываю свой прикол. Начал я с анимации, а по сколько мои знания в скриптах нулевые, я додумался сделать так, пока что по другому не могу. http://yadi.sk/d/n3RV2difNgApg
    Как ты заметил, карты ложатся а потом, те что разложились, начинают смещается – это пока что для меня загадка, возможно через то, что нету точных координат “x-y”. Затем, когда карты разложились, я сделал дополнительную сцену, затем сделал еще один монтажный кадр, иначе не работало. А те слова “выберете одну любую карту” хотел, чтобы они исчезали после выбора карты, но ума не хватило, пришлось взять затухающий код из самого флеша “фрагменты кода”.
    Так что слепил такую от фигню. Можешь судить строго, я не с обидчивых.

    • admin

      Держи: http://yadi.sk/d/PHw8UgjSNh5rz
      Я бы не сказал что я смеюсь, я просто в шоке над кучей лишней работы! :) То, до чего ты додумался, эт хорошо ;) Я маленько изменил приложение. Точнее всё :D

  17. Тарас

    Ай да как карты ровненько ложатся. Спасибо, с меня пиво – если мало так скажи, чтобы без обиды, как моя мама говорит, чтобы было все по христиански.
    Сам ржу не могу, как додумался – методом тыка. Я еще год назад познакомился с флеш анимацией, но после месяца забросил, увидел, что долго джава скрипт нужно учить. Теперь понял, что надо было год назад все таки долго учить.
    Я так понимаю, что во флеше нельзя сделать так, чтобы над картами вместе стрелки рука была.

  18. Тарас

    На атом сайте он как то сделал, что после расклада рука. Там ссылка http://yadi.sk/d/lN398CCeNh9Kh

    • admin

      можно и с рукой после расклада:)
      http://yadi.sk/d/EZdaRvjRNiSVK
      Если хочешь, чтобы рука над картами была всегда, то раскомментируй строку 58.:)
      Но про джава скрипт ты конечно перебрал :D тут всё таки экшен скрипт :) а вот джава скрипт мне не помешало бы выучить. но он сложнее. когда-то делал выпадающее меню на сайте на нём.. жесть :D

  19. Тарас

    Спасибо за руку. А ну да, это экшен скрипт, пока что для меня они одинаковые, но, все таки у них общего что-то есть.

    • admin

      Ну так во всех языках есть общие вещи :) Все пошли от Паскаля :) или чего там ещё раньше было.
      p.s. в 189 строке в функции handOn(), поменяй цикл на от 0 до 35, а то там от 1 до 35. первая карта без руки получается. :)

  20. Алексей

    Как можно всунуть вот этот генератор чисел в свойства координат какого либо объекта. Т.е я например хочу что-бы шар убегал от мышки и он появлялся в рандомных местах.

    • admin

      Напиши условие:
      Если координаты курсора мыши пересекают шар, то координаты шара рандомные: по Х от 0 до ширины окна, по У от 0 до высоты окна.

  21. Михаил

    Привет, Евгений. подскажи, пожалуйста, в чем может быть ошибка. при компилировании следующего кода, в поле table1 появляется не число без дробной точки. т.е. вместо 0,25978 получается 025978. короче, творится полное безобразие)))) вот код:
    import flash.events.MouseEvent;

    knopka.addEventListener (MouseEvent.CLICK, mc);
    function mc (e:MouseEvent) {
    //число от 1 до 10
    // var n = Math.floor (Math.random ()*11);
    var num1 = Math.random ();
    table1.text = num1;
    var num2 = Math.floor (num1*11);
    table2.text = num2;

    }

    • Михаил

      Я уже разобрался. нужно в свойствах полей table1 – table8 в свойствах, в поле “сглаживание” ставить “шрифты устройства” или “растровый текст(без сглаживания)”. а, по молчанию, у меня стояло “сглаживание для читаемости” и все это безобразие было из-за нее))))

  22. Михаил

    Евгений, а ты не знаешь почему операторы иногда ведут себя странно. вот пример кода:
    import flash.events.MouseEvent;
    knopka.addEventListener (MouseEvent.CLICK, mc);
    function mc (e:MouseEvent) {
    //число от 1 до 10
    // var n = Math.floor (Math.random ()*11);
    var num1 = Math.random ();
    table1.text = num1;
    var num2 = Math.floor (num1*11);
    table2.text = num2;
    var num3 = Math.ceil (num1*11);
    table3.text = num3;
    }
    . в поле table1 сгенерировалось число 0,1988209881. оператор Math.floor (num1*11); выдал в поле table2 результат – 2, а оператор Math.ceil (num1*11); выдал 3. ну это же не правильно. должно же быть 1 и 2 соответственно.

    • admin

      Это ты молодец, что написал, у меня ошибка в статье.:\ надо будет исправить. ceil округляет в большую сторону. А до ближайшего целого округляет round. На javascript как раз ceil так работает. ну да ладно…

      По поводу: “в поле table1 сгенерировалось число 0,1988209881. оператор Math.floor (num1*11); выдал в поле table2 результат – 2, а оператор Math.ceil (num1*11); выдал 3.”
      Это ПРАВИЛЬНО! 0,1988*11 = 2,187. Целая часть (floor) = 2, а округление до целого в большую сторону (ceil) = 3. До ближайшего целого (round) = 2. :)

    • admin

      Вот пример :) Как я говорю, trace – самая лучшая штука:))))
      stage.addEventListener (MouseEvent.CLICK, mc);
      function mc (e:MouseEvent) {
      var num1 = Math.random ();
      trace(‘n = ‘, num1);
      trace(‘n*11 = ‘, num1*11);
      var num2 = Math.floor (num1*11);
      trace(‘floor = ‘, num2);
      var num3 = Math.ceil (num1*11);
      trace(‘ceil = ‘, num3);
      var num4 = Math.round (num1*11);
      trace(’round = ‘, num4);
      }

      • Михаил

        Спасибо, Евгений. я все понял)))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">