<?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=Vazhnov</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=Vazhnov"/>
		<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/Vazhnov"/>
		<updated>2026-05-13T13:31:47Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:ElmaBoling34051</id>
		<title>Участник:ElmaBoling34051</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:ElmaBoling34051"/>
				<updated>2020-09-26T10:59:56Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:DorthyShears1</id>
		<title>Участник:DorthyShears1</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:DorthyShears1"/>
				<updated>2020-09-26T10:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:JaxonFassbinder</id>
		<title>Участник:JaxonFassbinder</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:JaxonFassbinder"/>
				<updated>2020-09-26T10:59:20Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KatiaYokoyama0</id>
		<title>Участник:KatiaYokoyama0</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KatiaYokoyama0"/>
				<updated>2020-09-26T10:59:05Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:HoustonTomlin</id>
		<title>Участник:HoustonTomlin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:HoustonTomlin"/>
				<updated>2020-09-26T10:58:53Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:JeraldPastor1</id>
		<title>Участник:JeraldPastor1</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:JeraldPastor1"/>
				<updated>2020-09-26T10:58:39Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:ShelbyA38075</id>
		<title>Участник:ShelbyA38075</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:ShelbyA38075"/>
				<updated>2020-09-26T10:58:28Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:NewtonArchie8</id>
		<title>Участник:NewtonArchie8</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:NewtonArchie8"/>
				<updated>2020-09-26T10:58:08Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:MelodeeWse</id>
		<title>Участник:MelodeeWse</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:MelodeeWse"/>
				<updated>2020-09-26T10:57:55Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eugenio4759</id>
		<title>Участник:Eugenio4759</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Eugenio4759"/>
				<updated>2020-02-09T20:12:07Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: SPAM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Vazhnov</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>2019-08-28T16:19:43Z</updated>
		
		<summary type="html">&lt;p&gt;Vazhnov: Исправил ошибки в коде. Точнее, исправил ещё в ~2013 году, на письма редакция тогда не ответила, и только сейчас смог сюда внести&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, 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>Vazhnov</name></author>	</entry>

	</feed>