Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python
Скачать 6.56 Mb.
|
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/ |