Главная страница

Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python


Скачать 6.56 Mb.
НазваниеInvent your owncomputer gameswith python
Дата10.12.2022
Размер6.56 Mb.
Формат файлаpdf
Имя файлаУчим Python, делая крутые игры 2018.pdf
ТипДокументы
#837554
страница11 из 39
1   ...   7   8   9   10   11   12   13   14   ...   39
Out (Шаг с выходом) приведет к тому, что отладчик выполнит все остальные строки в программе. Это действие аналогично нажатию кнопки Go (Вперед). Ниже представлено краткое описание каждой кнопки:
• Go (Вперед)выполняет оставшуюся часть кода в обычном режиме до конца, или пока не достигнет точки останова (см. раздел «Установка точек останова» далее в этой главе).
• Step
(Шаг)выполняет одну инструкцию или один шаг. Если строка содержит вызов функции, отладчик перейдет внутрь функции.
• Over
(Шаг с обходом)выполняет одну инструкцию или один шаг.
Если код в строке содержит вызов функции, отладчик не перейдет
в нее, но пропустит этот вызов.
• Out
(Шаг с выходом)продолжает переходить по строкам кода, пока отладчик не покинет текущую функцию. Это выход из функции.
• Quit
(Выход)немедленно завершает программу.
Теперь, когда вы умеете использовать отладчик, давайте попробуем найти баги в коде программы.
Поиск багов
Отладчик может помочь вам найти источник ошибки в вашей программе.
Ниже, в качестве примера, представлен код программы с ошибкой. Програм- ма по сложению случайных чисел содержит баг, который следует найти.
В редакторе файлов создайте новый файл, выбрав команду меню
File
New File (Файл ⇒ Новый файл). Введите следующий код в открыв- шееся окно и сохраните файл под именем buggy.py.
buggy.py
1. import random
2. number1 = random.randint(1, 10)
3. number2 = random.randint(1, 10)
4. print('Сколько будет: ' + str(number1) + ' + ' + str(number2) + '?')

Использование отладчика
101
5. answer = input()
6. if answer == number1 + number2:
7. print('Верно!')
8. else:
9. print('Нет! Правильный ответ - ' + str(number1 + number2))
Введите код программы именно так, как показано выше, даже если вы уже увидели ошибку. Далее нажмите клавишу F5 и запустите программу. Вот как она могла бы выглядеть при запуске:
Сколько будет: 9 + 9?
18
Нет! Правильный ответ - 18
Вот и баг! Сбоя в программе нет, но она и не работает должным образом.
Программа сообщает пользователю, что он ввел неправильное число, даже если он дал правильный ответ.
Запуск программы под отладчиком позволит найти причину ошибки.
В верхней части окна интерактивной оболочки нажмите Debug
Debugger
(Отладка
⇒ Отладчик)для вывода на экран диалогового окна Debug Control
(Управление отладкой). (Убедитесь что в окне установлены флажки Stack
(Стек), Locals (Локальные), Source (Код) и Globals (Глобальные).) Далее на- жмите клавишу F5 в редакторе файлов для запуска программы. Теперь про- грамма запустится под отладчиком.
Отладчик начнет со строки import random.
1. import random
Здесь нет ничего особенного, поэтому просто нажмите кнопку Step (Шаг),
чтобы выполнить указанную команду. Вы увидите, что модуль random добав- лен в область Globals (Глобальные). Снова нажмите кнопку Step (Шаг),чтобы выполнить инструкцию в строке 2.
2. number1 = random.randint(1, 10)
Появится новое окно редактора файлов с файлом random.py. Вы пере- шли к коду внутри функции randint() модуля random. Вы ведь помните, что

102
Глава 6
встроенные функции Python не станут причиной ошибки, поэтому нажмите кнопку Out (Шаг с выходом), чтобы выйти из функции randint() и вернутся к нашей программе. Затем закройте окно random.py. В следующий раз вы мо- жете нажать кнопку Over (Шаг с обходом), чтобы обойти функцию randint() вместо того, чтобы заходить в нее.
Код в строке 3 также содержит вызов функции randint().
3. number2 = random.randint(1, 10)
Обойдите ее, нажав кнопку Over (Шаг с обходом).
Код в строке 4 содержит вызов функции print() для отображения игроку случайных чисел.
4. print('Сколько будет: ' + str(number1) + ' + ' + str(number2) + '?')
Вы знаете, какие числа программа выведет, еще до того, как она их напе- чатает! Взгляните на область Globals (Глобальные) в диалоговом окне Debug
Control (Управление отладкой). Вы увидите переменные number1 и number2, а рядом с ними целочисленные значения, которые они содержат.
Переменная number1 содержит значение 2, а переменная number2 — значе- ние 5. (Ваши случайные числа, скорее всего, будут отличаться.) Когда вы на- жмете кнопку Step (Шаг), функция str() конкатенирует строковые версии этих целых чисел, и программа отобразит строку в вызове print() с этими значениями. Окно Debug Control (Управление отладкой) при этом выглядит так, как показано на рис. 6.4.
Нажмите клавишу Step (Шаг)в строке 5, чтобы выполнить функцию input()
5. answer = input()
Отладчик ожидает, пока игрок введет ответ в программу. Введите кор- ректный ответ (в моем случае 7) в окне IDLE.
Отладчик сохранит ответ и перейдет далее к строке 6.
6. if answer == number1 + number2:
7. print('Верно!')

Использование отладчика
103
Рис. 6.4.
Переменнойnumber1 присвоено значение 2, а number2 — значение 5
Код в строке 6 — это инструкция if. Условие заключается в том, что зна- чение в ответе должно совпадать с суммой чисел number1 и number2. Если усло- вие истинно, отладчик перейдет к строке 7.
Если ложно — к строке 9. Нажмите клавишу Step (Шаг)еще раз, чтобы выяснить, куда он перейдет.
8. else:
9. print('Нет! Правильный ответ - ' + str(number1 + number2))
Отладчик в строке 9! Что происходит? Должно быть, условие в инструкции if ложно. Взгляните на значения переменных number1 и number2 и на ответ. Об- ратите внимание, что значения переменных number1 и number2 — целые числа, поэтому их сумма также должна быть целым числом. Но ответ — это строка.
Это означает, что выражение answer == number1 + number2 будет вычислять- ся по формуле '7' == 7.

104
Глава 6
Строковое значение и значение целого числа никогда не будут равны друг другу, поэтому условие ложно.
Это и есть ошибка в коде: в нем используется значение answer, в то время когда следует использовать int(answer). Измените строку 6 на if int(answer)
== number1 + number2
и запустите программу снова.
Сколько будет: 2 + 5?
7
Верно!
Теперь программа работает правильно. Запустите ее еще раз и намеренно введите неправильный ответ.
Вы отладили программу! Помните, компьютер будет выполнять ваши программы в точности так, как вы их напишете, даже если вы написали со- всем не то, что намеревались.
Установка точек останова
Пошаговая отладка кода, строка за строкой, может занять слишком много времени. Часто вам бы хотелось, чтобы программа выполнялась в обычном режиме, пока не достигнет определенной строки. Вы можете установить точ-
ку останова на строке, с которой хотите начать отладку. Если вы предполага- ете, что проблема в вашем коде, скажем, в строке 17, просто установите точку останова на этой строке (либо на пару строк выше).
Когда интерпретатор достигнет этой строки, программа перейдет в от- ладчик. Тогда вы сможете выполнять код построчно, чтобы найти ошибку.
Нажатие кнопки Go (Вперед) запустит выполнение программы в обычном режиме, пока не будет достигнута следующая точка останова или конец про- граммы.
Чтобы установить точку останова в операционной системе Windows, щелкните правой кнопкой мыши по строке в редакторе файлов и выбери- те в появившемся меню команду Set Breakpoint (Установить точку остано- ва). В операционной системе macOS щелкните по строке мышью, удерживая клавишу Ctrl, чтобы перейти в меню, и выберите команду Set Breakpoint
(Установить точку останова). Вы можете установить столько точек остано- ва, сколько захотите. Редактор файлов окрасит строки с точками останова в желтый цвет.
На рис. 6.5 приведен пример кода с установленными точками останова.
Чтобы удалить точку останова, щелкните мышью по строке и выберите пункт Clear Breakpoint (Очистить точку останова) в появившемся меню.

Использование отладчика
105
Рис. 6.5.
Код с двумя точками останова
Использование точек останова
Далее мы рассмотрим на программу, которая вызывает функцию random.
randint(0, 1)
, имитирующую подкидывание монетки. Если функция вернет целое число 1 — это будет «орел», а если 0 — «решка». Переменная flips будет подсчитывать, сколько раз «подбрасывалась монетка». Переменная heads бу- дет подсчитывать, сколько раз «выпал» «орел».
Программа «подбросит монетку» 1000 раз. Человеку для этого понадо- бится более часа, но компьютер сможет сделать это за секунду! В этой про- грамме нет ошибок, но отладчик позволит нам взглянуть на то, как эта программа работает. Введите указанный ниже код в редактор файлов и со- храните в файл под именем coinFlips.py. Если у вас возникают ошибки после ввода этого кода, сравните код, который вы ввели, с исходным кодом на сайте
inventwithpython.com/diff/.
coinFlips.py
1. import random
2. print('Я подброшу монетку 1000 раз. Угадай, сколько раз выпадет "Орел"? (Нажми клавишу Enter, чтобы начать)')
3. input()
4. flips = 0 5. heads = 0 6. while flips < 1000:
7. if random.randint(0, 1) == 1:
8. heads = heads + 1

106
Глава 6 9. flips = flips + 1 10.
11. if flips == 900:
12. print('900 подкидываний и "Орел" выпал ' + str(heads) + ' раз.')
13. if flips == 100:
14. print('При 100 бросках, "Орел" выпал ' + str(heads) + ' раз.')
15. if flips == 500:
16. print('Полпути пройдено и "Орел" выпал ' + str(heads) + ' раз.')
17.
18. print()
19. print('Из 1000 подбрасываний монетки "Орел" выпал ' + str(heads) + ' раз!')
20. print('Насколько вы близки к правильному ответу?')
Программа работает довольно быстро. Больше времени занимает ожида- ние, пока пользователь нажмет клавишу Enter, чем виртуальное подбрасыва- ние монетки. Давайте предположим, что вы бы хотели увидеть как програм- ма «подбрасывает монетку» раз за разом. В окне интерактивной оболочки выберите команду меню Debug
Debugger (Отладка ⇒ Отладчик), чтобы открыть диалоговое окно Debug Control (Управление отладкой). Затем на- жмите клавишу F5, чтобы запустить программу.
Программа в отладчике начнется со строки 1. Нажмите кнопку Step (Шаг)
в окне Debug Control (Управление отладкой) три раза для выполнения пер- вых трех строк кода (это строки 1, 2 и 3). Вы заметите, что кнопки становят- ся неактивными, потому что вызывается функция input(), и интерактивная оболочка ждет, когда пользователь что-то введет. Щелкните мышью по окну
IDLE и нажмите клавишу Enter. (Убедитесь, что нажали клавишу в окне IDLE; в противном случае нажатие может быть не распознано.)
Вы можете нажать кнопку Step (Шаг) еще несколько раз, но вскоре пой- мете, что для обхода всей программы вам понадобится достаточно много времени. Вместо этого установите точки останова на строках 12, 14 и 16, что- бы отладчик остановился, когда значение переменной flips (число «подки- дываний») будет равняться 900, 100 и 500, соответственно. Эти строки будут выделены, как показано на рис. 6.6.
После установки точек останова нажмите кнопку Go (Вперед)в диало- говом окне Debug Control (Управление отладкой). Программа будет выпол- няться в обычном режиме, пока не достигнет следующей точки останова.
Когда значение переменной flip станет равно 100, условие для инструкции if в строке 13 станет истинным. Это приведет к тому, что начнет выполняться код в строке 14 (где установлена точка останова), а значит, отладчик остано- вит программу и возьмет выполнение программы на себя. Взгляните на об-

Использование отладчика
107
ласть Globals (Глобальные) в окне отладчика, чтобы увидеть значения пере- менных flips («подкидывания») и heads («орел»).
Рис. 6.6.
Установлены три точки останова в коде файла coinfl ips.py
Нажмите кнопку Go (Вперед)еще раз и программа продолжит выпол- няться, пока интерпретатор не достигнет следующей точки останова в строке
16. Снова взгляните, как изменились значения переменных flips и heads.
Нажмите кнопку Go (Вперед)вновь, чтобы продолжить выполнение до следующей точки останова в строке 12.
Заключение
Написание программы — это только половина работы. Затем необходимо удостовериться, что ваша программа работает должным образом. Отладчик помогает выполнить код пошагово, строка за строкой. Вы можете проверить, какие строки выполняются в каком порядке, и какие значения содержат пере- менные.
Если пошаговая проверка программы занимает слишком много времени, вы можете установить точки останова, чтобы отладчик останавливался толь- ко на нужных строках кода.
Использование отладчика — прекрасный способ понять, что делает про- грамма. Так как эта книга содержит объяснения кода всех приведенных игр, отладчик поможет получить дополнительные сведения о ваших собственных программах.

108
Глава 7
7
ПРОЕКТИРОВАНИЕ ИГРЫ «ВИСЕЛИЦА»
С ПОМОЩЬЮ БЛОК-СХЕМ
В этой главе вы спроектируете игру
«Виселица»
. Эта игра существенно сложнее, чем предыдущие игры, но и более интересная. Из-за сложности игры мы сначала тщательно ее сплани- руем, построив в этой главе блок-схему.
К написанию кода игры «Виселица» мы приступим в 8 главе .
В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ:
• ASCII-графика
• Проектирование игры с помощью блок-схем
Правила игры «Виселица»
Виселица — это игра для двоих, в которой один игрок загадывает слово и рисует на странице отдельные пустые клетки для каждой буквы. А второй игрок пытается угадать буквы, которые могут быть в данном слове, а затем и все слово целиком.
Если второй игрок правильно угадывает букву, первый игрок вписывает ее в соответствующую пустую клетку. А если ошибается, первый игрок рису- ет одну из частей тела повешенного человечка. Чтобы победить, второй игрок должен угадать все буквы в слове до того, как повешенный человечек будет полностью нарисован.

Проектирование игры «Виселица» с помощью блок-схем
109
Пример запуска игры «Виселица»
Ниже представлен пример, что будет видеть пользователь, играя в напи- санную вами в главе 8 игру «Виселица». Текст, который вводит игрок, выде- лен полужирным шрифтом.
В И С Е Л И Ц А
+---+
|
|
|
===
Ошибочные буквы:
_ _ _ _
Введите букву.
а
+---+
|
|
|
===
Ошибочные буквы:
_ _ _ а
Введите букву.
и
+---+
O |
|
|
===
Ошибочные буквы: и
_ _ _ а
Введите букву.
о
+---+

110
Глава 7
O |
| |
|
===
Ошибочные буквы: и о
_ _ _ а
Введите букву.
у
+---+
O |
| |
|
===
Ошибочные буквы: и о у _ _ а
Введите букву.
т
+---+
O |
| |
|
===
Ошибочные буквы: и о у т _ а
Введите букву.
к
ДА! Секретное слово - "утка"! Вы угадали!
Хотите сыграть еще? (да или нет)
нет
ASCII-графика
Графика для игры «Виселица» — это символы клавиатуры, напечатанные на экране. Такой вид графики называется ASCII-графика (произносится как аски). Она была предшественником популярных сейчас «Эмодзи». Ниже по- казан кот, нарисованный при помощи ASCII-графики:

Проектирование игры «Виселица» с помощью блок-схем
111
________________________
__/xxx xx xxx xx\
/xxxxxxx xx xx xx \_
/ xx xx\
/ /\ x \
| /\ / \___ \_
| / \____/ \_ Z \
| / \ z \
/ ___/ | z |
__| \___ | xxx|
/ | ___ ___----- _ x|
/ | | | ______ ___/ |
| \ ------ \_/ /________/ xx /
\ \_ ---- __/ /
\ \____________/ /
\_____________________________________/
ASCII-графика для игры «Виселица» будет выглядеть так:
+---+ +---+ +---+ +---+ +---+ +---+ +---+
| O | O | O | O | O | O |
| | | | /| | /|\ | /|\ | /|\ |
| | | | | / | / \ |
=== === === === === === ===
Проектирование игры с помощью блок-схем
Эта игра немного сложнее, чем те, которые вы видели до сих пор, поэто- му давайте подумаем об этапах ее программирования. Для начала вы создаете блок-схему (типа той, что мы рисовали для игры «Царство драконов» на рис. 5.1 в главе 5), чтобы наглядно представить то, что будет делать про грамма.
Как упоминалось в главе 5, блок-схема представляет собой диаграмму, отражающую серию шагов в виде полей (блоков), связанных друг с другом стрелками. Каждое поле — это шаг, а стрелки показывают возможные сле- дующие шаги. Поместите палец на поле «Старт» блок-схемы и проследите за ходом программы, передвигаясь по стрелкам на другие поля, пока не дойдете до поля «Конец». Вы можете двигаться от поля к полю только по стрелкам.
Вы не можете двигаться назад до тех пор, пока стрелка вас туда не перенесет,

112
Глава 7
как в случае с полем «Игрок уже называл эту букву». На рис. 7.1 показана полная блок-схема игры «Виселица».
START
Show drawing and blanks to player
Ask player to guess a letter
END
Come up with a secret word
Player already guessed this letter
Letter is in secret word
Letter is not in secret word
Ask player to play again
Player guessed all letters and wins
Player ran out of guesses and loses
Конец
Задумываем секретное слово
Показываем игроку виселицу и пропуски
Просим игрока угадать букву
Спрашиваем игрока, хочет ли он сыграть снова
Буква присутству- ет в загаданном слове
Игрок угадывает все буквы и побеждает
Буквы нет в загаданном слове
Игрок не угадывает и проигрывает
Игрок уже называл эту букву
Старт
Рис. 7.1.
Полная блок-схема игры «Виселица»
Конечно же, вы не обязаны составлять блок-схему; вы можете сразу на- чать писать код. Но часто бывает так, что, как только вы начинаете писать программу, вам на ум приходят вещи, которые вы хотите добавить или из- менить. Все может закончиться тем, что вам придется удалить значительный фрагмент вашего кода, что будет означать трату времени. Самый лучший способ этого избежать — спланировать, как должна работать программа до того, как начинать писать ее код.
1   ...   7   8   9   10   11   12   13   14   ...   39


написать администратору сайта