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

Учим 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
страница39 из 39
1   ...   31   32   33   34   35   36   37   38   39
404
Глава 21
Реализация чит-кодов
Если активирован чит-код обратного направления, тогда злодей должен переместиться вверх на 5 пикселей.
154. elif reverseCheat:
155. b['rect'].move_ip(0, -5)
Передача −5 в качестве второго аргумента методу move_ip() приведет к пе- ремещению объекта Rect вверх на 5 пикселей.
Если был активирован чит-код замедления, тогда злодей все равно будет двигаться вниз, но со скоростью 1 пиксель за итерацию игрового цикла.
156. elif slowCheat:
157. b['rect'].move_ip(0, 1)
Значение нормальной скорости спрайта злодея (хранящейся в ключе 'speed'
структуры данных злодея) игнорируется при активации чит-кода за- медления.
Удаление спрайтов злодеев
Все спрайты злодеев, которые выпали за пределы нижней границы окна, должны быть удалены из списка baddies. Помните, что нельзя добавлять или удалять элементы списка во время перебора этого списка. Вместо перебора списка baddies с помощью цикла for, перебирайте копию списка baddies. Что- бы сделать эту копию, используйте пустой оператор среза [:].
159. # Удаление злодеев, упавших за нижнюю границу экрана.
160. for b in baddies[:]:
Цикл for в строке 160 использует переменную b для текущего элемента при переборе baddies[:]. Если злодей находится ниже нижней границы окна, его необходимо удалить, что мы и делаем в строке 162.
161. if b['rect'].top > WINDOWHEIGHT:
162. baddies.remove(b)

Игра «Ловкач» с графикой и звуком
405
Словарь b — это текущая структура данных злодея из списка baddies[:].
Каждая структура данных злодея в списке представляет собой словарь с клю- чом 'rect', в котором хранится объект Rect. Таким образом, b['rect'] явля- ется объектом Rect для спрайта злодея. Наконец, атрибутом top выступает координата y верхней стороны прямоугольной области. Помните, что коор- динаты у увеличиваются по направлению вниз. Итак, выражение b['rect'].
top > WINDOWHEIGHT
проверит, находится ли верхняя сторона злодея ниже ниж- ней границы окна. Если это условие истинно, тогда код в строке 162 удаляет структуру данных злодея из списка baddies.
Отображение окна
После того, как все структуры данных были обновлены, с помощью функ- ций модуля pygame нужно отобразить игровой мир. Благодаря тому, что игро- вой цикл выполняется несколько раз в секунду, возникает эффект плавного перемещения спрайтов игрока и злодеев.
До того, как будет отображено что-либо еще, код в строке 165 заливает цветом все окно, стирая все, что в нем было отображено ранее.
164. # Отображение в окне игрового мира.
165. windowSurface.fill(BACKGROUNDCOLOR)
Помните, что объект Surface в windowSurface — особый, потому что он воз- вращается pygame.display.set_mode(). Поэтому все, что отображено на этом объекте Surface, появится на экране после вызова pygame.display.update().
Отображение очков игрока
Код в строках 168 и 169 выводит текст о текущем счете и лучшем резуль- тате в верхнем левом углу окна.
167. # Отображение количества очков и лучшего результата.
168. drawText('Счет: %s' % (score), font, windowSurface, 10, 0)
169. drawText('Рекорд: %s' % (topScore), font, windowSurface, 10, 40)
В выражении 'Счет:% s'% (score) используется интерполяция строк для вставки значения переменной score в строку. Эта строка, объект Font, хра- нящийся в переменной font, объект Surface для отображения на нем текста, а также координаты x и y позиции, куда должен быть помещен текст, переда-

406
Глава 21
ются методу drawText(), который будет обрабатывать вызов методов render() и blit() .
Сделайте то же самое для отображения рекорда. Передайте значение 40 в качестве координаты y вместо 0, чтобы значение рекорда отображалось под строкой текущего количества очков.
Отображение спрайтов игрока и злодеев
Информация об игроке хранится в двух различных переменных. playerImage
— это объект Surface, который содержит все цветные пиксели, из которых состоит изображение спрайта игрока. playerRect — это объект Rect, который хранит размер и местоположение спрайта игрока.
Метод blit() отображает спрайт игрока (находится в playerImage) на windowSurface в позиции playerRect.
171. # Отображение прямоугольника игрока.
172. windowSurface.blit(playerImage, playerRect)
Цикл for в строке 175 отображает спрайт каждого злодея на объекте windowSurface
174. # Отображение каждого злодея.
175. for b in baddies:
176. windowSurface.blit(b['surface'], b['rect'])
Каждый элемент в списке baddies — это словарь. Ключи словарей 'surface' и 'rect' содержат объект Surface с изображением злодея и объект Rect с ин- формацией о его расположении и размере, соответственно.
Теперь, когда на windowSurface все отображено, нам нужно обновить окно, чтобы игрок мог видеть его содержимое.
178. pygame.display.update()
Отобразим на экране этот объект Surface, вызвав метод update().
Проверка на столкновения
Код в строке 181 проверяет, столкнулся ли спрайт игрока со спрайтом какого-либо злодея, путем вызова функции playerHasHitBaddie(). Эта функ-

Игра «Ловкач» с графикой и звуком
407
ция вернет значение True, если персонаж игрока столкнулся с любым из зло- деев из списка baddies. В противном случае функция возвращает значение
False
180. # Проверка, попал ли в игрока какой-либо из злодеев.
181. if playerHasHitBaddie(playerRect, baddies):
182. if score > topScore:
183. topScore = score # установка нового рекорда
184. break
Если спрайт игрока столкнулся со спрайтом злодея, и если текущее коли- чество очков больше, чем предыдущий рекорд, тогда код в строках 182 и 183 обновляет его. Интерпретатор выходит из игрового цикла в строке 184 и пе- реходит к строке 189, завершая игру.
Во избежание выполнения компьютером игрового цикла настолько бы- стро, насколько он может (это было бы слишком быстро для игрока, и он бы сразу же проиграл), мы вызываем метод mainClock.tick(), приостанавливая игру на очень короткое время:
186. mainClock.tick(FPS)
Эта пауза будет достаточно длинной, чтобы обеспечить около 40 (зна- чение, хранящееся в переменной FPS) итераций игрового цикла каждую се- кунду.
Экран окончания игры
Когда игрок проигрывает, воспроизведение фоновой музыки прекра- щается и исполняется звуковой эффект, свидетельствующий об окончании игры.
188. # Отображение игры и вывод надписи 'Игра окончена'.
189. pygame.mixer.music.stop()
190. gameOverSound.play()
Код в строке 189 вызывает функцию stop() в модуле pygame.mixer.music для остановки фоновой музыки. Код в строке 190 вызывает метод play() в объек- те Sound, хранящемся в gameOverSound.

408
Глава 21
Затем код в строках 192 и 193 вызывает функцию drawText(), чтобы вы- вести текст «ИГРА ОКОНЧЕНА!» на объект windowSurface.
192. drawText('ИГРА ОКОНЧЕНА!', font, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
193. drawText('Нажмите клавишу для начала новой игры', font, windowSurface, (WINDOWWIDTH / 3) - 120, (WINDOWHEIGHT / 3) + 50)
194. pygame.display.update()
195. waitForPlayerToPressKey()
Код в строке 194 вызывает метод update(), чтобы вывести этот объект
Surface на экран. После отображения текста игра останавливается, пока игрок не нажмет клавишу, вызвав функцию waitForPlayerToPressKey().
После того как игрок нажимает клавишу, интерпретатор выходит из вы- зова waitForPlayerToPressKey() в строке 195. В зависимости от того, сколько времени у игрока уходит на то, чтобы нажать клавишу, звуковой эффект либо продолжает проигрываться, либо нет. Чтобы остановить этот звуко- вой эффект перед началом новой игры, код в строке 197 вызывает функцию gameOverSound.stop()
197. gameOverSound.stop()
Вот наша графическая игра и закончена!
Изменение игры «Ловкач»
Вы можете найти игру слишком простой или слишком сложной. К сча- стью, ее легко изменить, ведь мы потратили время на использование кон- стант вместо того, чтобы вводить значения напрямую. Теперь все, что нам нужно сделать для модификации игры — это изменить значения кон- стант.
Например, если вы хотите, чтобы программа в целом выполнялась мед- леннее, присвойте переменной FPS в строке 8 меньшее значение, например,
20
. Это приведет к тому, что спрайты злодеев и игрока будут перемещаться медленнее, поскольку игровой цикл будет выполняться лишь 20 раз в секунду вместо 40.
Если хотите замедлить только спрайты злодеев, уменьшите значение пере- менной BADDIEMAXSPEED, например до 4. Это заставит спрайты всех злодеев пере- мещаться на количество пикселей в диапазоне от 1 (значение BADDIEMINSPEED) до 4, а не 1–8, за одну итерацию игрового цикла.

Если хотите вместо большого количества маленьких злодеев получить не- сколько злодеев побольше, увеличьте значение переменной ADDNEWBADDIERATE до 12, BADDIEMINSIZE до 40, а значение переменной BADDIEMAXSIZE до 80. Теперь спрайты злодеев добавляются каждые 12 итераций игрового цикла вместо 6 итераций, так что их будет вдвое меньше, чем раньше. Но, чтобы игра оста- валась интересной, размер злодеев значительно увеличится.
Не меняя базовую часть игры, можно изменить любую из констант и ра- дикально повлиять на работу игры. Продолжайте экспериментировать с но- выми значениями констант, пока результат не удовлетворит вас.
Заключение
В отличие от ранних текстовых игр, «Ловкач» действительно похож на со- временную компьютерную игру. Он содержит графику и музыку, а также под- держивает управление мышью. Хотя модуль pygame предоставляет функции и типы данных в качестве строительных блоков, именно вы, программист, создаете из них интересные игры.
Вы можете сделать все это, потому что знаете, как поручить задачу ком- пьютеру — шаг за шагом, строка за строкой. Выражаясь на языке компью- тера, вы можете заставить его произвести сложные математические расче- ты и вывести результат для вас. Это полезное умение, и я надеюсь, что вы продолжите больше узнавать о программировании на Python. (А ведь узнать предстоит еще так много!)
Желаю вам успехов в создании собственных игр!

410
Предметный указатель
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
A
append(), метод, 128
B
blit(), метод, 336, 406
BMP, формат файла, 370
bool(), функция, 283
break, инструкция, 62, 64, 146
button, атрибут для события
MOUSEBUTTONDOWN, 360
C
centerx, атрибут для объекта Rect, 330
centery, атрибут для объекта Rect, 330
choice(), функция из модуля random, 152
circle(), функция модуля pygame.draw,
333
Clock, объект, 382
Clock(), функция, 357
colliderect(), функция, 366, 392
continue, инструкция, 206
D
def, инструкция, 76, 77, 154
E
elif, инструкции, 138
ellipse(), функция модуля pygame.draw,
334
else, инструкция, 89
end='', инструкция, 131
end, параметр для функции print(), 70
Event, объект, 337
exit(), функция модуля sys, 227
F
False (Ложь), логическое значение, 57
fi ll(), функция, 331
fi nd(), метод, 256
fl oat(), функция, 57
Font, объект, 382, 394
for, инструкция, 51, 53, 54
G
get_rect(), метод, 330
GIF, формат файла, 370
I
IDLE
интерактивная оболочка, 24
редактор файлов, 37
if, инструкция, 61, 64
import, инструкция, 48
input(), функция, 41
int(), функция, 55, 180
in, оператор, 127
J
join(), метод, 202
K
KEYDOWN, событие, 359
keys(), метод, 151
L
len(), функция, 86, 149
line(), функция модуля pygame.draw, 333
list(), функция, 131
load(), функция, 376
lower(), метод, 91, 136

Предметный указатель
411
M
math, модуль, 227
MOUSEBUTTONUP, событие, 360
MOUSEBUTTON, событие, 360
MOUSEMOTION, событие, 360
move_ip(), метод, 402
move(), метод, 403
N
None, значение, 183
not, оператор, 82
O
or, оператор, 81
P
PixelArray, объект, 335
polygon(), функция модуля pygame.draw,
332
print(), функция, 41
pygame.display, модуль set_caption(), функция, 326
set_mode(), функция, 324
update(), функция, 331
pygame.draw, модуль circle(), функция, 333
ellipse(), функция, 334
line(), функция, 333
polygon(), функция, 332
rect(), функция, 334
pygame.quit(), функция, 338
pygame.Rect, тип данных, 358
pygame.Rect(), функция, 358
pygame, модуль выход из программ, 338
закрашивание цветом объекта поверхности, 331
события и цикл игры, 336
функции рисования круг, 333
линия, 333
многоугольник, 332
прямоуглольник, 334
эллипс, 334
Q
QUIT, событие, 359
R
random, модуль импорт, 48
range(), функция, 131
remove(), метод, 238
return, инструкция, 84
round(), функция, 309
S
shuffl e(), функция модуля random, 192
sort(), метод списка, 201
Sound, объект, 376
Sound(), функция модуля pygame.mixer,
376
split(), метод, 128
sqrt(), функция модуля math, 228
str(), функция, 57, 62
Surface, объект, 326
sys, модуль, 227
T
tick(), метод объекта Clock, 357
time, модуль sleep(), функция, 88
импорт, 76
True (Истина), логическое значение, 57
U
upper(), метод, 91
V
values(), метод, 151
W
while, инструкция, 79, 90
А
Абсолютное значение числа, 215
Алгоритмы, 167
Аргументы, 41
Атрибуты, 330

412
Предметный указатель
Б
Бесконечный цикл, 94
>= (больше или равняется), оператор, 58
> (больше чем), оператор, 58
В
Вывод, 64, 65
Вызов методов, 127
функций, 77
Вызов методов, 127
Выполнение программы, 40
Выражения, 26
оценка выражений, 26
- (вычитание), 25
расширенное присваивание, 199
Г
Глобальная область, 85
Глобальные переменные, 97
Д
: (двоеточие), в инструкциях for, 54
" (двойные кавычки), 69
Дедуктивная игра «Холодно-горячо»,
192
Дедуктивня игра «Холодно-горячо», 193,
195, 196, 197, 208
Декартова сстема координат, 209, 263
/ (деление), 25
расширенное присваивание, 199
З
= (знак равенства), оператор присваивания, 28
# (знак решетки), для комментариев, 41
Значения, 25
присваивание переменной нового значения, 31
сохранение значений в переменных, 28
И
Игра «Виселица»
доработка игры, 147
проектирование игры с помощью блок-схем, 108
Игра «Крестики-нолики», 160
Игра «Ловкач», 381
Игра «Охота за подводными сокровищами», 218
Игра «Реверси», 263
Игра «Угадай число», 46
Игра «Царство драконов», 73
Игровой цикл, 337
для игры «Ловкач», 398
для игры «Реверси», 296
для программы «Анимация», 346
Индексы доступ к элементам списка, 125
после удаления элементов списка, 154
Инструкции управления потоком, 51
Искусственный интеллект, 159, 263
Исходный код, 37
Итерация, 54
К
[] (квадратные скобки), для индексов,
124
Клавиатура обработка событий, 398
пользовательский ввод, 359
Клавишы WASD, 361
Ключи для словарей, 149
для шифров, 249
Комментарии, 40
Конкатенация списков, 126
строк, 35
Константы, 124
Координаты y, 210
Кординаты x, 210
Короткие логические выражения, 180
() (круглые скобки), порядок выполнения операций, 27
Курсор в файловом редакторе, 37
Л
Логические операторы, 80
Логический тип данных, 57
Локальная область, 85
Локальные переменные, 98

Предметный указатель
413
М
Математика выражения, 26, 27
математические хитрости, 214
операторы, 25
синтаксические ошибки, 27
целые числа и числа с плавающей точкой, 25, 27
<= (меньше или равняется), оператор, 58
< (меньше чем), оператор, 58
Множественное присваивание, 156
Мышь обработка событий, 359
Н
Написание программ, 36
!= (не равняется), оператор, 58
Новая строка (), 70
(обратный слеш), для экранируемых символов, 67
О
Объекты, 326
' (одинарные кавычки), 69
Окно графического интерфейса пользователя, ГИП, 324
Операторы математические операторы, 25
Опечатки, 30
Ось x, 210
Ось y, 210
Отладчик, 95
Отсупы в коде, 52
Ошибки, 93
поиск ошибок, 100
типы ошибок, 93
П
Параметры функции, 86
Пиксели, 213
окрашивание пикселей, 335
Порядок операций, 26
>>>, приглашение, 29
Программа AISim1, 300
Программа AISim2, 304
Программа AISim3, 310
Программа «Hello World», 37
Программа «Анимация», 339
Программа «Обнаружение столкновений», 353
Программа «Спрайты и звуки», 371
Программа «Шифр Цезаря», 251
Программа «Шутки», 65
Р
== (равняется), оператор, 58
Редактор файлов, 37
Режим полного перебора для шифров,
260
С
Сглаживание, 329
+ (сложение), 25
коммутативное свойство, 214
расширенное присваивание, 199
События, 337
Создание комментариев из кода, 302
Сообщения об ошибке, 94
ImportError, 320
IndexError, 126
NameError, 30
ValueError, 56
синтаксические ошибки, 27
Спрайты, 369
добавление, 375
изменение размера, 376
Срезы списков, 132
Ссылки на список, 172
Статистические данные, 307
Строки, 34
интерполяция, 204
многострочные, 78
Структуры данных, 227
Т
Таблица истинности оператор and, 80
оператор not, 82
оператор or, 81

Типы данных, 36
атрибуты Rect, 330
логический, 57
словарь, 149
списки, 124
целые числа, 25
Трассировка, 94
У
Удаление элементов списка, 154
* (умножение), 25
расширенное присваивание, 199
Условия, 59
Установка
Python, 21
Ф
Файлы изображений, 370
{} (фигурные скобки), в словарях, 149
Функции, 41
Ц
Цвет заливка объектов поверхности, 331
значения RGB в pygame, 326
пикселей, 335
текста, 329
Целые числа, 25
Циклы, 51
вложенные, 206
выход при помощи инструкции break,
62
с инструкциями while, 79
Ч
Числа с плавающей точкой, 25, 27
Ш
Шрифты, 327
Э
Экранируемые символы, 67

Âñå ïðàâà çàùèùåíû. Êíèãà èëè ëþáàÿ åå ÷àñòü íå ìîæåò áûòü ñêîïèðîâàíà, âîñïðîèçâåäåíà â
ýëåêòðîííîé èëè ìåõàíè÷åñêîé ôîðìå, â âèäå ôîòîêîïèè, çàïèñè â ïàìÿòü ÝÂÌ, ðåïðîäóêöèè
èëè êàêèì-ëèáî èíûì ñïîñîáîì, à òàêæå èñïîëüçîâàíà â ëþáîé èíôîðìàöèîííîé ñèñòåìå áåç
ïîëó÷åíèÿ ðàçðåøåíèÿ îò èçäàòåëÿ. Êîïèðîâàíèå, âîñïðîèçâåäåíèå è èíîå èñïîëüçîâàíèå êíèãè
èëè åå ÷àñòè áåç ñîãëàñèÿ èçäàòåëÿ ÿâëÿåòñÿ íåçàêîííûì è âëå÷åò óãîëîâíóþ, àäìèíèñòðàòèâíóþ
è ãðàæäàíñêóþ îòâåòñòâåííîñòü.
Ïîñîáèå äëÿ ðàçâèâàþùåãî îáó÷åíèÿ
ÌÈÐÎÂÎÉ ÊÎÌÏÜÞÒÅÐÍÛÉ ÁÅÑÒÑÅËËÅÐ
Ýë Ñâåéãàðò
Ó×ÈÌ PYTHON, ÄÅËÀß ÊÐÓÒÛÅ ÈÃÐÛ
Äèðåêòîð ðåäàêöèè Å. Êàïü¸â
Îòâåòñòâåííûé ðåäàêòîð Å. Èñòîìèíà
Ìëàäøèé ðåäàêòîð Å. Ìèíèíà
Õóäîæåñòâåííûé ðåäàêòîð À. Ãóñåâ
Ñâåäåíèÿ î ïîäòâåðæäåíèè ñîîòâåòñòâèÿ èçäàíèÿ ñîãëàñíî çàêîíîäàòåëüñòâó ÐÔ î òåõíè÷åñêîì
ðåãóëèðîâàíèè ìîæíî ïîëó÷èòü ïî àäðåñó: http://eksmo.ru/certification/
ндірген мемлекет: Ресей. Сертификация арастырылмаан
Ïîäïèñàíî â ïå÷àòü 14.03.2018. Ôîðìàò 70x100 1
/
16
Ïå÷àòü îôñåòíàÿ. Óñë. ïå÷. ë. 33,7.
Òèðàæ ýêç. Çàêàç
ООО «Издательство «Эксмо»
123308, Москва, ул. Зорге, д. 1. Тел.: 8 (495) 411-68-86.
Home page: www.eksmo.ru E-mail: info@eksmo.ru
ндіруші: «ЭКСМО» А*Б Баспасы, 123308, М7скеу, Ресей, Зорге к;шесі, 1 <й.
Тел.: 8 (495) 411-68-86.
Home page: www.eksmo.ru E-mail: info@eksmo.ru.
Тауар белгісі: «Эксмо»
*азастан Республикасында дистрибьютор ж7не ;нім бойынша арыз-талаптарды абылдаушыныA
;кілі «РДЦ-Алматы» ЖШС, Алматы ., Домбровский к;ш., 3«а», литер Б, офис 1.
Тел.: 8 (727) 251-59-90/91/92; E-mail: RDC-Almaty@eksmo.kz
Интернет-магазин: www.book24.kz
німніA жарамдылы мерзімі шектелмеген.
Сертификация туралы апарат сайтта: www.eksmo.ru/certifi cation
Оптовая торговля книгами «Эксмо»:
ООО «ТД «Эксмо». 142700, Московская обл., Ленинский р-н, г. Видное,
Белокаменное ш., д. 1, многоканальный тел.: 411-50-74.
E-mail: reception@eksmo-sale.ru
По вопросам приобретения книг «Эксмо» зарубежными оптовыми покупателями обращаться в отдел зарубежных продаж ТД «Эксмо»
E-mail: international@eksmo-sale.ru
International Sales: International wholesale customers should contact
Foreign Sales Department of Trading House «Eksmo» for their orders.
international@eksmo-sale.ru
По вопросам заказа книг корпоративным клиентам, в том числе в специальном оформлении, обращаться по тел.: +7 (495) 411-68-59, доб. 2261.
E-mail: ivanova.ey@eksmo.ru
https://eksmo.ru/b2b/
1   ...   31   32   33   34   35   36   37   38   39


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