Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python
Скачать 6.56 Mb.
|
Игровой цикл В первой части программы определяется несколько функций, но не запу- скается код внутри них. Строка 35 — позиция, где начинается основная часть программы, так как это первая строка, в которой происходит какое-либо вы- полнение. 35. playAgain = 'да' 36. while playAgain == 'да' or playAgain == 'д': 90 Глава 5 С этой строки начинается основная часть программы. Предыдущие ин- струкции def просто определяли функции. Они не запускали код внутри этих функций. В строках 35 и 36 расположен цикл, в котором содержится оставшийся код игры. В конце игрок может сообщить программе, хочет ли он сыграть снова. Получив ответ 'да', интерпретатор переходит к циклу while , чтобы снова запустить всю игру с самого начала. В противном случае условие инструкции while будет ложным, интерпретатор перейдет в конец програм- мы, и ее работа завершится. При первом переходе к инструкции while, в строке 35, переменной playAgain присваивается значение 'да'. Это означает, что при старте програм- мы условие в строке 36 будет истинно. Таким образом мы обеспечиваем, что цикл while будет выполнен хотя бы один раз. Вызов функций в программе В строке 37 вызывается функция displayIntro(). 37. displayIntro() Это не встроенная функция Python, а определенная вами ранее, в строке 4. Когда эта функция вызывается, интерпретатор переходит к первой строке в функции displayIntro() в строке 5. Когда все строки кода в функции выпол- нены, интерпретатор переходит к строке 37 и продолжает движение вниз. В строке 38 также вызывается определенная вами функция. 38. caveNumber = chooseCave() Помните, что функция chooseCave() позволяет игроку выбрать пещеру, в которую он хочет войти. Когда выполняется код return cave в строке 17, ин- терпретатор возвращается к строке 38. Затем вызов функции selectCave() вер- нет целочисленное значение номера пещеры, выбранной игроком. Это воз- вращаемое значение сохраняется в новой переменной с именем caveNumber. Затем интерпретатор переходит к строке 39. 39. checkCave(caveNumber) В строке 39 вызывается функция checkCave() с переданным ей значением переменной caveNumber в качестве аргумента. Интерпретатор не только пере- ходит к строке 20, но и копирует значение переменной caveNumber в параметр Игра «Царство драконов» 91 chosenCave внутри функции checkCave(). Это функция, которая выводит текст: либо '...делится с вами своими сокровищами!', либо '...моментально вас съеда- ет!' , в зависимости от номера пещеры, который ввел игрок. Запрос «сыграть снова» Несмотря на то, победил игрок или проиграл, мы спрашиваем его, хочет ли он сыграть еще раз. 41. print('Попытаете удачу еще раз? (да или нет)') 42. playAgain = input() Переменная playAgain сохраняет ввод игрока. Строка 42 — последняя стро- ка в блоке while, поэтому интерпретатор возвращается к строке 36, чтобы про- верить выполнение условия цикла while: playAgain == 'да' or playAgain == 'д'. Если игрок вводит «да» или «д», интерпретатор начинает цикл сначала со строки 37. Если игрок вводит «нет», «н» или что-то глупое вроде «Здесь был Вася», условие определяется как ложное, выполнение программы продолжается, и интерпретатор переходит к строке после блока while. Но так как после блока while нет никакого кода, программа завершает работу. Одна особенность: строка 'ДА' не идентична строке 'да', так как компью- тер не считает прописные и строчные буквы одинаковыми. Если игрок введет 'ДА' , условие инструкции while будет определено как ложное, и программа все же завершит работу. Позже, во время написания кода программы «Виселица», вы научитесь избегать этой проблемы. (См. раздел «Строковые методы lower() и upper() » в главе 8.) Вы только что завершили свою вторую игру! В игре «Царство драконов» вы использовали многое из того, что уже выучили, когда создавали приложе- ние «Угадай число», и взяли на заметку несколько новых трюков. Если что-то в этой программе осталось для вас непонятным, просмотрите еще раз каж- дую строку исходного кода и попробуйте изменить код, чтобы проанализи- ровать, как в итоге меняется программа. В главе 6 мы на время отложим игры. Вместо этого вы узнаете, как ис- пользовать отладчик. Заключение В игре «Царство драконов», вы создали свои собственные функции. Функ- ция — это мини-программа внутри вашей программы. Код внутри функции запускается при ее вызове. Используя функции, вы можете строить свой код более понятным образом. Аргументы — это значения, копируемые в параметры функции при ее вызове. Вызов функции возвращает значение, которое она вычисляет. Вы также узнали об областях видимости переменных. Переменные, соз- данные внутри функции, находятся в локальной области видимости, а пере- менные, созданные вне какой-либо функции, — в глобальной области ви- димости. Код из глобальной области видимости не может использовать локальные переменные. Если локальные переменные имеют такие же имена, что и глобальные, Python определяет их как разные переменные. Присвоение нового значения локальной переменной не влияет на значение глобальной переменной. Области видимости переменных могут показаться сложным моментом программирования, но они полезны для организации функций как отдель- ных фрагментов кода программы. Поскольку каждая функция имеет свою собственную локальную область видимости, вы можете быть уверены, что код одной функции не приведет к появлению ошибок в других функциях. Так как функции полезны, их содержат почти все программы. Поняв принцип работы функций, вы можете избежать ручного набора огромного количества кода и упростите процесс исправления ошибок. Использование отладчика 93 6 ИСПОЛЬЗОВАНИЕ ОТЛАДЧИКА Если вы введете код с ошибками, ком- пьютер не сможет правильно запустить вашу программу. Компьютерная про- грамма всегда будет выполнять то, что вы ей скажете, хотя это иногда различает- ся с тем, что вы хотите получить в резуль- тате. Ошибки в компьютерных программах называются багами. Баги возникают, если программист невниматель- но подходит к тому, что именно программа должна вы- полнять. В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ: • Три типа багов • Отладчик IDLE • Управление отладкой • Навигация по коду • Точки останова Типы багов Существуют три типа багов , с которыми вы можете столкнуться при на- писании кода: • Ошибки синтаксиса. Этот тип багов возникает из-за опечаток. Ин- терпретатор определяет ошибку синтаксиса, когда ваш код написан не на корректном языке Python. Python не будет выполнять програм- му при наличии хотя бы одной ошибки синтаксиса. 94 Глава 6 • Ошибки выполнения. Это баги, которые возникают во время рабо- ты программы. Программа будет работать, пока не достигнет строки кода с ошибкой, после чего завершит работу и выдаст сообщение об ошибке (эта ситуация называется сбоем программы). В интерпрета- торе Python будет отображаться трассировка — сообщение об ошиб- ке , показывающее строку, в которой возникла проблема. • Семантические ошибки. Эти баги — самые сложные для исправле- ния. Они не приводят к сбою программы, но и не позволяют програм- ме выполнять задуманное. Например, если программист хочет, чтобы переменная total была суммой значений переменных a, b и c, но за- писал total = a * b * c, тогда значение переменной total будет непра- вильным. Это может привести к сбою программы в будущем, но не сразу станет очевидным, где была допущена семантическая ошибка . Поиск багов в программах может быть сложным занятием, если вы во- обще заметите эти ошибки! При запуске программы вы можете обнаружить, что некоторые функции не вызываются, когда должны, либо они могут быть вызваны чрезмерное количество раз. Вы можете неправильно прописать условие для цикла while так, что оно будет выполняться неправильное коли- чество раз. Вы можете написать цикл, из которого нет выхода, — семантиче- ская ошибка, известная как бесконечный цикл . Чтобы остановить программу, застрявшую в бесконечном цикле, вы можете нажать в интерактивной обо- лочке сочетание клавиш Ctrl+C. Для примера создайте бесконечный цикл, введя данный код в окне IDLE (не забудьте дважды нажать клавишу Enter, чтобы интерактивная оболочка определила, что вы закончили ввод в блоке while). >>> while True: print('Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!!') Теперь нажмите и удерживайте сочетание клавиш Ctrl+C, чтобы остано- вить выполнение программы. Интерактивная оболочка будет выглядеть сле- дующим образом: Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!! Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!! Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!! Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!! Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!! Traceback (most recent call last): Использование отладчика 95 File " ", line 2, in print('Нажмите Ctrl+C, чтобы остановить бесконечный цикл!!!') File "C:\Program Files\Python 3.6\lib\idlelib\PyShell.py", line 1347, in write return self.shell.write(s, self.tags) KeyboardInterrupt В нашем случае цикл while всегда истинен, поэтому программа будет про- должать выводить одну и ту же строку целую вечность, пока пользователь не прекратит выполнение. В данном примере мы нажали сочетание клавиш Ctrl+C, чтобы остановить бесконечный цикл после того, как цикл while вы- полнился 5 раз. Отладка Бывает трудно понять источник ошибки, так как строки кода выполняют- ся быстро, а значения переменных изменяются часто. Отладчик — это про- грамма, которая позволяет вам выполнять код по одной строке за раз в том же порядке, что и Python выполняет каждую инструкцию. Отладчик также показывает вам, какие значения хранятся в переменных на каждом шаге. Запуск отладчика Откройте файл игры «Царство драконов», которую вы сделали в главе 5, в IDLE. Выберите команду меню Run ⇒ Python Shell (Запустить ⇒ Оболочка Python), чтобы открыть окно интерактивной оболочки Python. В открывшем- ся окне выберите команду меню Debug ⇒ Debugger (Отладка ⇒ Отладчик), чтобы отобразить окно управления отладкой, показанное на рис. 6.1. Устано- вите в нем флажки Stack (Стек), Locals (Локальные), Source (Код) и Globals (Глобальные). Теперь, когда отладчик запущен, запустите игру «Царство драконов», на- жав в интерактивной оболочке клавишу F5. Окно Debug Control (Управле- ние отладкой) будет выглядеть примерно так, как показано на рис. 6.2. Вы произвели так называемый запуск программы под отладчиком. Когда вы запускаете программу Python под отладчиком, программа приостанавли- вает выполнение перед первой командой. Если вы перейдете к окну файла в IDLE, то увидите, что первая команда выделена серым цветом (при усло- вии, что в диалоговом окне Debug Control (Управление отладкой) установлен флажок Source (Код)). В диалоговом окне Debug Control (Управление отлад- кой) будет указано, что выполняется код в строке 1, в которой импортируется модуль random (рис. 6.2). 96 Глава 6 Рис. 6.1. Окно Debug Control Рис. 6.2. Запуск игры «Царство драконов» под отладчиком Использование отладчика 97 Пошаговое выполнение программы с помощью отладчика Отладчик позволяет выполнять инструкции по очереди — этот процесс называется пошаговым выполнением. Выполните одну команду, нажав кноп- ку Step (Шаг) в окне Debug Control (Управление отладкой). Интерпретатор Python выполнит инструкцию import random, а затем остановится, прежде чем начнет выполнять следующую. Окно Debug Control (Управление отладкой) отобразит, как будет выглядеть выполненная строка при нажатии кнопки Step (Шаг). На данном этапе интерпретатор должен находиться на стро- ке 2 — import time. Нажмите кнопку Quit (Выход), чтобы завершить про- грамму. Это краткое описание того, что происходит, когда вы нажимаете кнопку Step (Шаг) при запуске игры «Царство драконов» под отладчиком. Нажмите клавишу F5, чтобы снова запустить игру «Царство драконов», а затем следуй- те этим инструкциям: 1. Дважды нажмите кнопку Step (Шаг), чтобы выполнить две инструк- ции импорта. 2. Нажмите кнопку Step (Шаг) еще три раза, чтобы выполнить три ин- струкции def. 3. Нажмите кнопку Step (Шаг) еще раз, чтобы определить переменную playAgain 4. Нажмите кнопку Go (Вперед), чтобы запустить оставшуюся часть программы, или кнопку Quit (Выход), чтобы завершить работу. Отладчик пропустил строку 3, потому что она пуста. Обратите внимание, что с отладчиком вы можете только делать шаг вперед; вы не можете возвра- щаться по коду назад. Область глобальных переменных Область Globals (Глобальные) в диалоговом окне Debug Control (Управ- ление отладкой) — это место, в котором отражены все глобальные перемен- ные . Помните, глобальными называются переменные, созданные вне каких- либо функций (то есть в глобальной области видимости). Текст, рядом с именами функций в области Globals (Глобальные) выгля- дит так: . Для отладки программы вам необязательно знать, что все это означает. Просто увидев, находятся ли функции и модули в области Globals (Глобальные), вы поймете, определена ли так или иная функция или импортирован ли модуль. Также вы можете не обращать внимание настройки типа __builtins__, __ doc__ , __name__ и прочие в области Globals (Глобальные). (Это переменные, которые используются в каждой программе Python.) 98 Глава 6 В программе «Царство драконов» в окне Debug Control (Управление от- ладкой) в области Globals (Глобальные) появятся три инструкции def, ко- торые выполняют и определяют функции. Когда будет создана переменная playAgain , она также отобразится в области Globals (Глобальные). Рядом с именем переменной будет указана строка 'да'. Окно Debug Control (Управ- ление отладкой) позволяет видеть значения всех переменных в программе по мере запуска программы. Это помогает при исправлении багов. Область локальных переменных Вдобавок к области Globals (Глобальные) есть область Locals (Локаль- ные) , которая отображает локальные переменные и их значения. Переменные будут видны в области Locals (Локальные) только в том случае, если интер- претатор находится внутри той или иной функции. Когда интерпретатор на- ходится в глобальной области видимости, область Locals (Локальные) пуста. Обычное выполнение и завершение работы Если вы устали от постоянного нажимания кнопки Step (Шаг) и хотите, чтобы программа была запущена в обычном режиме, нажмите кнопку Go (Вперед) в верхней части окна Debug Control (Управление отладкой). Про- грамма будет выполнена в обычном режиме вместо пошагового выпол нения. Чтобы полностью завершить работу программы, нажмите кнопку Quit (Выход) в верхней части окна Debug Control (Управление отладкой). Про- грамма тут же завершит работу. Это удобно, если вам необходимо начать от- ладку заново с самого начала. Навигация по коду Запустите программу «Царство драконов» под отладчиком. Продолжай- те пошаговое выполнение, пока не достигнете строки 37. Как показано на рис. 6.3, это строка с функцией displayIntro(). Когда вы снова нажмете кноп- ку Step (Шаг), отладчик начнет выполнение функции и окажется в строке 5 — первой строке функции displayIntro(). Этот так называемый шаг с входом. Когда выполнение приостановилось в строке 5, вам может понадобиться пре- кратить пошаговую отладку. Если вы нажмете кнопку Step (Шаг) еще раз, отлад- чик войдет в функцию print(). Она относится к встроенным функциям Python, поэтому нецелесообразно пропускать ее через отладчик. Функции Python, такие как print(), input(), str() и randint(), уже тщательно проверены на отсутствие багов. Можно предположить, что эти фрагменты кода не содержат багов. Вы же не хотите терять время, проверяя каждую функцию print()? Поэто- му вместо нажатия кнопки Step (Шаг), которая приведет вас к проверке кода функции print(), нажмите кнопку Over (Шаг с обходом). Она позволит обой- ти код внутри функции print(). Код внутри функции print() будет выполнен Использование отладчика 99 в обычном режиме, а затем отладчик приостановит работу, когда выполнение функции print() будет завершено. Рис. 6.3. Пошаговая проверка кода программы, строка 37 Обход — удобный способ пропустить код внутри функции. Отладчик те- перь будет приостановлен на строке 38 — caveNumber = chooseCave(). Нажмите кнопку Step (Шаг)снова, чтобы перейти к коду внутри функции chooseCave() . Продолжайте пошаговую проверку кода, пока не достигнете стро- ки 15, отвечающей за вызов функции input(). Программа будет ждать, пока вы введете ответ в интерактивной оболочке, точно так же, как при обычном вы- полнении программы. Если вы сейчас попытаетесь нажать кнопку Step (Шаг), то ничего не произойдет, потому что программа ждет ответа с клавиатуры. Вернитесь обратно к IDLE и введите номер пещеры. Прежде чем вы смо- жете ввести число, в нижней части интерактивной оболочки должен поя- виться мигающий курсор. Иначе текст, который вы введете, не появится. 100 Глава 6 Как только вы нажмете клавишу Enter, отладчик продолжит пошаговую проверку кода. Теперь нажмите кнопку Out (Шаг с выходом) в окне Debug Control (Управление отладкой). Это так называемый шаг с выходом, так как эта кноп- ка инструктирует отладчик «перешагнуть» столько строк, сколько потребу- ется, пока интерпретатор не вернется из функции, в которой находится на данный момент. После выхода из функции интерпретатор перейдет к первой строке, расположенной после текущей функции. Если интерпретатор находится вне функции, то нажатие кнопки |