1 урок Введение и подготовка
Скачать 2.7 Mb.
|
10 урок: Случайные числа, списки.Урок 9 Случайные числа, спискиЧто такое случайность? Случайность он же random, это некое явление или событие которое в идеале невозможно предсказать, например, когда вы подбрасываете монетку, или выбираете случайного персонажа в какой-либо игре. Даже гуляя вы можете поскользнуться на банановой кожуре и она может быть выше 0%. Но что значит вероятность? Все эти проценты, как они связаны с искусственным интеллектом. Все дело в том что многие вещи в искусственном интеллекте могут быть завязаны на применении случайных чисел, что бы программа была непредсказуемой, а значит более похожей на поведение человека. Случайное число представляет собой число можно только угадать. Представим игральный кубик, у него 6 граней со сторонами от 1 до 6. Всего 6 возможных чисел. Вероятность – величина которая показывает наступление того или иного события. 100% - событие произойдет несмотря ни на что. Так, например, вероятность того, что завтра наступил ночь. Но если мы хотим, чтобы на кубике выпало например число 3, то вероятность выпада уже будет 1/6*100%. Давайте для начала посмотрим как работает рандом. Импортируем библиотеку случайных чисел. Напишем цикл в котором мы будем генерировать случайное число от 1 до 10 и если это случайное число будет равно 1, то выведем какую либо фразу. Чтобы создать генератор случайных чисел, первым делом импортируйте в начале кода модуль random. Затем воспользуйтесь функцией randint() — она выведет в окне консоли случайное целое число. Функция randint() содержит два аргумента — наименьшее и наибольшее из возможных значений. В этом примере могут быть сгенерированы числа 1, 2, 3, 4, 5, 6,7 ,8, 9, 10. import random import time while True: r = random. randint (1,10) if r == 1: print ("win") else: print ("lose") Какая вероятность выпада нашего числа? И теперь нам выводятся разные фразы выигрыша и проигрыша. Теперь давайте вернемся к прошлому занятию и изменим немного программу. Добавим библиотеку random. Добавим возможность боту обидеться за то, что мы его бросили. Вернемся к коду с прошлого и урока и допишем код с вероятностью 10%, что он может на нас обидеться. if random.randint(1,10) == 10: blockMood = “hadenought” mc.postToChat(“ FAR AWAY = 15 blockMood = "happy" friend = mc.player.getTilePos () friend.x = friend.x + 5 friend.y = mc.getHeight (friend.z, friend.z) me. setBlock(friend.z, friend.y, friend.z, block.DIAMOND_BLOCK.id) while True: pos = mc.player.getTilePos () distance = distanceBetweenPoints (pos, friend) if blockMood == "happy": if distance < FAR AWAY: target = pos.clone () else: blockMood = "sad" mc.postToChat (" elif blockMood == "sad": if distance <= 2: blockMood = "happy" mc.postToChat (" if random.randint (1,10) == 10: blockMood = "hadenough" mc.postToChat ("«bot> That's it. I've had enough!") elif blockMood == "hadenough"; if random.randint (1,50) == 50: blockMood = "happy" I mc.postToChat (" if friend != target: line = medraw.getLine (friend.x, friend.y, friend., target.x, target.y, target.z) for nextBlock in line[:-1]: mc. setBlock (friend.x, friend.y, friend.z, block.AIR.id) friend = nextBlock.clone () friend.y = mc.getHeight (friend.x, friend.z) mc. setBlock (friend.x, friend.y, friend., block.DIAMOND_BLOCK.id) time.sleep (0.25) target = friend.clone () time.sleep (0.25) Теперь, когда он на нас обидеться, программа зайдет в тупик и больше он не захочет ничего делать. Давайте добавим возможность, чтобы он мог нас простить elif blockMood == “hadenough”: if random.randint(1,50) == 50: blockMood = “happy” mc.postToChat(“ В данном случае мы использовали ключевое слово elif. У нас в самом начале указано слово if и проверяет равно ли его настроение счастливому, если же условие не выполняется, то код указанный ниже не выполняется и дальше под elif сравнивается другое состояние грустный ли бот , но если это уже не выполняется то проверяется под elif что наш бот обиделся, если это так то выполняется код указанный под этим условием. Попробуем улететь от бота, что он обиделся и попробуйте сделать так чтобы бот ваш простил. Настало время вспомнить первые уроки, давайте напишем программу, которая будет телепортировать нашего персонажа в случайные места. Ваша задача — сделать так, чтобы игрок переместился, изменив свои координаты x, y и z на случайные. Для этого сначала нужно узнать текущие координаты игрока и прибавить к каждой из них случайное число. Чтобы изменить координаты x и z, используйте значения от ‒10 до 10, а для координаты y — от 0 до 10. From mcpi.minecraft import Minecraft mc = Minecraft.create () import random www ROS = mc.player.getPos () x = pos.x y = pos. y 2 = pos.z × = x + Fandon-sandinti(-10, 10) mc.player. setPos (x, Y, z) mc.player.setPos(x,y,z) Здесь отсутствует фрагмент кода для генерации случайных смещений по осям y и z — добавьте его сами. После этого игрок сможет прыгнуть в неизвестность Позвольте случаю перенести его в новые потрясающие места! Давайте сделаем программу еще более непредсказуемой! После прыжка в случайное место разместите под ногами игрока блок случайно выбранного типа. Если вы телепортируете игрока туда, откуда он не сможет выбраться, запустите еще раз, и герой окажется в более безопасном месте. СпискиВ повседневной жизни мы составляем списки покупок, вещей в дорогу или перечисляем по пунктам порядок каких-либо действий. В Python списки устроены похожим образом: они позволяют хранить целые наборы данных в определенной последовательности. Данными могут быть строки, числа, булевы значения и даже другие списки. Обычная переменная содержит единственное значение. Списки же позволяют помещать в одну переменную множество значений, например числа от 1 до 100 или имена друзей. В других языках программирования списки часто называются массивами. При создании программ для Minecraft в списках можно хранить идентификаторы блоков, координаты игрока и много чего еще. Всё это добавляет вашим программам гибкости. Работа со спискамиСоздать список несложно — для этого заключите набор перечисленных через запятую значений в квадратные скобки. Впрочем, в квадратных скобках может и не быть значений — тогда получится пустой список. 9. Списки, словари и удары по блокам 211 Список ингредиентов для вермишелевого супа может выглядеть так: »> noodleSoup = ["вода", "соевый соус", "зеленый лук", "вермишель" "говядина"1 Список noodleSoup содержит несколько значений, и все они являются строками. Пустой список выглядит так: »> print (noodleSoup [0]) вода empryList = {} Он ничего не содержит, однако вы можете добавить в него значения позже. В Python можно не только хранить в списках любые значения, но и объединять значения разных типов в один список. давайте научимся получать доступ к данным списка и изменять их. Доступ к элементам спискаЧтобы получить значение из списка (эти значения называются элементами), нужно указать его позицию — так называемый индекс. Узнать первый элемент списка ингредиентов для вермишелевого супа можно так: Обратите внимание: первому элементу соответствует индекс 0. Соответственно, у второго элемента будет индекс 1, у третьего — 2 и так далее. Дело в том, что, работая со списками, компьютер ведет отсчет элементов с нуля. Отсчет с нуля может показаться странным, однако для этого есть причины: первые компьютеры были очень медленными и обладали малым объемом памяти. Отсчет с нуля позволял повысить быстродействие и эффективность программ. И хотя с тех пор компьютеры стали гораздо мощнее, они по-прежнему считают с нуля. Попытавшись обратиться к элементу, которого нет в списке, вы получите сообщение об ошибке. Изменение элементов спискаОтдельные значения, хранящиеся в списке, можно менять — точно так же как можно менять значения переменных. Это допустимо, потому что списки являются изменяемыми. Чтобы присвоить элементу новое значение, нужно обратиться к нему по индексу и задать значение так же, как мы присваивали его переменной (при помощи знака «равно»). Давайте заменим ингредиент говядина в списке noodleSoup на курица. Это пятый элемент списка, а значит, ему соответствует индекс 4 (вспомните: мы ведем отсчет от 0). Присвоить элементу 4 новое значение можно так: » noodleSoup [4] = "курица" Выбор случайного элементаНаверное, вы уже заметили, что мы используем в коде случайные значения. Это делает работу программы при каждом запуске непредсказуемой. Иногда бывает нужно получить случайный элемент из списка — например, выбрать случайный блок из списка блоков. Для этого хорошо подходит функция choice() из модуля random. Эта функция принимает список в качестве аргумента и возвращает случайный элемент. В коде листинга 9.5 список colors содержит названия разных цветов. Программа выбирает одно из них с помощью choice() и выводит его на экран: import random colors = ["красный", ", " синий", "пурпурный"] print (random.choice (colors)) "желтый", "оранжевый" После запуска этой программы на экране должно появиться случайное название цвета Практическое задание: Выбор случайного идентификатора блока из всего диапазона значений осложняется тем, что некоторым значениям не соответствует какой либо тип блока. Один из способов решить эту проблему — создать список с подходящими идентификаторами и выбирать из него случайное значение с помощью choice(). Ваша задача - составить список идентификаторов блоков, выбрать из него случайное значение и создать соответствующий блок в позиции игрока. (Подсказка: Первым делом создайте список идентификаторов. Затем получите случайный элемент, вызвав функцию random.choice(). Далее используйте функцию setBlock(), чтобы создать в игровом мире блок выбранного типа.) Вы уже знаете, что аргументами функций setBlock() и setBlocks() являются координаты блока и его идентификатор. Однако у этих функций есть еще один, необязательный аргумент — состояние блока. Все блоки в Minecraft находятся в одном из шестнадцати состояний, которые обозначаются числами от 0 до 15. Для шерстяных блоков каждому состоянию соответствует свой цвет. С блоком «динамит» (идентификатор 46) ничего не случится, если вы ударите по нему в его обычном состоянии (состояние 0), однако в состоянии 1 он взорвется. При этом, хотя у блока любого типа есть все 16 состояний, они не обязательно различаются между собой. Чтобы задать состояние блока, функциям setBlock() или setBlocks() нужно передать дополнительный аргумент, в данном примере state. Следующий код создает блок шерсти розового цвета: Практическое задание: Создайте стену из блоков шерсти, причем цвет укажите при помощи случайного числа Стр. |