2. Урок № 10
Списки.
Частина 2
ЗМІСТ
Ініціалізація корабля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Зоряне небо. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Спостереження за галактикою. . . . . . . . . . . . . . . . . . . . 12
Запуск ракети. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Захист від ворожих кораблів . . . . . . . . . . . . . . . . . . . . . 14
Матеріали уроку було прикріплено до даного PDF-файлу.
Щоби отримати доступ до матеріалів уроку, відкрийте його
в програмі Adobe Acrobat Reader.
3. Н
а сьогоднішньому уроці вас чекає цікава
пригода, під час якої ви зможете відчу-
ти себе справжнім капітаном космічного
корабля!
Перед нами стоїть завдання створити гру «Керу-
вання космічним кораблем». Уявіть, що ви – капітан
корабля (рис. 1).
Давайте напишемо програму, за допомогою якої ви
зможете поглянути на зірки, подорожувати галактикою,
випустити ракету і захиститися від космічних піратів.
Давайте уявимо загальну структуру гри і розгляне-
мо наведений в кінці уроку лістинг.
Рисунок 1
3
Списки. Частина 2
4. Ініціалізація корабля
Детально розберемо програму з Лістингу 1.
Для початку капітану необхідно увімкнути всі при-
бори і виконати ініціалізацію корабля (рис. 2).
Модуль time дозволяє використовувати метод
time.sleep(1). Таким чином ми зможемо виконати за-
тримку програми. Значення у дужках вимірюється в
секундах і зупиняє виконання коду на зазначений час.
Рисунок 2
4
Урок № 10
5. Якщо помістити модуль всередину циклу for, то можна
буде порядково виводити зображення ракети (рис. 3):
import time
print('Initialization...')
time.sleep(1)
ship = [
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
',
...
...
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
',]
for i in range(len(ship)):
print(ship[i])
time.sleep(.2)
Рисунок 3
5
Списки. Частина 2
6. Зверніть увагу, що в списку ship знаходиться
зображення у вигляді символів. Ми створили його за
допомогою онлайн-сервісу, який переводить картинки
в ASCII-код.
Схожих сервісів досить багато, відповідно, можете
використовувати будь-який, зручний для вас (напри-
клад, https://www.text-image.com/convert/ascii.html). В
результаті перетворення картинка стане ASCII-кодом
(рис. 4-5):
Рисунок 4
6
Урок № 10
7. У кожного апарату є свій індивідуальний номер.
Ідентифікаційний номер (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='')
Рисунок 5
7
Списки. Частина 2
8. Уявіть, що капітан бачить панель управління кора-
блем, але не розуміє, за що відповідає кожна з кнопок
(рис. 6).
Це недопустимо! Тому слід описати всі команди на
панелі і коротко пояснити, для чого потрібна кожна з
них:
print('''
Options:
[1] - stars
[2] - galaxy
[3] - missile
[4] - protection
[0] - exit
''')
Рисунок 6
8
Урок № 10
9. 9
Списки. Частина 2
1 – поглянути на зоряне небо і побачити своїми очима,
як народжуються зірки;
2 – почати подорож галактикою;
3 – випустити ракету;
4 – виконати захист від ворожих кораблів;
0 – закінчити виконання програми.
Така інструкція важлива в будь-якій програмі, інак-
ше інші користувачі просто не зрозуміють, що потрібно
робити.
Уявіть, капітан корабля виявився неуважним і почав
натискати всі кнопки підряд. Слід запобігти такій ситу-
ації, повідомивши, що введене значення неправильне:
while True:
if select == '1':...
elif select == '2':...
...
...
else:
print('Error! Try again')
Зоряне небо
Нарешті пригода починається! Перше, що ми про-
понуємо капітану, – полетіти у відкритий космос і по-
дивитися, як народжуються зірки. Ось тут і стане в
нагоді бібліотека turtle. Слід врахувати один важли-
вий момент: після закриття вікна за допомогою метода
10. 10
Урок № 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)
11. 11
Списки. Частина 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).
12. 12
Урок № 10
Спостереження за галактикою
Чи знаєте ви, як виглядає галактика? Капітану на-
шого корабля випала нагода подорожувати по ній (рис.
8)!
Рисунок 7
Рисунок 8
13. 13
Списки. Частина 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)
14. 14
Урок № 10
В списку missile зберігаємо зображення ракети
(рис. 9) у вигляді ASCII-коду і порядково його виводимо.
Захист від ворожих кораблів
Ви, як справжній капітан, повинні захистити свій
корабель від нападу космічних піратів. У цьому вам до-
поможе Грут з планети Х (рис. 10).
Як ви вже знаєте, ми переводимо потрібне зобра-
ження в ASCII-код і порядково виводимо його. В дано-
му випадку повторюємо цю процедуру.
Рисунок 9
15. 15
Списки. Частина 2
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)
Рисунок 10
16. 16
Урок № 10
Отже, на цьому уроці ми створили гру «Керування
космічним кораблем», завдяки якій кожен може
відчути себе капітаном космічного корабля!
18. 18
Урок № 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('ntDate: ', 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)
19. 19
Списки. Частина 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')