Вы находитесь на странице: 1из 24

Урок № 10

Списки.
Часть 2

СОДЕРЖАНИЕ
Инициализация корабля. . . . . . . . . . . . . . . . . . . . . . . . . . 4
Звездное небо . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Наблюдение за галактикой . . . . . . . . . . . . . . . . . . . . . . . 12
Запуск ракеты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Защита от вражеских кораблей . . . . . . . . . . . . . . . . . . . 14

Материалы к уроку прикреплены к данному PDF-файлу.


Для доступа к материалам, урок необходимо открыть в
программе Adobe Acrobat Reader.
Списки. Часть 2

Н
а сегодняшнем уроке вас ждет интересное
приключение, в ходе которого вы сможете
почувствовать себя настоящим капитаном
космического корабля!

Перед нами стоит задача создать игру «Управление


космическим кораблем». Представьте, что вы  –  капи-
тан корабля (рис. 1).

Рисунок 1

Давайте напишем программу, с помощью которой


вы сможете взглянуть на звезды, путешествовать галак-
тикой, выпустить ракету и защититься от космических
пиратов.
Давайте представим общую структуру игры и рас-
смотрим приведенный в конце урока листинг.
3
Урок № 10

Инициализация корабля
Подробно разберем программу из Листинга 1.
Для начала капитану необходимо включить все при-
боры и выполнить инициализацию корабля (рис. 2).

Рисунок 2

Модуль time позволяет использовать метод time.


sleep(1). Таким образом мы сможем выполнить за-
держку программы. Значение в скобках измеряется в
секундах и останавливает выполнение кода на указан-
4
Списки. Часть 2

ное время. Если поместить модуль внутри цикла for, то


можно будет построчно выводить изображение ракеты
(рис. 3):
import time
print('Initialization...')
time.sleep(1)

ship = [
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
',
...
...
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
',]
for i in range(len(ship)):
print(ship[i])
time.sleep(.2)

Рисунок 3

5
Урок № 10

Обратите внимание, что в списке ship находится


изображение в виде символов. Мы создали его с помо-
щью онлайн-сервиса, который переводит картинки в
ASCII-код.
Подобных сервисов достаточно много, соответ-
ственно, можете использовать любой, удобный вам (к
примеру, https://www.text-image.com/convert/ascii.html).
В результате преобразования картинка станет ASCII-ко-
дом (рис. 4-5):

Рисунок 4

6
Списки. Часть 2

Рисунок 5

У каждого аппарата есть свой индивидуальный но-


мер. Идентификационный номер (ID) нашего корабля
будет генерироваться случайным образом в начале вы-
полнения программы. Данное значение будет храниться
в списке name:
name = []
print('\n**************************************')
print('\tSPACESHIP ID-', end='')
for i in range(5):
r = random.randint(0,9)
name.append(r)
print(name[i], end='')

7
Урок № 10

Представьте, что капитан видит панель управления


кораблем, но не понимает, за что отвечает каждая из
кнопок (рис. 6).

Рисунок 6

Это недопустимо! Поэтому следует описать все ко-


манды на панели и кратко объяснить, для чего нужна
каждая из них:
print('''
Options:
[1] - stars
[2] - galaxy
[3] - missile
[4] - protection
[0] - exit
''')

8
Списки. Часть 2

1 – взглянуть на звездное небо и увидеть своими гла-


зами, как рождаются звезды;
2  – начать путешествие галактикой;
3  – выпустить ракету;
4  – выполнить защиту от вражеских кораблей;
0  – закончить выполнение программы.
Такая инструкция важна в любой программе, иначе
другие пользователи попросту не поймут, что нужно де-
лать.
Представьте, капитан корабля оказался невнима-
тельным и начал нажимать все кнопки подряд. Следует
предотвратить такую ситуацию, сообщив, что введен-
ное значение неверно:
while True:
if select == '1':...
elif select == '2':...
...
...
else:
print('Error! Try again')

Звездное небо
Наконец-то, приключение начинается! Первое, что
мы предлагаем капитану,  –  полететь в открытый кос-
мос и посмотреть, как рождаются звезды. Вот тут-то
и пригодится библиотека turtle. Следует учесть один

9
Урок № 10

важный момент: после закрытия окна с помощью мето-


да exitonclick(), при повторном вызове «черепашки»
может возникнуть ошибка. Чтобы ее предотвратить,
добавим метод turtle.TurtleScreen._RUNNING =
True в начало кода. Метод speed() принимает значение
0 (максимальная скорость).
if select == '1' or select == '2':
turtle.TurtleScreen._RUNNING = True
turtle.bgcolor('black')
turtle.speed(0)
turtle.pensize(1)

При желании это число можно поменять на любое


другое – от 0 до 10, чтобы проверить скорость.
Теперь капитан сможет взглянуть на небо и увидеть
рождение звезд. Значения их цветов хранятся в списке.
Из списка случайным образом будет выбран цвет звез-
ды: белый либо желтый.
colors = ['white', 'yellow']
max_index = len(colors) - 1
# max_index = 1

for i in range(50):
# Random color
random_index = random.randint(0,
max_index)
new_color = colors[random_index]
turtle.color(new_color)

10
Списки. Часть 2

Напишем код, который будет выполнять создание


новой звезды:
for i in range(5):
turtle.forward(15)
turtle.right(144)

Звезды на небе всегда расположены в хаотичном по-


рядке, для этого добавим в программу модуль random.
Мы поступим следующим образом: узнаем высоту
window_height() и ширину window_width() окна. Что-
бы звезда не оказалась видимой лишь наполовину, от-
нимем 50 единиц от этих значений. Разделим на 2, по-
скольку центр координат (0,0) находится в центре окна.
w = turtle.window_width() // 2 - 50
h = turtle.window_height() // 2 - 50
x = random.randrange(-w, w)
y = random.randrange(-h, h)
turtle.goto(x,y)

В результате получим звездное небо, как на приве-


денном на странице 12 изображении (см. рис. 7).

11
Урок № 10

Рисунок 7

Наблюдение за галактикой
Знаете ли вы, как выглядит галактика? Капитану
нашего корабля представилась возможность попутеше-
ствовать по ней (рис. 8)!

Рисунок 8

12
Списки. Часть 2

Давайте создадим подобие галактики с помощью


библиотеки turtle и цикла for. Таким образом, будет
создана спиралевидная фигура:
for i in range(100):
turtle.pensize(i/100 + 1)
turtle.forward(i)
turtle.left(59)

Запуск ракеты
В космосе огромное количество астероидов, кото-
рые могут угрожать вам и вашему кораблю. Предста-
вим, что один из таких гигантов движется на вас, и, если
избежать столкновения невозможно, следует выпустить
ракету. Ракета изменит траекторию движения астеро-
ида, и вы, целый и невредимый, сможете продолжить
свое космическое странствие. В коде это реализовано
следующим образом:
missile = [
'#####################################@@
',
...
...
'$$$####################################'
]
for i in range(len(missile)):
print(missile[i])
time.sleep(.2)

13
Урок № 10

В списке missile храним изображение ракеты


(рис. 9) в виде ASCII-кода и построчно его выводим.

Рисунок 9

Защита от вражеских кораблей


Вы, как настоящий капитан, должны защитить свой
корабль от нападения космических пиратов. В этом вам
поможет Грут с планеты Х (рис. 10).
Как вы уже знаете, мы переводим подходящее изо-
бражение в ASCII-код и построчно выводим его. В дан-
ном случае повторяем эту процедуру.

14
Списки. Часть 2

Рисунок 10

for i in range(5):
print(name[i], end='')
print('\nStart protection...')
time.sleep(1)
protection = [
'....................._-$@@@$-@_................',
...
...
'..................._--___@@$$@$_...............'
]
for i in range(len(protection)):
print(protection[i])
time.sleep(.2)

15
Урок № 10

Итак, на этом уроке мы создали игру «Управление


космическим кораблем», благодаря которой каж-
дый может почувствовать себя капитаном косми-
ческого корабля!

16
Списки. Часть 2

Листинг 1
import time
import datetime
import random
import turtle

print('''
****************************************
* *
* Welcome to Space Adventures! *
* *
****************************************
''')
print('Initialization...')
time.sleep(1)

ship = [
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$$$$$$$@@@@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@$___-$$$$$$$@@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@@@@@@-______-$$$$$$$@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@@@@$__________-$$$$$@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@@@___-$$$$-_____--$$@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@$___-------$______-@@@@@@@',
'@@@@@@@@@@@@@@@@@@@@_____-------$____-@@@@@@@@@',
'@@@@@@@@@@@@@@$$$$-_______-$$$$$___-@@@@@@@@@@@',
'@@@@@@@@@@@@$$$$$________________$@@@@@@@@@@@@@',
'@@@@@@@@@@$$$$$-_____-$_______-@@@@@@@@@@@@@@@@',
'@@@@@@@@@@@@@@@____$$-_____-@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@@@@@@@--_$$-_____-$@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@@@@@$--$$-____-$$$$@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@@@$$_--_-$@@@$$$$$@@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@@$-__--$@@@@@$$$@@@@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@$$-$$$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@$$$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@',
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@',]

17
Урок № 10

for i in range(len(ship)):
print(ship[i])
time.sleep(.1)
print('\nYeah! The spaceship is ready.')

# Initialization spaceship name


name = []
print('\n****************************************')
print('\tSPACESHIP ID-', end='')
for i in range(5):
r = random.randint(0,9)
name.append(r)
print(name[i], end='')
# Date
print('\n\tDate: ', end='')
print(datetime.date.today())
print('****************************************')
print('''
Options:
[1] - stars
[2] - galaxy
[3] - missile
[4] - protection
[0] - exit
''')
while True:
print('****************************************')
print('****************************************')
select = input('Your select: ')
# Stars
if select == '1' or select == '2':
turtle.TurtleScreen._RUNNING = True
turtle.bgcolor('black')
turtle.speed(0)
turtle.pensize(1)

18
Списки. Часть 2

if select == '1':
print('Stars are giant, luminous spheres
of plasma.')
# List of colors
colors = ['white', 'yellow']
max_index = len(colors) - 1

for i in range(50):
# Random color
random_index =
random.randint(0, max_index)
new_color = colors[random_index]
turtle.color(new_color)
# Stars
turtle.begin_fill()
for i in range(5):
turtle.forward(15)
turtle.right(144)
turtle.penup()
turtle.end_fill()
# Generate random location on the
screen
w = turtle.window_width() // 2 - 50
h = turtle.window_height() // 2 - 50
x = random.randrange(-w, w)
y = random.randrange(-h, h)
turtle.goto(x,y)
turtle.pendown()
turtle.exitonclick()

# Galaxy
else:
print('Galaxies consist of stars, stellar
remnants, dust, gas, and dark
matter, bound together by gravity.')
turtle.pencolor('purple')

19
Урок № 10

# List of colors
colors = ['white', 'yellow']
max_index = len(colors) - 1

for i in range(100):
turtle.pensize(i/100 + 1)
turtle.forward(i)
turtle.left(59)
turtle.exitonclick()

# Rocket
elif select == '3':
print('Launching a missile...')
missile = [
'#####################################@@',
'##################################@$@@@',
'###############################@$-@@@@#',
'############################@@_$@@@@@##',
'##########################@-_@@@@@@@###',
'#######################@@_-@##@@@@@####',
'#####################@@_-@@@--@@@@#####',
'###################@@_-@@@@@@@@@#######',
'##################@__@@@@@@@@@@########',
'################@-_@@@@@@@@@@@#########',
'##############@$_$@@@@@@@@@@###########',
'#######@@$$$$@$-@@@@@@@@@@@############',
'#####@$@@@@@@$@@$@@@@@@@@##############',
'###@$@@@@@@@@@@@@@@@@@@################',
'##@@@@@@@@@@@@@@@@@@@@#################',
'#@@@##@@@@@@@@@@@@@@@@#################',
'#######@@@@@@@@@@@@@@@#################',
'######-#@@@@@@@@@@@@@##################',
'####$$-@-####@@@@@@@###################',
'##$$---$$#####@@@@#####################',
'#$$--$$#######@@#######################',
'$$$$$$#################################',
'$$$####################################'
]

20
Списки. Часть 2

for i in range(len(missile)):
print(missile[i])
time.sleep(.2)

# Protection
elif select == '4':
print('An enemy spaceship is moving toward your
SPACESHIP ID-', end='')
for i in range(5):
print(name[i], end='')
print('\nStart protection...')
time.sleep(1)
protection = [
'....................._-$@@@$-@_................',
'...................-$$$$$@@@@$$_...............',
'...................$$$$@@@@$$@$$_..............',
'...................-$$$$@@@$$@$-...............',
'..................._@#$$@##@$$-_...............',
'..................._-$$$$$$$$$_................',
'..................._$$@@@@@@$_.................',
'...................._-@@@@@_...................',
'...................._-@@#@@$_..................',
'.................._@$$@@@@@@@$_................',
'................._@$$$$@@@@##@@$...............',
'................_-@@$$$@@@#@#@@@@_.............',
'................_@@__$$@@@@@@_.$@@-............',
'..............._@@$._@$@@#@@@_..$@@_...........',
'.............._$@-._-@$@@@@@@..._@@-...........',
'............._$@_.._$@$@@#@@@_..._@$_..........',
'.............-@@$_._@@@@@@@@$_.._@@@$..........',
'.............$$.__._@@@#_@#@$...$__@$..........',
'............._$_..._@@#@_$$@$._...-$_..........',
'..................._@@#@_$@@@-.................',
'....................$@#@@-@@@$.................',
'..................._$@#@@$@@@@_................',
'..................._--___@@$$@$_...............'
]

21
Урок № 10

for i in range(len(protection)):
print(protection[i])
time.sleep(.2)
elif select == '0':
break
else:
print('Error! Try again')

22
Урок № 10
Списки. Часть 2

© Компьютерная Академия ШАГ


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопроизведения,


фрагменты которых использованы в материале, принадлежат их законным владель-
цам. Фрагменты произведений используются в иллюстративных целях в объёме,
оправданном поставленной задачей, в рамках учебного процесса и в учебных целях,
в соответствии со ст. 1274 ч. 4 ГК РФ и ст. 21 и 23 Закона Украины «Про авторське
право і суміжні права». Объём и способ цитируемых произведений соответствует
принятым нормам, не наносит ущерба нормальному использованию объектов
авторского права и не ущемляет законные интересы автора и правообладателей.
Цитируемые фрагменты произведений на момент использования не могут быть
заменены альтернативными, не охраняемыми авторским правом аналогами, и
как таковые соответствуют критериям добросовестного использования и честного
использования.
Все права защищены. Полное или частичное копирование материалов запрещено.
Согласование использования произведений или их фрагментов производится
с авторами и правообладателями. Согласованное использование материалов
возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое исполь-
зование материалов определяется действующим законодательством Украины.

Вам также может понравиться