<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AmbientLighter</id>
		<title>Linuxformat - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AmbientLighter"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/AmbientLighter"/>
		<updated>2026-05-13T17:38:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF110:Phyton</id>
		<title>LXF110:Phyton</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF110:Phyton"/>
				<updated>2011-07-20T14:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;AmbientLighter: «LXF110:Phyton» переименована в «LXF110:Python»: orthography&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[LXF110:Python]]&lt;/div&gt;</summary>
		<author><name>AmbientLighter</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF110:Python</id>
		<title>LXF110:Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF110:Python"/>
				<updated>2011-07-20T14:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;AmbientLighter: «LXF110:Phyton» переименована в «LXF110:Python»: orthography&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''Программирование''' Стрелялка в стиле «убей-их-всех» на ''PyGame'' для ретро-аркадных приколов [[Категория:Учебники]]р&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Python}}&lt;br /&gt;
&lt;br /&gt;
==Создаем свою игру==&lt;br /&gt;
&lt;br /&gt;
: Руки чешутся пострелять? А также попрограммировать? Присоединяйтесь к '''Майку Сондерсу''': возродим классическую аркаду 1978 года всего 100 строками кода.&lt;br /&gt;
&lt;br /&gt;
Программирование – великая вещь. Можно создавать нечто абсолютно новое, стимулировать свой мозг и получать удовольствие в процессе – особенно если вы пишете игру. В последние месяцы вы просили нас опубликовать более проектно-ориентированный учебник, и сегодня мы попытаемся написать наше видение игры ''Space Invaders'' [Космические захватчики] под названием&lt;br /&gt;
''PyInvaders''. Кто устал от сухой теории программирования, не паникуйте: мы займемся созданием Клевых Штук™ и сделаем игру рабочей, а не станем трещать об алгоритмах, структурах данных и объектно-ориентированном инкапсулированном полиморфизме. Или о чем-то типа этого.&lt;br /&gt;
&lt;br /&gt;
Однако следование данному руководству возможно, только если у вас есть опыт программирования. Мы не собираемся все разжевывать;&lt;br /&gt;
если вы баловались написанием кода и раньше и знаете ваши массивы как свои пять пальцев, проблем у вас не будет. Для полных нулей&lt;br /&gt;
в программировании некоторые термины будут загадочными, но вы не&lt;br /&gt;
обязаны понимать их все. Почерпните из статьи то, что сможете, возьмите исходный код с '''LXFDVD''' и начните эксперименты, внося собственные изменения. Так начинали все программисты!&lt;br /&gt;
&lt;br /&gt;
Наш выбор языка программирования – ''Python'', потому что его простой синтаксис и чистота кода очень удобны для чтения. ''PyGame'', расширение языка, являющееся оберткой мультимедийной библиотеки ''SDL'' вокруг ''Python'', обеспечит графический водопровод для нашей программы, спасая нас от тяжкой ручной работы манипулирования&lt;br /&gt;
изображениями. Большинство дистрибутивов имеют ''Python'' предустановленным, а ''PyGame'' доступен в ближайшем репозитории, поэтому собирайте инструменты, открывайте текстовый редактор, и начнем кодирование…&lt;br /&gt;
&lt;br /&gt;
===Часть 1 Пример на ''Python''===&lt;br /&gt;
&lt;br /&gt;
Прежде чем приступать к любому программному проекту, важно разобраться в языке, который вы собираетесь использовать, хотя бы в его&lt;br /&gt;
основах. Учитывая, что 99% программ комбинируют манипулирование переменными (типизированные хранилища данных), вызов подпрограмм (отдельных кусков кода), и действий с результатом (если a = b делаем с), можно показать работу ''Python'' на очень кратком примере. (Если вы заядлый ''Python''’щик, просто пропустите его)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 def Multiply(x, y):&lt;br /&gt;
     z=x*y&lt;br /&gt;
     return z&lt;br /&gt;
 a=5&lt;br /&gt;
 b = 10&lt;br /&gt;
 print “a is”, a, “and b is”, b&lt;br /&gt;
 answer = Multiply(a, b)&lt;br /&gt;
 if answer &amp;gt; 10:&lt;br /&gt;
     print “Result is bigger than 10”&lt;br /&gt;
 else:&lt;br /&gt;
     print “Less or equal to 10”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Программа короткая, но она демонстрирует массу возможностей&lt;br /&gt;
''Python'' в действии. Сохраните этот код в файле под именем '''test.py''' в вашей домашней директории, затем откройте терминал и введите ''python test.py'' для его запуска. Вы должны увидеть несколько строк вывода на экране – это не интерактивная программа, поэтому она возвратит вас назад в командную строку.&lt;br /&gt;
&lt;br /&gt;
Первые три строки определяют ('''define''') функцию с именем '''Multiply''' –&lt;br /&gt;
это кусок кода, который не запускается при старте приложения, а является разновидностью подпрограммы, вызываемой позже. '''x''' и '''y''' в строке описания функции – две переменные, которые нам надо послать в подпрограмму при ее вызове. Далее вы можете увидеть новую переменную '''z''', созданную внутри функции – ей присваивается произведение '''x''' и '''y'''.&lt;br /&gt;
Потом мы возвращаем значение этой переменной обратно в вызывающую программу.&lt;br /&gt;
&lt;br /&gt;
После функции '''Multiply''' начинается выполнение основного кода.&lt;br /&gt;
Мы знаем это, потому что здесь нет отступов – то есть знаков табуляции или пробелов в начале строки. В ''Python'' все завязано на использовании отступов, показывающих, где идет код, где он – часть функции или цикла и т.п. В нашем случае отступов нет, потому что это не часть предшествующей функции ''Multiply'', и запуск программы начинается&lt;br /&gt;
отсюда.&lt;br /&gt;
&lt;br /&gt;
Мы создаем две переменные с именами '''a''' и '''b''', присваивая им&lt;br /&gt;
значения '''5''' и '''10''' соответственно. (Переменная является контейнером для данных – она может содержать разную информацию в течение всего времени работы программы.) Мы выводим содержимое переменных и затем посылаем его в функцию '''Multiply''', которую создали ранее. Помните '''return''' в теле функции? Так вот, он вернет результат умножения, и мы сохраним его в новой переменной answer. Наконец, проверим, не больше ли переменная answer десяти; если да, печатаем&lt;br /&gt;
сообщение. Если она меньше (или равна 10), печатаем другое сообщение. Попробуйте менять значения в этой программе и поэкспериментировать с кодом, чтобы освоиться с Python – не бойтесь, вы не сотрете все ваши файлы и не уничтожите вашу систему, допустив ошибку!&lt;br /&gt;
&lt;br /&gt;
====Нужна помощь?====&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=В вашу ''Python''-программу можно добавить комментарии, набрав символ решетки ('''#''') перед их текстом. Вы можете поместить комментарий на своей строке, либо приписать в существующей, после кода – это полезно для отметки внесенных изменений или потенциальных ошибок.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Чтобы разобраться в этом уроке, не обязательно быть гуру ''Python''. Если вы полностью поняли предыдущий фрагмент кода и пояснения к нему, вы готовы идти дальше. Но если вы хотите получше разобраться в ''Python'', в интернете для этого есть много великолепных ресурсов. См. превосходное руководство пользователя от Гвидо ван Россума, создателя ''Python'', на http://docs.python.org/tut.&lt;br /&gt;
&lt;br /&gt;
===Часть 2 Вторжение инопланетян===&lt;br /&gt;
&lt;br /&gt;
Перед написанием кода нужно разжиться графикой. Текстовый режим&lt;br /&gt;
''Space Invaders'' увеличил бы ваш рейтинг среди технарей, но лучше не&lt;br /&gt;
давать ржаветь нашим видеокартам. Для ''PyInvaders'' понадобится пять&lt;br /&gt;
небольших изображений; их можно создать вручную с помощью ''GIMP''&lt;br /&gt;
или позаимствовать из '''LXFDVD''' (в разделе '''Журнал/PyInvaders'''). Вот&lt;br /&gt;
что вам нужно, если вы захотите создать их сами:&lt;br /&gt;
&lt;br /&gt;
* '''backdrop.bmp''' Изображение размером 640 x 480 пикселей, оно будет фоном игры. Лучше не делать его слишком ярким или сложным, это будет только отвлекать вас от спрайтов.&lt;br /&gt;
* '''hero.bmp''' Изображение корабля игрока размером 32 x 32 пикселя; те части, которые должны быть прозрачными, надо залить черным цветом.&lt;br /&gt;
* '''baddie.bmp''' Тоже корабль, но со злобными пришельцами.&lt;br /&gt;
* '''heromissile.bmp''' и '''baddiemissile.bmp''' Снова 32 x 32 пикселя с черным цветом для прозрачных мест, с ракетой игрока, направленной вверх, и противника, направленной вниз. &lt;br /&gt;
&lt;br /&gt;
Создайте директорию '''PyInvaders''' в вашей домашней папке, а затем сделайте поддиректорию с именем&lt;br /&gt;
'''data''', содержащую указанные выше файлы.&lt;br /&gt;
&lt;br /&gt;
Давайте также обсудим, что мы будем делать в игре типа ''Space Invaders''. Если вы никогда не видели ее раньше, то знайте: в ней есть несколько шеренг пришельцев, снующих вправо и влево в верхней&lt;br /&gt;
части экрана, стреляющих ракетами и постепенно сдвигающихся вниз,&lt;br /&gt;
в направлении игрока. Вы тоже можете палить во врагов ракетами:&lt;br /&gt;
ваша цель – уничтожить их, прежде чем они уничтожат вас.&lt;br /&gt;
&lt;br /&gt;
====Код в целом====&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать себе жизнь проще (а код компактнее), ограничимся&lt;br /&gt;
одним рядом пришельцев и не будем делать счетчик очков или бонусы. Эти вещи можно добавить потом, когда вы разберетесь в происходящем! Здесь мы пройдемся по участкам кода, поясняя их, а полную&lt;br /&gt;
версию программы можно найти в отдельном файле ('''PyInvaders.py''')&lt;br /&gt;
раздела Журнал/PyInvaders на LXFDVD. Теперь читайте текст дальше,&lt;br /&gt;
чтобы понять, как все это работает.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 from pygame import *&lt;br /&gt;
 import random&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эти первые две строчки очень просты: они сообщают ''Python'', что&lt;br /&gt;
мы хотим использовать модуль ''PyGame'', чтобы загружать изображения и легко управлять ими на экране, и дают нам потом генерировать случайные числа.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 class Sprite:&lt;br /&gt;
      def __init__(self, xpos, ypos, filename):&lt;br /&gt;
         self.x = xpos&lt;br /&gt;
         self.y = ypos&lt;br /&gt;
         self.bitmap = image.load(filename)&lt;br /&gt;
         self.bitmap.set_colorkey((0,0,0))&lt;br /&gt;
      def set_position(self, xpos, ypos):&lt;br /&gt;
         self.x = xpos&lt;br /&gt;
         self.y = ypos&lt;br /&gt;
      def render(self):&lt;br /&gt;
         screen.blit(self.bitmap, (self.x, self.y))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идет класс '''Sprite'''. Кто близко знаком с объектно-ориентированным программированием, уже знает, как он работает, а&lt;br /&gt;
кто не знает, представьте его как тип хранилища для данных и команд.&lt;br /&gt;
Этот код не запускается при старте программы – он просто говорит:&lt;br /&gt;
«Вот хранилище данных и команд, называемое '''Sprite''', его мы используем позднее». Класс устанавливает переменные для спрайтов – главные здесь '''х''' и '''у''', они будут хранить координаты позиции спрайта на&lt;br /&gt;
экране. Подпрограмма '''__init__''' запускается, когда мы хотим создать&lt;br /&gt;
новый экземпляр класса (новое хранилище на основе этого описания),&lt;br /&gt;
и загружает изображение спрайта по имени '''filename'''.&lt;br /&gt;
&lt;br /&gt;
Строка '''set_colorkey''' говорит ''PyGame'', что мы хотим сделать черные&lt;br /&gt;
(0,0,0 в формате RGB) пиксели прозрачными.&lt;br /&gt;
&lt;br /&gt;
Новичков в объектно-ориентированном программировании все это&lt;br /&gt;
может малость запутать. Но опять же, просто считайте это видом хранилища, содержащего переменные и подпрограммы (они помечены&lt;br /&gt;
словом '''def'''), причем можно создавать много образчиков (экземпляров)&lt;br /&gt;
этого хранилища с различным содержанием. Итак, создадим 10 экземпляров класса '''Sprite''' для врагов, один для игрока и так далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 def Intersect(s1_x, s1_y, s2_x, s2_y):&lt;br /&gt;
      if (s1_x &amp;gt; s2_x - 32) and (s1_x &amp;lt; s2_x + 32) and (s1_y &amp;gt; s2_y - 32) and (s1_y &amp;lt; s2_y + 32):&lt;br /&gt;
           return 1&lt;br /&gt;
      else:&lt;br /&gt;
           return 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хоть этот кусок кода и выглядит сложным, не дайте ему вас смутить. Это ведь функция (обозначается '''def'''), и она не выполняется при запуске программы, но может быть вызвана позже. Здесь проверяется перекрытие двух спрайтов – он берет координаты пикселей '''х''' и '''у''' одного спрайта (переменные '''s1_x''' и '''s2_x''') и сравнивает их с позиций другого&lt;br /&gt;
('''s2_x''' и '''s2_y'''), возвращая '''1''', если они перекрываются. Вуаля: простое&lt;br /&gt;
обнаружение столкновений! Заметим, что в код жестко «зашиты»&lt;br /&gt;
спрайты размером 32 x 32 пикселя, но вы можете изменить числа, если&lt;br /&gt;
позже будете использовать спрайты побольше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 init()&lt;br /&gt;
 screen = display.set_mode((640,480))&lt;br /&gt;
 key.set_repeat(1, 1)&lt;br /&gt;
 display.set_caption(‘PyInvaders’)&lt;br /&gt;
 backdrop = image.load(‘data/backdrop.bmp’)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее мы инициализируем ''PyGame'', настраиваем режим экрана,&lt;br /&gt;
конфигурируем повтор клавиш на более быстрое значение (для управления кораблем игрока), устанавливаем текст заголовка и загружаем&lt;br /&gt;
фоновую картинку.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 enemies = []&lt;br /&gt;
 x=0&lt;br /&gt;
 for count in range(10):&lt;br /&gt;
    enemies.append(Sprite(50 * x + 50, 50, ‘data/baddie.bmp’))&lt;br /&gt;
    x += 1&lt;br /&gt;
 hero = Sprite(20, 400, ‘data/hero.bmp’)&lt;br /&gt;
 ourmissile = Sprite(0, 480, ‘data/heromissile.bmp’)&lt;br /&gt;
 enemymissile = Sprite(0, 480, ‘data/baddiemissile.bmp’)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы создаем новый список объектов – “'''enemies'''”, врагов (список в ''Python'' похож на массив на других языках, хотя гораздо более гибок). Список сперва пуст, поэтому мы в цикле добавляем ('''append''') 10&lt;br /&gt;
новых объектов класса '''Sprite'''. Здесь вы можете увидеть, каким образом мы создаем экземпляры предварительно созданного класса (или копии хранилища), предоставляя первоначальные значения координат&lt;br /&gt;
''x''', '''y''' и имя файла. Часть '''50 * х + 50''' выглядит немного странно, но это&lt;br /&gt;
означает, что по горизонтали новые вражеские спрайты выстраиваются&lt;br /&gt;
ступенчато. То есть х-координата первого спрайта равна 50, следующего – 100, и так далее, пока мы движемся по циклу.&lt;br /&gt;
&lt;br /&gt;
====К оружию! Залп!====&lt;br /&gt;
&lt;br /&gt;
Последние три строки в прошлом куске элементарны для понимания –&lt;br /&gt;
они загружают спрайт для игрока (героя), ракету игрока и ракету противника. Вы помните, что мы выбрали режим экрана 640 x 480? Ну, а здесь мы установили y-координату ракеты (по вертикали) в 480, вблизи&lt;br /&gt;
нижней части экрана, поскольку мы не хотим показывать их до тех пор,&lt;br /&gt;
пока они не выстрелят.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 quit = 0&lt;br /&gt;
 enemyspeed = 3&lt;br /&gt;
 while quit == 0:&lt;br /&gt;
     screen.blit(backdrop, (0, 0))&lt;br /&gt;
     for count in range(len(enemies)):&lt;br /&gt;
         enemies[count].x += enemyspeed&lt;br /&gt;
         enemies[count].render()&lt;br /&gt;
     if enemies[len(enemies)-1].x &amp;gt; 590:&lt;br /&gt;
         enemyspeed = -3&lt;br /&gt;
         for count in range(len(enemies)):&lt;br /&gt;
             enemies[count].y += 5&lt;br /&gt;
     if enemies[0].x &amp;lt; 10:&lt;br /&gt;
         enemyspeed = 3&lt;br /&gt;
         for count in range(len(enemies)):&lt;br /&gt;
             enemies[count].y += 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь беремся за основную часть игры. '''quit''' представляет собой&lt;br /&gt;
переменную типа «да/нет» (1/0), она используется для определения&lt;br /&gt;
конца игры (т.е. либо игрок уничтожил всех «плохишей», либо сам&lt;br /&gt;
сбит их ракетой). Затем, '''enemyspeed''' определяет скорость перемещения врагов – вы можете поиграть с этим параметром позднее, чтобы усложнить игру.&lt;br /&gt;
&lt;br /&gt;
После этого игра переходит в основной цикл, начинающийся в&lt;br /&gt;
строке '''while'''. Во-первых, мы рисуем фон со значениями координат '''х''' и&lt;br /&gt;
'''у''' равными '''0''' и '''0''' соответственно (считая от верхнего левого угла экрана). Потом запускаем с помощью цикла подсчет врагов из ранее созданного списка объектов. '''len(enemies)''' сообщает, сколько вражеских&lt;br /&gt;
объектов находятся в списке – это число будет уменьшаться от 10&lt;br /&gt;
при каждом убийстве игроком «плохиша». В цикле мы увеличиваем&lt;br /&gt;
'''x'''-координату для каждого объекта спрайта неприятеля, затем вызываем для него функцию '''render()''' в описании '''Sprite''' из начала файла.&lt;br /&gt;
&lt;br /&gt;
Следующие два цикла определяют направление и вертикальную позицию ряда врагов. Если крайний правый враг,&lt;br /&gt;
'''enemies[len(enemies)-1]''', достигает правой стороны экрана (590 пикселей), то посылается сигнал движения в другом направлении путем инвертирования значения скорости. Кроме того, враги передвигаются вниз путем добавления 5 к их '''у'''-координате (по вертикали).&lt;br /&gt;
&lt;br /&gt;
Следующий цикл делает то же самое, но для левой части экрана.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  if ourmissile.y &amp;lt; 479 and ourmissile.y &amp;gt; 0:&lt;br /&gt;
       ourmissile.render()&lt;br /&gt;
       ourmissile.y -= 5&lt;br /&gt;
  if enemymissile.y &amp;gt;= 480 and len(enemies) &amp;gt; 0:&lt;br /&gt;
       enemymissile.x = enemies[random.randint(0,&lt;br /&gt;
  len(enemies) - 1)].x&lt;br /&gt;
       enemymissile.y = enemies[0].y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пора заняться ракетами. Первое условие '''if''' создает изображение&lt;br /&gt;
ракеты игрока, если она на экране (то есть в игре), уменьшая на 5 пикселей ее '''y'''-координату на каждой итерации цикла, чтобы она перемещалась вверх по экрану. Вторая часть кода проверяет, есть ли в игре вражеские ракеты – если это не так, она создает одну новую от случайно выбранного противника. Она делает это путем установки '''x'''-координаты&lt;br /&gt;
ракеты одного из врагов: '''random.randint(0, len(enemies) - 1)''' выбирает врага в списке объектов в диапазоне от '''0''' (первый противник) до последнего врага, согласно размеру списка.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  if Intersect(hero.x, hero.y, enemymissile.x, enemymissile.y):&lt;br /&gt;
    quit = 1&lt;br /&gt;
  for count in range(0, len(enemies)):&lt;br /&gt;
    if Intersect(ourmissile.x, ourmissile.y, enemies[count].x,&lt;br /&gt;
 enemies[count].y):&lt;br /&gt;
    del enemies[count]&lt;br /&gt;
      break&lt;br /&gt;
  if len(enemies) == 0:&lt;br /&gt;
    quit = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====За рамки столкновений====&lt;br /&gt;
&lt;br /&gt;
Теперь об обнаружении столкновений. Если спрайт игрока (героя) вступил в контакт со спрайтом противника, то надо выйти из игры. В следующем участке кода мы перебираем список врагов в цикле ‘'''for'''’ c целью обнаружения, не пересекается ли кто-нибудь из них с нашей ракетой. Если да, мы удаляем объект противника, которого коснулся снаряд, из списка и прерываем цикл (чтобы не продолжать работу с уже несуществующим объектом). По удалении вражеского объекта список становится короче. Наконец, мы проверяем, не равна ли длина списка врагов нулю – это произойдет, когда игрок уничтожит всех противников. Если&lt;br /&gt;
да, выходим с победой!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  for ourevent in event.get():&lt;br /&gt;
    if ourevent.type == QUIT:&lt;br /&gt;
      quit = 1&lt;br /&gt;
    if ourevent.type == KEYDOWN:&lt;br /&gt;
      if ourevent.key == K_RIGHT and hero.x &amp;lt; 590:&lt;br /&gt;
        hero.x += 5&lt;br /&gt;
      if ourevent.key == K_LEFT and hero.x &amp;gt; 10:&lt;br /&gt;
        hero.x -= 5&lt;br /&gt;
      if ourevent.key == K_SPACE:&lt;br /&gt;
        ourmissile.x = hero.x&lt;br /&gt;
        ourmissile.y = hero.y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А вот блок поддержки клавиатуры. Мы получаем список событий&lt;br /&gt;
''SDL'' (клавиатура, мышь, оконный менеджер и т.д.) и работаем с ним.&lt;br /&gt;
Если мы видим событие '''QUIT''', это означает, что пользователь пытался&lt;br /&gt;
закрыть окно, поэтому устанавливаем переменную '''quit''', которая вызовет прерывание нашей программы в основном цикле ‘'''while'''’. В свою очередь, если произойдет событие '''KEYDOWN''', то мы должны его обработать. Тут все кристально ясно: если нажата клавиша курсора вправо и мы не вылетели за экран, добавьте 5 к горизонтальной позиции игрока.&lt;br /&gt;
Похожее действие необходимо выполнить для клавиши курсора влево,&lt;br /&gt;
но наоборот. Мы также проверяем клавишу '''Пробел''': если она нажата,&lt;br /&gt;
порождаем новую ракету, поместив ее в положение, где находится&lt;br /&gt;
спрайт игрока.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  enemymissile.render()&lt;br /&gt;
  enemymissile.y += 5&lt;br /&gt;
  hero.render()&lt;br /&gt;
  display.update()&lt;br /&gt;
  time.delay(5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И вот последний кусок кода. Мы выводим вражескую ракету и перемещаем ее вниз по экрану, а затем выводим спрайт игрока. Отметим,&lt;br /&gt;
что '''display.update()''' – существенная часть программирования ''PyGame''.&lt;br /&gt;
Что бы вы ни делали на экране, оно не будет реально отображаться,&lt;br /&gt;
пока вы не вызовете эту подпрограмму; именно поэтому ее вызов расположен в конце основного цикла игры '''while'''. Наконец, мы добавляем задержку, чтобы игра не протекала слишком быстро – попробуйте с ней поэкспериментировать.&lt;br /&gt;
&lt;br /&gt;
====Вот и все====&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF110_77_1.jpg|300px]]Наша игра закончена! Взгляните на пришельцев. Правда, страшные?|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Код завершен! Он достаточно большой, если вы новичок в ''Python'' и&lt;br /&gt;
''PyGame'', но если тщательно ему следовать, то можно понять его смысл.&lt;br /&gt;
Возьмите полный файл (''PyInvaders.py'') из раздела '''Журнал/PyInvaders'''&lt;br /&gt;
LXFDVD, затем скопируйте его в созданную ранее директорию&lt;br /&gt;
'''PyInvaders''', в которой также содержится директория с изображениями.&lt;br /&gt;
Затем откройте терминал и введите:&lt;br /&gt;
&lt;br /&gt;
 cd PyInvaders&lt;br /&gt;
 python pyinvaders.py&lt;br /&gt;
&lt;br /&gt;
для запуска игры. Если у вас возникли проблемы с его работой, или&lt;br /&gt;
вы совершенно запутались в какой-то из концепций программирования, зайдите на наш форум http://unixforum.org/ и оставьте сообщение в разделе '''Программирование'''. Кто-нибудь обязательно подаст вам руку помощи. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
====Переходим на новый уровень====&lt;br /&gt;
&lt;br /&gt;
Если вы разобрались в коде, почему бы не&lt;br /&gt;
украсить ''PyInvaders'' новыми функциями?&lt;br /&gt;
Ниже приведены советы о возможных изменениях…&lt;br /&gt;
* '''Легко''' Добавить счетчик очков. Все, что для этого нужно – добавить '''score = 0''' где-то в начале кода, создав новую переменную, а затем увеличивать его ('''score += 1''') при каждом попадании в противника. Потом при выходе из программы вы можете вставить '''print “You scored:” score''' для отображения баллов игрока.&lt;br /&gt;
* '''Средне''' Проверка столкновения «ракета-ракета». Сейчас игра определяет, когда ракета попала в космический корабль, но не когда одна ракета столкнулась с другой. Можно добавить проверку посреди кода, рядом с нынешней подпрограммой обнаружения столкновений, а потом сбрасывать позиции ракет игрока и противника, если они соприкасаются.&lt;br /&gt;
* '''Сложно''' Добавить еще один ряд инопланетян. Вам придется продублировать часть кода. Во-первых, если вы захотите создать второй список спрайтов врагов, позиция y должна быть больше, чем в существующем ряде (например, 100). Тогда вам придется еще раз добавить проверку столкновений и создать еще одну вражескую ракету. Она безусловно усложнит игру!&lt;br /&gt;
&lt;br /&gt;
Есть немало и других идей, которые можно реализовать: например, изменять спрайты при попадании ракеты или добавить джойстик. См.&lt;br /&gt;
http://www.pygame.org/docs – в частности, раздел '''Tutorials''' и руководство игры '''Chimp''' для получения справки по использованию звуковых эффектов.&lt;/div&gt;</summary>
		<author><name>AmbientLighter</name></author>	</entry>

	</feed>