<?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/index.php?action=history&amp;feed=atom&amp;title=LXF103%3A%D0%98%D0%B3%D1%80%D0%B0_%D1%81_%D0%BC%D1%8F%D1%87%D0%BE%D0%BC</id>
		<title>LXF103:Игра с мячом - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF103%3A%D0%98%D0%B3%D1%80%D0%B0_%D1%81_%D0%BC%D1%8F%D1%87%D0%BE%D0%BC"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF103:%D0%98%D0%B3%D1%80%D0%B0_%D1%81_%D0%BC%D1%8F%D1%87%D0%BE%D0%BC&amp;action=history"/>
		<updated>2026-05-13T10:45:03Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF103:%D0%98%D0%B3%D1%80%D0%B0_%D1%81_%D0%BC%D1%8F%D1%87%D0%BE%D0%BC&amp;diff=7385&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Программирование}} == Кодируем: игра с мячом! == : ''ЧАСТЬ 3 На последнем уроке этой серии, '''Майк Сон...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF103:%D0%98%D0%B3%D1%80%D0%B0_%D1%81_%D0%BC%D1%8F%D1%87%D0%BE%D0%BC&amp;diff=7385&amp;oldid=prev"/>
				<updated>2009-03-21T17:07:38Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Программирование}} == Кодируем: игра с мячом! == : &amp;#039;&amp;#039;ЧАСТЬ 3 На последнем уроке этой серии, &amp;#039;&amp;#039;&amp;#039;Майк Сон...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Программирование}}&lt;br /&gt;
== Кодируем: игра с мячом! ==&lt;br /&gt;
: ''ЧАСТЬ 3 На последнем уроке этой серии, '''Майк Сондерс''' займется кодированием простой, но захватывающей игры...''&lt;br /&gt;
&lt;br /&gt;
За последние два урока мы неплохо набили руку, создав IRC-бота и программу всплывающих карточек – вещи довольно&lt;br /&gt;
серьезные; давайте же в последнем проекте развлечемся игрой.&lt;br /&gt;
Создание большинства современных игр требует тысячи человеко-часов, не считая армии художников и музыкантов, но все еще есть&lt;br /&gt;
область, где хакеры-одиночки могут написать что-то забавное. В конце концов, для создания Тетриса не потребовалась команда из 500&lt;br /&gt;
кодеров и бюджет голливудского фильма – Алексей Пажитнов вполне&lt;br /&gt;
обошелся своими силами (конечно, пока подлые акулы капитализма с запада не подхватили его идею...). Как и для проекта прошлого месяца, в качестве основы нашего проекта используем Python и&lt;br /&gt;
PyGame. Кстати, уже имеется три реализации Тетриса на базе PyGame,&lt;br /&gt;
см. http://www.pygame.org/tags/tetris.&lt;br /&gt;
&lt;br /&gt;
Если это первый номер LXF, который вы взяли в руки, и до этого&lt;br /&gt;
вы ни строчки не написали на Python, вы будете приятно удивлены,&lt;br /&gt;
насколько прост он в понимании: код Python знаменит в мире программирования своей самодокументированностью. А если вы знакомы&lt;br /&gt;
с другим языком программирования, типа C или PHP, вы восхититесь&lt;br /&gt;
простотой Python. Например, блоки кода выделяются отступами, а не&lt;br /&gt;
фигурными скобками – взгляните сюда:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;def saystuff(somestring):&lt;br /&gt;
 print &amp;quot;String passed: &amp;quot;, somestring&lt;br /&gt;
saystuff(&amp;quot;Wowzers&amp;quot;)&amp;lt;/source&amp;gt;&lt;br /&gt;
Если вы новичок в Python, то убедитесь, что он у вас установлен&lt;br /&gt;
(большинство дистрибутивов инсталлируют его по умолчанию, но&lt;br /&gt;
если это не ваш случай, то он доступен в вашем менеджере пакетов).&lt;br /&gt;
Введите указанный выше код в текстовом редакторе и сохраните в&lt;br /&gt;
вашем домашнем каталоге как test.py. Затем откройте терминал и&lt;br /&gt;
наберите:&lt;br /&gt;
 python test.py&lt;br /&gt;
Если все в порядке, то Python интерпретирует код и выдаст строку&lt;br /&gt;
текста. В данном примере просто определяется подпрограмма с именем saystuff – она выводит любую строку текста, которая ей передается.&lt;br /&gt;
Вы можете видеть, что код подпрограмы имеет отступ на одну табуляцию. Выполнение начинается с первого вызова saystuff, приводящего&lt;br /&gt;
к печати строки Wowzers. Вот так все просто; вы практически готовы&lt;br /&gt;
к кодированию.&lt;br /&gt;
&lt;br /&gt;
Еще один момент: для данного урока вам понадобятся модули&lt;br /&gt;
PyGame. PyGame – это дополнительный слой, связывающий SDL и&lt;br /&gt;
Python и позволяющий отображать картинки и использовать звуковые эффекты в ваших программах. Он широко распространен и&lt;br /&gt;
скорее всего доступен в репозиториях вашего дистрибутива; в противном случае обратитесь к разделу Разработка нашего DVD. (Если&lt;br /&gt;
вы выполнили урок проекта прошлого месяца, то PyGame у вас уже&lt;br /&gt;
установлен!)&lt;br /&gt;
&lt;br /&gt;
=== Скачки по кругу ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Скорая помощь&lt;br /&gt;
|Содержание=Есть проблемы&lt;br /&gt;
с проектом&lt;br /&gt;
PyGame? Отслеживайте значения&lt;br /&gt;
переменных,&lt;br /&gt;
просто выводя&lt;br /&gt;
их в терминал с&lt;br /&gt;
помощью простого&lt;br /&gt;
оператора print.&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;
переменных xmove&lt;br /&gt;
или ymove – разместите в основном&lt;br /&gt;
цикле игры print&lt;br /&gt;
имя_переменной,&lt;br /&gt;
и сможете следить&lt;br /&gt;
за изменениями&lt;br /&gt;
во время работы&lt;br /&gt;
программы&lt;br /&gt;
в терминале.&lt;br /&gt;
|Ширина=200px}}&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;
# Соответственно обновляем графику.&lt;br /&gt;
# Возвращаемся к шагу 3.&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;
цикла добавляем 1 к его горизонтальной координате. Если мяч ударяется о правый край экрана, то мы начинаем прибавлять к его горизонтальной координате -1, и он пойдет влево.&lt;br /&gt;
&lt;br /&gt;
Представили? Если вы не понимаете, как это работает, вот вам&lt;br /&gt;
программа на Python, демонстрирующая это в действии. Вы можете найти этот код в разделе DVD Журнал/CodeProject в файле ball1.&lt;br /&gt;
py. Для запуска программы, кроме кода, нужно еще изображение с&lt;br /&gt;
именем ball.png – это картинка размером 32х32 пикселя: закрашенный белый круг на черном фоне. На DVD оно есть, но вы можете&lt;br /&gt;
нарисовать его за пару секунд в GIMP – создайте новое изображение&lt;br /&gt;
32х32 пикселя, залейте его черным, вырежьте кружок инструментом&lt;br /&gt;
выделения окружности и залейте его белым. Сохраните файл как ball.&lt;br /&gt;
png в том же каталоге, что и ball1.py, а затем запустите программу,&lt;br /&gt;
набрав python ball1.py.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;from pygame import * # Подключаем функционал PyGame!&lt;br /&gt;
ballpic = image.load(‘ball.png’)&lt;br /&gt;
done = False&lt;br /&gt;
ballx = 0 # переменные позиции мяча&lt;br /&gt;
bally = 0&lt;br /&gt;
ballxmove = 1&lt;br /&gt;
ballymove = 1&lt;br /&gt;
init() # Запуск PyGame&lt;br /&gt;
screen = display.set_mode((640, 480)) # Получаем прекрасное окно&lt;br /&gt;
display.set_caption(‘Ball game’) # И устанавливаем его заголовок&lt;br /&gt;
while done == False:&lt;br /&gt;
screen.fill(0) # Заполняем экран черным (цвет 0)&lt;br /&gt;
screen.blit(ballpic, (ballx, bally)) # Рисуем мяч&lt;br /&gt;
display.update()&lt;br /&gt;
time.delay(1) # Задержка!&lt;br /&gt;
ballx = ballx + ballxmove # Обновляем позицию мяча&lt;br /&gt;
bally = bally + ballymove&lt;br /&gt;
if ballx &amp;gt; 600: # Мяч достиг границ экрана?&lt;br /&gt;
ballxmove = -1&lt;br /&gt;
if ballx &amp;lt; 0:&lt;br /&gt;
ballxmove = 1&lt;br /&gt;
if bally &amp;gt; 440:&lt;br /&gt;
ballymove = -1&lt;br /&gt;
if bally &amp;lt; 0:&lt;br /&gt;
ballymove = 1&lt;br /&gt;
for e in event.get(): # Проверяем нажат ли ESC&lt;br /&gt;
if e.type == KEYUP:&lt;br /&gt;
if e.key == K_ESCAPE:&lt;br /&gt;
done = True&amp;lt;/source&amp;gt;&lt;br /&gt;
Пройдемся по шагам. В первой строке мы сообщаем Python, что&lt;br /&gt;
хотим использовать подпрограммы из библиотеки PyGame. Затем&lt;br /&gt;
загружаем созданное нами изображение мяча, сохраняем его в объекте с именем ballpic и создаем логическую [true/false] переменную для&lt;br /&gt;
определения завершения игры.&lt;br /&gt;
&lt;br /&gt;
Следующие четыре строки очень важны: в них описываются&lt;br /&gt;
переменные, управляющие позицией и перемещением мяча. ballx и&lt;br /&gt;
bally хранят положение (в пикселях) мяча в нашем игровом окне:&lt;br /&gt;
0,0 означает верхний левый, а 640,480 – правый нижний пиксель.&lt;br /&gt;
ballxmove и ballymove хранят числа, добавляемые к позиции мяча на&lt;br /&gt;
каждом шаге; в начале мы устанавливаем в них 1, и когда начинается игра, 1 добавляется к ballx и bally на каждом шаге цикла, тем&lt;br /&gt;
самым перемещая мяч направо вниз. Итак, при запуске программы&lt;br /&gt;
наш мяч находится слева вверху и начинает двигаться по диагонали&lt;br /&gt;
вправо вниз.&lt;br /&gt;
&lt;br /&gt;
Затем мы открываем новое окно PyGame и запускаем основной&lt;br /&gt;
цикл игры, заполняя (очищая) экран черным и отрисовывая наш мяч&lt;br /&gt;
в текущей позиции (комментарии в коде обозначены символом #).&lt;br /&gt;
Следующий кусок кода определяет, как будет двигаться мяч:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;ballx = ballx + ballxmove&lt;br /&gt;
bally = bally + ballymove&lt;br /&gt;
if ballx &amp;gt; 600:&lt;br /&gt;
ballxmove = -1&lt;br /&gt;
if ballx &amp;lt; 0:&lt;br /&gt;
ballxmove = 1&lt;br /&gt;
if bally &amp;gt; 440:&lt;br /&gt;
ballymove = -1&lt;br /&gt;
if bally &amp;lt; 0:&lt;br /&gt;
ballymove = 1&amp;lt;/source&amp;gt;&lt;br /&gt;
В первых двух строках мы обновляем положение мяча по горизонтали (x) и вертикали (y), прибавляя две переменные передвижения.&lt;br /&gt;
Если ballxmove и ballymove равны 1, то мяч переместится на 1 пиксель&lt;br /&gt;
вправо и 1 пиксель вниз на каждом шаге цикла. Но затем оператор&lt;br /&gt;
if проверяет, достиг ли мяч края экрана, и если это так, изменяет соответственно ballxmove и ballymove. Если, например, значение горизонтальной координаты мяча более 600 пикселей, он должен отскочить и&lt;br /&gt;
начать двигаться влево – то есть мы начинаем прибавлять к его позиции -1 (по сути, вычитая 1).&lt;br /&gt;
Несколькими строками кода мы создали впечатление, что мяч&lt;br /&gt;
отскакивает от границ экрана – неплохо! Последние строки этой программы устанавливают связь с клавиатурой, чтобы вы могли в любой&lt;br /&gt;
момент выйти из игры, нажав клавишу Esc.&lt;br /&gt;
&lt;br /&gt;
=== Игра с мячом 2.0 ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Хочу красивые&lt;br /&gt;
|Содержание=Окончательная версия нашей игры – не прорыв на графическом фронте, но мы можем принарядить ее, добавив фоновое изображение.&lt;br /&gt;
Важно только помнить, как мы определяем столкновение с мячом –&lt;br /&gt;
мы ищем белые пиксели. Поэтому фоновое изображение не должно&lt;br /&gt;
содержать пикселей совершенно белого цвета (255,255,255 RGB), не&lt;br /&gt;
то игра закончится, когда мышь окажется над ними!&lt;br /&gt;
&lt;br /&gt;
Подыщите изображение и измените его размер до 640х480. Если на&lt;br /&gt;
изображении окажется белый пиксель, вы всегда можете понизить&lt;br /&gt;
яркость в GIMP и избавиться от проблемы. Сохраните изображение&lt;br /&gt;
рядом с ball2.py и назовите его background.jpg. Теперь, в ball2.py, введите следующий код под строкой ballpic.set_ colorkey:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;backdrop = image.load('background.jpg')&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь наша фоновая картинка находится в памяти и готова к&lt;br /&gt;
использованию. Нам необходимо отображать ее на экране на каждом&lt;br /&gt;
шаге, так что переместитесь вниз по ball2.py и замените строку screen.&lt;br /&gt;
fill(0) следующим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;screen.blit(backdrop, (0,0))&amp;lt;/source&amp;gt;&lt;br /&gt;
и фоновое изображение будет отрисовываться до мячей. Заметьте,&lt;br /&gt;
что если изображение сложное (то есть в нем много цветов), этот&lt;br /&gt;
дополнительный процесс немного замедлит игру – но вы можете&lt;br /&gt;
подстроить скорость мячей и переменную delay, чтобы это скомпенсировать.&lt;br /&gt;
|Ширина=400px}}&lt;br /&gt;
Пока все отлично – мы создали базовую структуру нашей игры. Теперь&lt;br /&gt;
добавим мячей, а также определим столкновения курсора мыши с&lt;br /&gt;
любым их них. Для первой задачи введем массив-словарь для отслеживания мячей. Это придаст программе гибкость: мы сможем иметь&lt;br /&gt;
столько мячей, сколько захотим, не ограничиваясь ball0, ball1, ball2&lt;br /&gt;
и т. д. Словари – плевое дело в Python:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;mydict = {‘Bach’: 100, ‘Handel’: 75, ‘Vivaldi’: 90}&lt;br /&gt;
print mydict[‘Vivaldi’]&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь мы ставим числа в соответствие трем словам, а затем выводим значение, содержащиеся в ‘Vivaldi’, то есть 90. Используем словарь&lt;br /&gt;
для хранения значений X, Y, X-перемещения и Y-перемещения каждого&lt;br /&gt;
мяча – почти как структуру в C. Но если C погружает нас в сумятицу&lt;br /&gt;
управления памятью, то в Python можно создавать наборы объектов-мячей без труда, давая им свои записи в словаре.&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;
Вот код, который вы можете найти в файле ball2.py в разделе&lt;br /&gt;
Журнал/CodeProject на DVD, вместе с картинкой ball.png, которую мы&lt;br /&gt;
создали ранее (он точно такой же).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;from pygame import *&lt;br /&gt;
import random&lt;br /&gt;
ballpic = image.load(‘ball.png’)&lt;br /&gt;
ballpic.set_colorkey((0,0,0))&lt;br /&gt;
numballs = 10&lt;br /&gt;
delay = 5&lt;br /&gt;
done = False&lt;br /&gt;
balls = []&lt;br /&gt;
for count in range(numballs):&lt;br /&gt;
balls.append(dict)&lt;br /&gt;
balls[count] = {‘x’: 0, ‘y’: 0, ‘xmove’: random.randint(1, 2),‘ymove’:&lt;br /&gt;
random.randint(1, 2)}&lt;br /&gt;
init()&lt;br /&gt;
screen = display.set_mode((640, 480))&lt;br /&gt;
display.set_caption(‘Ball game’)&lt;br /&gt;
event.set_grab(1)&lt;br /&gt;
while done == False:&lt;br /&gt;
&lt;br /&gt;
screen.fill(0)&lt;br /&gt;
for count in range(numballs):&lt;br /&gt;
screen.blit(ballpic, (balls[count][‘x’], balls[count][‘y’]))&lt;br /&gt;
display.update()&lt;br /&gt;
time.delay(delay)&lt;br /&gt;
for count in range(numballs):&lt;br /&gt;
balls[count][‘x’] = balls[count][‘x’] + balls[count][‘xmove’]&lt;br /&gt;
balls[count][‘y’] = balls[count][‘y’] + balls[count][‘ymove’]&lt;br /&gt;
for count in range(numballs):&lt;br /&gt;
if balls[count][‘x’] &amp;gt; 620:&lt;br /&gt;
balls[count][‘xmove’] = random.randint(-2, 0)&lt;br /&gt;
if balls[count][‘x’] &amp;lt; -10:&lt;br /&gt;
balls[count][‘xmove’] = random.randint(0, 2)&lt;br /&gt;
if balls[count][‘y’] &amp;gt; 470:&lt;br /&gt;
balls[count][‘ymove’] = random.randint(-2, 0)&lt;br /&gt;
if balls[count][‘y’] &amp;lt; -10:&lt;br /&gt;
balls[count][‘ymove’] = random.randint(0, 2)&lt;br /&gt;
for e in event.get():&lt;br /&gt;
if e.type == KEYUP:&lt;br /&gt;
if e.key == K_ESCAPE:&lt;br /&gt;
done = True&lt;br /&gt;
if screen.get_at((mouse.get_pos())) == (255, 255, 255, 255):&lt;br /&gt;
done = True&lt;br /&gt;
print “You lasted for”, time.get_ticks()/1000, “seconds!”&amp;lt;/source&amp;gt;&lt;br /&gt;
Основная идея этой программы та же, что и раньше, но добавился&lt;br /&gt;
смачный код, требующий объяснений. В самом начале, где мы загружаем изображение мяча, мы заодно устанавливаем его colorkey в (0,0,0),&lt;br /&gt;
что соответствует черному в RGB (Red/Green/Blue – Красный/Зеленый/Синий). Так мы превращаем черные пиксели картинки нашего мяча в&lt;br /&gt;
прозрачные. Это важно, когда у нас перемещается несколько мячей,&lt;br /&gt;
если мы хотим, чтобы они накладывались изящно, не создавая черных углов поверх друг друга. Итак, у наших мячей будут отображаться&lt;br /&gt;
только белые пиксели.&lt;br /&gt;
&lt;br /&gt;
Следующие переменные, numballs и delay, влияют на сложность&lt;br /&gt;
игры. numballs управляет числом мячей, а delay – время (в миллисекундах) остановки игры после каждой итерации цикла. Можете оставить&lt;br /&gt;
их как есть; но если вы стремитесь к большей сложности, увеличьте&lt;br /&gt;
число мячей и снизьте задержку.&lt;br /&gt;
&lt;br /&gt;
Строка balls = [] создает новый массив объектов-мячей, и, в типичной манере Python, количество объектов не ограничивается (и не нужно&lt;br /&gt;
указывать его прямо сейчас). Строка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;for count in range(numballs):&amp;lt;/source&amp;gt;&lt;br /&gt;
создает цикл, который выполняется numball раз (10), добавляя новые&lt;br /&gt;
объекты словаря к массиву balls и присваивая им начальные значения –&lt;br /&gt;
левый верхний угол экрана и случайные смещения вниз-вправо. Числа&lt;br /&gt;
1, 2 в генераторе случайных чисел означают «любое число в промежутке от 1 до 2 (включительно)». Итак, мы получили 10 мячей, стартующих&lt;br /&gt;
со случайными скоростями.&lt;br /&gt;
&lt;br /&gt;
Затем мы настраиваем экран, как раньше, и добавляем строку event.&lt;br /&gt;
set_grab(1), которая заключает курсор мыши внутри окна игры – было&lt;br /&gt;
бы слишком просто, если бы курсор мыши мог сбежать за границы!&lt;br /&gt;
Затем идет главный цикл игры. Как и ранее, мы заполняем экран черным, а затем в другом цикле for вбрасываем все мячи на экран.&lt;br /&gt;
&lt;br /&gt;
После обновления экрана и задержки (чтобы игра шла с одинаковой скоростью на всех машинах), мы вновь проходимся по массиву&lt;br /&gt;
мячей, обновляя их позиции при помощи переменных перемещения.&lt;br /&gt;
Каждый мяч имеет свою собственную копию xmove и ymove в своем&lt;br /&gt;
словаре, так что все они передвигаются независимо. Далее следует&lt;br /&gt;
логика игры, определяющая, достигли ли мячи границ экрана. Здесь&lt;br /&gt;
мы слегка подогнали значения так, чтобы мячи могли чуть-чуть заходить за край экрана (помните, их размер 32х32 пикселей). Это жизненно важно для игрового процесса, поскольку означает, что вам нельзя&lt;br /&gt;
просто забиться курсором мыши в угол, где мячи вас не достанут!&lt;br /&gt;
Мячи теперь достигают любой точки экрана, так что пошевеливайте&lt;br /&gt;
мышью.&lt;br /&gt;
&lt;br /&gt;
Последние три строки кода новые: screen.get_at() возвращает значение цвета пиксела в указанной позиции, то есть в положении курсора мыши, определяемого при помощи mouse.get_pos(). Мы говорим:&lt;br /&gt;
«если цвет пикселя в точке нахождения курсора белый (255,255,255),&lt;br /&gt;
то выполнить done = True», и главный цикл игры while закончится.&lt;br /&gt;
&lt;br /&gt;
И наконец, мы выводим число секунд, в течение которых игрок&lt;br /&gt;
смог выжить – time.get_ticks() возвращает его в миллисекундах, так что&lt;br /&gt;
перед выводом мы делим его на 1000.&lt;br /&gt;
&lt;br /&gt;
=== Отделка ===&lt;br /&gt;
Неплохо для 55 строк кода, не так ли? Как уже говорилось, вы можете усложнить игру, увеличив значение numballs в начале – стандартное значение 10 достаточно непросто, но если вы надеетесь на свое&lt;br /&gt;
проворство, рискните установить 15 или 20, для уворачивания с буквально бешеной скоростью. Есть еще много аспектов игры, с которыми можно поэкспериментировать: например, изменить случайные&lt;br /&gt;
числа в разделе основной логики программы (при ударе мяча о край&lt;br /&gt;
экрана).&lt;br /&gt;
&lt;br /&gt;
PyGame ломится от функций, готовых к экспериментам, и, используя несколько строк кода, вы можете добавить в игру звуковые эффекты или даже фоновую музыку. На http://www.pygame.org/docs/ имеется&lt;br /&gt;
фантастически основательная документация, помогающая пользователям изучить функциональность библиотеки, включая подпрограммы, использованные на нашем уроке. Имея опыт программирования&lt;br /&gt;
на бесчисленном множестве языков и в различных средах, от Amiga&lt;br /&gt;
Blitz Basic до C#-SDL в Mono/.NET, я могу смело заявить, что PyGame –&lt;br /&gt;
один из самых простых в мире наборов для программирования игр:&lt;br /&gt;
это прекрасный способ воплотить любые идеи, возникшие в вашей&lt;br /&gt;
голове. Удачи!&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>