Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python
Скачать 6.56 Mb.
|
Ерунда Я так рада видеть тебя, Ерунда Имена переменных Если имя вашей переменной будет описывать ее содержимое, то ваш код будет понятен, и работать с ним будет удобно. Вы могли бы вместо имени пе- ременной myName использовать имя alSweigart или nAmE, что никак не повлияло бы на работу программы. Но эти имена в действительности не говорят вам о том, какую информацию хранит переменная. Как говорилось в главе 1, если вы переезжаете в новый дом и пометили все свои коробки для переезда как «Вещи», это никак не поможет вам при распаковке. В предыдущих примерах мы использовали такие имена переменных, как spam, eggs и bacon, потому что имена переменных в этих примерах не имели значения. Но в последующих программах будут применяться описательные имена, какие и должны быть и у ваших программ. Имейте в виду, что имена переменных чувствительны к регистру! Это означает, что одно и то же имя, написанное без соблюдения регистра, будет относиться к другой переменной. Таким образом, в Python имена spam, SPAM, Spam и sPAM относятся к четырем разным переменным, каждая из которых содержит свои собственные значения. Во избежание путаницы вам следует избегать подобного набора имен переменных. Давайте вашим переменным описательные имена. Как правило, имена переменных в Python состоят из строчных букв. Если имя переменной содержит более одного слова, каждое следующее слово по- сле первого рекомендуется начинать с прописной буквы. Например, имя пе- ременной чтоЯКушалНаЗавтракСегодняУтром намного легче читать, чем чтоякушал- назавтраксегодняутром (русские имена переменных приведены для примера, для имен нужно использовать только латинские буквы!). Оформление имен пере- менных таким образом называется горбатым (или верблюжьим) регистром (потому что текст похож на горбы на спине верблюда), что повышает удобо- читаемость вашего кода. Программисты также предпочитают использовать более короткие имена переменных, чтобы сделать код более понятным: за- втрак или сегодняшнийЗавтрак прочитать легче, чем чтоЯКушалНаЗавтракСегодняУ- тром . Это условности необязательны, но мы рекомендуем вам придерживать- ся их, как общепринятых. Заключение Понимание основ использования строк и функций позволит вам соз- давать программы, которые взаимодействуют с пользователями. Это важ- но, потому что текст — это основной способ взаимодействия пользователя с компьютером. Пользователь вводит текст посредством клавиатуры с помо- щью функции input(), а компьютер отображает текст на экране с помощью функции print(). Строки — это еще один пример значений нового типа данных. Все значе- ния имеют тип данных, который оказывает влияние на работу оператора +. Функции используются для выполнения сложных инструкций в про- грамме. Язык Python содержит множество встроенных функций, о которых вы узнаете из этой книги позднее. Вызовы функций могут использоваться в выражениях где угодно, когда используется значение. Инструкция или шаг в вашей программе, с которой работает Python, на- зывается выполнением. В главе 3 вы узнаете больше о том, как выполнять инструкции в программе не по порядку. Узнав об этом, вы будете готовы соз- давать игры! Игра «Угадай число» 45 3 ИГРА «УГАДАЙ ЧИСЛО» В этой главе мы напишем игру, которая называется «Угадай число». Компьютер загадает секретное число в диапазоне от 1 до 20 и попросит пользователя уга- дать это число. После каждой попытки угадать, компьютер будет сообщать пользо- вателю, было ли его число больше или меньше загаданно- го. Пользователь выиграет, если угадает число за шесть попыток. Написание кода для этой короткой игры полезно тем, что затрагивает мно- го ключевых моментов программирования. Вы узнаете о том, как конвертиро- вать значения в различные типы данных и когда к этому следует прибегать. Так как эта программа — игра, то мы будем называть пользователя игроком. В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ: • Инструкции import • Модули • Функция randint() • Инструкции for • Блоки • Функции str() , int() и float() • Логические операторы • Операторы сравнения • Условия • Разница между = и == • Инструкции if • Инструкции break 46 Глава 3 Пример запуска игры «Угадай число» Вот как игрок видит вывод игры «Угадай число» во время ее прохожде- ния. Текст, который вводит игрок, выделен полужирным шрифтом. Привет! Как тебя зовут? Михаил Что ж, Михаил, я загадываю число от 1 до 20. Попробуй угадать. 10 Твое число слишком большое. Попробуй угадать. 2 Твое число слишком маленькое. Попробуй угадать. 4 Отлично, Михаил! Ты справился за 3 попытки! Исходный код игры «Угадай число» В редакторе файлов создайте новый файл, выбрав команду меню File ⇒ New File (Файл ⇒ Новый файл).В открывшемся окне введите при- веденный ниже исходный код и сохраните файл под именем guess.py. Затем запустите программу, нажав клавишу F5. Когда вы вводите этот код в редактор файлов, обязательно обратите внимание на отступы в нача- ле строк. Некоторые строки должны иметь отсту- пы в четыре или восемь пробелов. Если при выполнении программы возникают ошибки, сравните код, который вы набрали, с ори- гинальным кодом с помощью онлайн-инструмента на сайте inventwithpython.com/diff/. guess.py 1. # Это игра по угадыванию чисел. 2. import random 3. 4. guessesTaken = 0 5. 6. print('Привет! Как тебя зовут?') Make sure you’re using Python 3, not Python 2! УБЕ ДИТЕСЬ, ЧТО ИСПО ЛЬЗУЕТЕ PY THON 3, А НЕ PY THON 2! Игра «Угадай число» 47 7. myName = input() 8. 9. number = random.randint(1, 20) 10. print('Что ж, ' + myName + ', я загадываю число от 1 до 20.') 11. 12. for guessesTaken in range(6): 13. print('Попробуй угадать.') # Четыре пробела перед именем функции print 14. guess = input() 15. guess = int(guess) 16. 17. if guess < number: 18. print('Твое число слишком маленькое.') # Восемь пробелов перед именем функции print 19. 20. if guess > number: 21. print('Твое число слишком большое.') 22. 23. if guess == number: 24. break 25. 26. if guess == number: 27. guessesTaken = str(guessesTaken + 1) 28. print('Отлично, ' + myName + '! Ты справился за ' + guessesTaken + ' попытки!') 29. 30. if guess != number: 31. number = str(number) 32. print('Увы. Я загадала число ' + number + '.') Импорт модуля random Давайте взглянем на первые две строки этой программы. 1. # Это игра по угадыванию чисел. 2. import random Первая строка — это комментарий, который вы уже встречали в главе 2. Помните, что интерпретатор Python будет игнорировать все, что указано по- сле символа #. Комментарий только напоминает людям, что делает данная программа. 48 Глава 3 Вторая строка — это инструкция import . Помните, инструкции — это предписания, которые выполняют какое-либо действие, но не вычисляют значения, как это делают выражения. Вы уже встречали инструкцию при- сваивания, которая сохраняет значение переменной. Хотя Python включает в себя множество встроенных функций, некото- рые функции написаны в отдельных программах, называемых модулями. Вы можете использовать эти функции, импортируя соответствующие модули в вашу программу с помощью инструкции import. Код в строке 2 импортирует модуль random . Таким образом, программа мо- жет вызвать функцию randint(). Эта функция будет генерировать случайное число, которое должен будет угадать игрок. После того как вы импортировали модуль random, необходимо определить некоторые переменные для хранения значений, которые ваша программа бу- дет использовать позже. В строке 4 создается новая переменная с именем guessesTaken. 4. guessesTaken = 0 Эта переменная будет хранить количество попыток игрока угадать число. Так как на этом этапе программы игрок не сделал ни одной попытки, мы при- сваиваем ей целое значение 0. 6. print('Привет! Как тебя зовут?') 7. myName = input() Строки 6 и 7 аналогичны строкам из программы «Привет, мир!», описан- ной в главе 2. Программисты часто заимствуют код из других программ, что- бы сэкономить время на наборе кода. Код в строке 6 — это вызов функции print(). Помните, что функция — это как бы мини-программа внутри вашей программы. Когда ваша про- грамма вызывает функцию, она запускает эту мини-программу. Код внутри скобок функции print() — это строковый аргумент, который вы увидите на экране. Код в строке 7 позволяет игроку ввести имя и сохраняет его в пере- менной myName. Помните, это значение необязательно может быть именем игрока. Это может быть что угодно, что введет игрок. Компьютер не имеет интеллекта и следует вашим инструкциям, вне зависимости от вводимого текста. Игра «Угадай число» 49 Генерация случайных чисел при помощи функции random.randint() Теперь, когда переменные определены, вы можете использовать функцию модуля random для установки секретного числа, которое будет генерировать компьютер. 9. number = random.randint(1, 20) Код в строке 9 вызывает новую функцию, называемую randint(), и сохра- няет возвращаемое значение в качестве значения переменной number. Помни- те, что вызовы функций могут быть частью выражений, поскольку они вы- числяют значение. Функция randint() содержится в модуле random, поэтому вызывать ее нуж- но с помощью кода random.randint() (не забудьте указать точку!), чтобы Python учитывал, что функция randint() находится внутри модуля random. Функция randint() вернет случайное целое число между (и включительно) двумя указанными вами целочисленными аргументами. Код в строке 9 пере- дает числа 1 и 20, функции — в скобках, разделенные запятой — после имени функции. Случайное целое число, которое возвращает функция randint(), со- храняется в качестве значения переменной с именем number. Именно это се- кретное число игрок будет пытаться угадать. На минутку вернитесь к IDLE и введите команду import random, чтобы им- портировать модуль random. Затем введите random.randint(1, 20), чтобы уви- деть, как происходит вычисление после вызова функции. В качестве возвра- щаемого значения вы получите целое число в диапазоне между 1 и 20. Вновь введите команду и функция вернет другое целое число. Функция randint() каждый раз возвращает случайное целое число, подобно тому, как в резуль- тате броска игральных костей вы каждый раз получаете случайное значение. Например, введите указанные ниже команды в интерактивной оболочке. Числа, которые вы будете получать при вызове функции randint(), будут, ско- рее всего, разные (в конце концов, они ведь случайные!) >>> import random >>> random.randint(1, 20) 12 >>> random.randint(1, 20) 18 >>> random.randint(1, 20) 3 50 Глава 3 >>> random.randint(1, 20) 18 >>> random.randint(1, 20) 7 Вы можете попробовать разные диапазоны чисел, изменяя аргументы. Например, введите команду random.randint(1, 4), чтобы получить целое чис- ло от 1 до 4 (включая 1 и 4). Или команду random.randint(1000, 2000), чтобы получить число в диапазоне от 1000 до 2000. Введите следующий код в интерактивной оболочке и посмотрите, какие числа выпадут у вас. >>> random.randint(1, 4) 3 >>> random.randint(1000, 2000) 1294 Вы можете слегка изменить код игры, чтобы игра вела себя немного по-другому. В нашем примере мы используем целые числа в диапазоне от 1 до 20. 9. number = random.randint(1, 20) 10. print('Что ж, ' + myName + ', я загадываю число от 1 до 20.') Попробуйте изменить диапазон целых чисел на (1, 100). 9. number = random.randint(1, 100) 10. print('Что ж, ' + myName + ', я загадываю число от 1 до 100.') Теперь компьютер будет загадывать число между 1 и 100 вместо диапазо- на от 1 до 20. Изменение строки 9 повлечет изменение диапазона случайных чисел, но не забудьте также изменить текст в строке 10, чтобы игра сообщала игроку новый диапазон вместо старого. Вы можете использовать функцию randint() каждый раз, когда вам захо- чется привнести в вашу игру «элемент случайности». Вы будете использовать «случайности» во многих играх (подумайте только, для какого количества на- стольных игр необходимо использовать игральные кости!). Игра «Угадай число» 51 Приветствие игрока После того как компьютер присвоил случайное целое число переменной number , он приветствует игрока. 10. print('Что ж, ' + myName + ', я загадываю число от 1 and 20.') В строке 10 функция print() приветствует игрока по имени и сообщает, что компьютер загадывает случайное число. На первый взгляд может показаться, что в строке 10 используется боль- ше чем один строковый аргумент, но взгляните на эту строку внимательнее. Операторы + между тремя строками связывают их в одно целое. И именно эта единая строка является аргументом функции print(). Если вы пригляди- тесь, то увидите, что запятые находятся внутри кавычек и являются частью строки. Инструкции управления потоком В предыдущих главах выполнение программ начиналось с первой ин- струкции программы и происходило сверху вниз, каждая инструкция по порядку. Но с помощью инструкций for , if, else и break вы можете созда- вать циклы или пропускать инструкции, которые соответствуют опреде- ленным условиям. Такой вид команд называется инструкциями управле- ния потоком , так как они изменяют порядок выполнения кода в вашей программе. Использование циклов для повторения кода Код в строке 12 — это инструкция for, которая обозначает начало цик- ла for. 12. for guessesTaken in range(6): Циклы позволяют выполнять фрагмент кода несколько раз. Строка 12 по- вторит свой код шесть раз. Инструкция for начинается с ключевого слова for, за которым следует имя новой переменной, затем ключевое слово in и вызов функции range(), для которой указано количество циклов, которое она долж- на выполнить, и двоеточие. Давайте рассмотрим несколько дополнительных концепций, чтобы вы могли работать с циклами. 52 Глава 3 Группировка в блоки Несколько строк кода могут быть объединены в блок. Каждая строка в блоке кода начинается, по крайней мере, с того количества пробелов, что и первая строка блока. Вы можете определить начало и конец блока по коли- честву пробелов в начале строк. Это отступы строк . Программисты на языке Python обычно вводят четыре дополнительных пробела в отступах, чтобы начать блок. Каждая следующая строка с таким же количеством пробелов в начале входит в состав блока. Блок заканчива- ется там, где находится строка кода с тем же (меньшим) отступом, что и до начала блока. Существуют также блоки внутри блоков — вложенные. Рисунок 3.1 демонстрирует схему кода с выделенными и пронумерованны- ми блоками. 12. for guessesTaken in range(6): 13. ••••print('Попробуй угадать.') 14. ••••guess = input() 15. ••••guess = int(guess) 16. 17. ••••if guess < number: 18. ••••••••print('Твое число слишком маленькое.') 19. 20. ••••if guess > number: 21. ••••••••print('Твое число слишком большое.') 22. 23. ••••if guess == number: 24. ••••••••break 25. 26. if guess == number: Рис. 3.1. Пример блоков и их отступов. Серые точки отражают количество пробелов На рис. 3.1 строка 12 не имеет отступа и находится вне блока. Строка 13 содержит отступ в четыре пробела. Это указывает на начало блока, так как у этой строки отступ больше, чем у предыдущей. Каждая последующая стро- ка с таким же или бóльшим количеством пробелов в отступе считается ча- стью блока . Если Python встречает строку с количеством пробелов в от- ступе меньшим, чем в первой строке блока, это означает что блок закончен. Пустые строки при этом не учитываются. Строка 18 содержит в начале отступ из восьми пробелов . Этот блок находится внутри блока . Но следующая строка, под номером 20, содержит отступ, в котором всего четыре пробела. Так как отступ уменьшился, стано- вится понятно, что блок кода, который начался в строке 18 , закончился, но Игра «Угадай число» 53 так как строка 20 имеет такой же отступ, что и строка 13, это означает, что соответствующий блок продолжается . В строке 21 отступ снова увеличивается до восьми пробелов, таким обра- зом, начинается другой новый блок внутри блока: блок . В строке 23 завер- шается блок , а в строке 24 начинается последний вложенный блок — под номером . Оба блока и заканчиваются строкой 24. Создание циклов с инструкцией for Инструкция for обозначает начало цикла. Циклы позволяют многократ- но выполнить один и тот же код. Когда интерпретатор достигает инструк- ции for, выполняется вход в блок, который следует за инструкцией for. После выполнения кода в этом блоке интерпретатор возвращается в начало блока, чтобы выполнить этот код снова. Введите следующие команды в интерактивной оболочке. >>> for i in range(3): print('Привет! Переменной i присвоено значение', i) Привет! Переменной i присвоено значение 0 Привет! Переменной i присвоено значение 1 Привет! Переменной i присвоено значение 2 Обратите внимание, что после того, как вы ввели строку for i in range(3): и нажали клавишу Enter, в интерактивной оболочке не отобразилось новое приглашение >>>, так как среда ожидает ввод блока кода. Нажмите клавишу Enter снова после последней инструкции, чтобы сообщить IDLE, что вы за- кончили вводить блок кода. (Это применимо только в том случае, если вы работаете в интерактивной оболочке . Когда файлы .py создаются в редакторе файлов, вам нет необходимости оставлять пустую строку.) Давайте взглянем на цикл for в строке 12 файла guess.py. 12. for guessesTaken in range(6): 13. print('Попробуй угадать.') # Четыре пробела перед именем функции print 14. guess = input() 15. guess = int(guess) 16. 17. if guess < number: 18. print('Твое число слишком маленькое.') # Восемь пробелов перед именем функции print |