Similar presentations:
Программирование игр на языке Python (внеурочная деятельность), 2025
1. Программирование игр на языке Python (внеурочная деятельность) 34 часа
К.Ю. ПоляковПрограммирование игр на
языке Python
(внеурочная деятельность)
34 часа
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
2. Программирование игр на языке Python Быстрый старт
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
3. Что это?
3Программирование игр на языке Python
Что это?
turtle
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
4. Исполнитель Черепаха
4Программирование игр на языке Python
Исполнитель Черепаха
import turtle
# Импорт библиотеки
t = turtle.Turtle() # Создание черепашки
t.forward(100) # Движение вперед
t.left(90)
# Поворот налево
t.right(90)
# Поворот направо
turtle.done()
# Закончить работу
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
5. Что рисуем?
5Программирование игр на языке Python
Что рисуем?
первая буква вашего имени
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
6. Программирование игр на языке Python Цвет и скорость. Циклы
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
7. Повторение
7Программирование игр на языке Python
Повторение
import turtle
# Импорт библиотеки
t = turtle.Turtle() # Создание черепашки
t.forward(100) # Движение вперед
t.left(90)
# Поворот налево
t.right(90)
# Поворот направо
turtle.done()
# Закончить работу
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
8. Что сегодня?
8Программирование игр на языке Python
Что сегодня?
Научимся:
▪ изменять цвет
▪ управлять скоростью рисования
▪ поднимать и опускать перо
▪ рисовать разноцветные узоры
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
9. Цвет
9Программирование игр на языке Python
Цвет
«Цвет» по-английски?
color
t.color("red")
# Цвет Черепашки
t.pencolor("blue")
# Цвет линии
turtle.bgcolor("black") # Цвет фона
pen
© К.Ю. Поляков, 2025
background
http://kpolyakov.spb.ru
10. Некоторые цвета
10Программирование игр на языке Python
Некоторые цвета
red
blue
green
yellow
purple
orange
© К.Ю. Поляков, 2025
pink
white
black
gray
cyan
magenta
http://kpolyakov.spb.ru
11. Ещё цвета?
11Программирование игр на языке Python
Ещё цвета?
"alice blue", "antique white", "aqua", "aquamarine", "azure", "beige", "bisque", "black",
"blanched almond", "blue", "blue violet", "brown", "burlywood", "cadet blue", "chartreuse",
"chocolate", "coral", "cornflower blue", "cornsilk", "crimson", "cyan", "dark blue",
"dark cyan", "dark goldenrod", "dark gray", "dark green", "dark grey", "dark khaki",
"dark magenta", "dark olive green", "dark orange", "dark orchid", "dark red", "dark salmon",
"dark sea green", "dark slate blue", "dark slate gray", "dark slate grey", "dark turquoise",
"dark violet", "deep pink", "deep sky blue", "dim gray", "dim grey", "dodger blue", "firebrick",
"floral white", "forest green", "fuchsia", "gainsboro", "ghost white", "gold", "goldenrod",
"gray", "green", "green yellow", "grey", "honeydew", "hot pink", "indian red", "indigo", "ivory",
"khaki", "lavender", "lavender blush", "lawn green", "lemon chiffon", "light blue", "light coral",
"light cyan", "light goldenrod", "light goldenrod yellow", "light gray", "light green",
"light grey", "light pink", "light salmon", "light sea green", "light sky blue", "light slate blue",
"light slate gray", "light slate grey", "light steel blue", "light yellow", "lime", "lime green",
"linen", "magenta", "maroon", "medium aquamarine", "medium blue", "medium orchid",
"medium purple", "medium sea green", "medium slate blue", "medium spring green",
"medium turquoise", "medium violet red", "midnight blue", "mint cream", "misty rose",
"moccasin", "navajo white", "navy", "navy blue", "old lace", "olive", "olive drab", "orange",
"orange red", "orchid", "pale goldenrod", "pale green", "pale turquoise", "pale violet red",
"papaya whip", "peach puff", "peru", "pink", "plum", "powder blue", "purple", "red",
"rosy brown", "royal blue", "saddle brown", "salmon", "sandy brown", "sea green",
"seashell", "sienna", "silver", "sky blue", "slate blue", "slate gray", "slate grey", "snow",
"spring green", "steel blue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "violet red",
"wheat", "white", "white smoke", "yellow", "yellow green"
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
12. Новые команды управления Черепахой
12Программирование игр на языке Python
Новые команды управления Черепахой
t.speed(5)
t.speed(0)
t.penup()
t.pendown()
t.pensize(3)
© К.Ю. Поляков, 2025
# Скорость (1-10)
# Скорость – max!
# Поднять перо
# Опустить перо
# Толщина линии
http://kpolyakov.spb.ru
13. Окружность
13Программирование игр на языке Python
Окружность
t.circle(50)
# Окружность
# радиуса 50
▪ Рисование начинается с текущей
позиции.
▪ Окружность рисуется против
часовой стрелки.
▪ Возвращается в исходную точку
t.circle(-50)
© К.Ю. Поляков, 2025
# по часовой
http://kpolyakov.spb.ru
14. Цикл
14Программирование игр на языке Python
Цикл
повтори 10 раз
t.forward(50)
t.left(36)
так не
работает!
? Что нарисует?
? Как выполнить 10 раз?
0 1 2 3 4 5 6 7 8 9 10
храним в ячейке памяти
(в переменной)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
15. Цикл в Python
15Программирование игр на языке Python
Цикл в Python
счётчик в
переменной i
for i in range(10):
t.forward(50)
t.left(36)
# повтори 10 раз
отступ 2 или 4
символа
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
16. Практика
16Программирование игр на языке Python
Практика
1)
5)
2)
3)
4)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
17. Программирование игр на языке Python Списки
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
18. Повторение: новые команды
18Программирование игр на языке Python
Повторение: новые команды
t.color("red")
# Цвет Черепашки
t.pencolor("blue")
# Цвет линии
turtle.bgcolor("black") # Цвет фона
t.speed(5)
t.speed(0)
t.penup()
t.pendown()
t.pensize(3)
turtle.done()
© К.Ю. Поляков, 2025
# Скорость (1-10)
# Скорость – max!
# Поднять перо
# Опустить перо
# Толщина линии
# Закончить работу
http://kpolyakov.spb.ru
19. Повторение: циклы
19Программирование игр на языке Python
Повторение: циклы
for i in range(10):
t.forward(50)
t.left(72)
# повтори 10 раз
? Что нарисует?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
20. Окружности разного цвета?
20Программирование игр на языке Python
Окружности разного цвета?
("red")
t.pencolor("red")
t.circle(50)
t.penup()
t.forward(100)
t.pendown()
t.pencolor("green")
("green")
t.circle(50)
t.penup()
t.forward(100)
t.pendown()
? Что мешает
использовать цикл?
t.pencolor("blue")
("blue")
t.circle(50)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
21. Список цветов
21Программирование игр на языке Python
Список цветов
colors = ["red", "green", "blue"]
for c in colors:
t.pencolor(c)
t.circle(50)
t.penup()
t.forward(100)
t.pendown()
© К.Ю. Поляков, 2025
# для каждого цвета
# сначала c = "red"
http://kpolyakov.spb.ru
22. Новая команда
22Программирование игр на языке Python
Новая команда
t.backward(100)
© К.Ю. Поляков, 2025
# Назад на 100 шагов
http://kpolyakov.spb.ru
23. Практика
23Программирование игр на языке Python
Практика
все цвета разные
1)
2)
3)
4)
5 квадратов
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
24. Программирование игр на языке Python Списки. Обращение к элементу
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
25. Обращение к элементу списка
25Программирование игр на языке Python
Обращение к элементу списка
colors[0]
colors[1]
colors[2]
colors = ["red", "green", "blue"]
t.pencolor("red")
t.pencolor("green")
t.pencolor("blue")
t.pencolor(colors[0])
t.pencolor(colors[1])
t.pencolor(colors[2])
0, 1, 2
for i in range(3): # 3 раза
t.pencolor(colors[i])
colors[i]
...
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
26. Выбор из короткого списка
26Программирование игр на языке Python
Выбор из короткого списка
0, 1, 2, 3, 4, 5, …, 29
for i in range(30): # 30 раз
t.pencolor(colors[???])
t.circle(50)
0, 1, 2, 0, 1, 2, …
t.penup()
t.forward(100)
t.pendown()
? А если colors[i]?
© К.Ю. Поляков, 2025
нет colors[3]
http://kpolyakov.spb.ru
27. Сократить диапазон
27Программирование игр на языке Python
Сократить диапазон
i 0
c 0
1
1
range(30)
2 3 4 5 … 28 29
2 0 1 2 … 1 2
for i in range(30): # 30 раз
t.pencolor(colors[i???
% 3])
t.circle(50)
остаток от
t.penup()
деления на 3
t.forward(100)
t.pendown()
© К.Ю. Поляков, 2025
? Как?
http://kpolyakov.spb.ru
28. Практика
28Программирование игр на языке Python
Практика
только 3 цвета
1)
2)
20 линий
3)
4)
10 углов,
4 цвета
© К.Ю. Поляков, 2025
20 квадратов,
4 цвета
http://kpolyakov.spb.ru
29. Программирование игр на языке Python Случайность
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
30. Случайные явления и числа
30Программирование игр на языке Python
Случайные явления и числа
• встретил слона – не встретил слона
• жеребьёвка на соревнованиях
• лотерея
• случайная скорость (направление выстрела ) в игре
• …
Случайные числа — это последовательность чисел, в
которой невозможно предсказать следующее число,
даже зная все предыдущие.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
31. Случайный выбор цвета
31Программирование игр на языке Python
Случайный выбор цвета
подключение
библиотеки
import random
colors = ["red", "green", "blue"]
for i in range(10): # 10 раз
t.pencolor( random.choice(colors) )
t.circle(50)
? Что нарисует?
t.left(36)
? Почему 36 градусов?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
32. Практика
32Программирование игр на языке Python
Практика
5 цветов, случайный выбор
1)
2)
60 линий
60 кругов
3)
4)
20 углов
© К.Ю. Поляков, 2025
5)
8-угольники
(20 шт)
http://kpolyakov.spb.ru
33. Программирование игр на языке Python Процедуры
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
34. Много одинаковых фигур
34Программирование игр на языке Python
Много одинаковых фигур
rose()
rose()
rose()
rose()
? Как?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
35. Новая команда (процедура)
35Программирование игр на языке Python
Новая команда (процедура)
def rose
rose():
colors = ["red", "green", "blue"]
t.pendown()
for i in range(5):
t.pencolor( random.choice(colors) )
t.circle(50)
t.right(72)
t.penup()
? Что нарисует?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
36. Как использовать процедуру?
36Программирование игр на языке Python
Как использовать процедуру?
rose()
t.left(60)
t.forward(100)
rose()
t.right(120)
t.forward(100)
rose()
© К.Ю. Поляков, 2025
? Что нарисует?
http://kpolyakov.spb.ru
37. Как закрашивать области?
37Программирование игр на языке Python
Как закрашивать области?
import turtle
t = turtle.Turtle()
for i in range(4):
t.forward(100)
t.right(90)
turtle.done()
? Что нарисует?
? Как?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
38. Команды для закраски
38Программирование игр на языке Python
Команды для закраски
import turtle
t = turtle.Turtle()
t.fillcolor('red') # цвет заливки
t.begin_fill()
# начало контура
for i in range(4):
тут рисуем
t.forward(100)
контур
t.right(90)
t.end_fill()
# конец контура
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
39. Практика
39Программирование игр на языке Python
Практика
5 цветов, случайный выбор
1)
3)
© К.Ю. Поляков, 2025
2)
4)
http://kpolyakov.spb.ru
40. Программирование игр на языке Python Процедуры с параметрами
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
41. Процедуры, которые мы знаем
Программирование игр на языке Python41
Процедуры, которые мы знаем
def square():
t.pendown()
for i in range(4):
t.forward(100) ! Всегда 100!
t.right(90)
t.penup()
square()
? Что нарисует?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
42. Что хочется
42Программирование игр на языке Python
Что хочется
! Одной процедурой!
параметр
def square( size ):
t.pendown()
for i in range(4):
t.forward(size)
size
t.right(90)
t.penup()
square(100)
t.forward(150)
square(50)
t.forward(75)
square(25)
! Параметры – это данные, изменяющие
работу процедуры!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
43. Несколько параметров
43Программирование игр на языке Python
Несколько параметров
! Одной процедурой!
параметры
def square( size, color ):
t.pendown()
сначала – размер,
color
t.fillcolor(color)
потом – цвет
t.begin_fill()
for i in range(4):
t.forward(size)
size
t.right(90)
t.end_fill()
t.penup()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
44. Как вызывать такую процедуру?
Программирование игр на языке Python44
Как вызывать такую процедуру?
сначала – размер,
потом – цвет
square(100, "green")
t.forward(150)
square(50, "magenta")
t.forward(75)
square(25, "cyan")
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
45. Практика
45Программирование игр на языке Python
Практика
цвет – параметр процедуры
1)
3)
© К.Ю. Поляков, 2025
2)
4)
http://kpolyakov.spb.ru
46. Одна сложная задачка
46Программирование игр на языке Python
Одна сложная задачка
180 –
180 – 2
2
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
47. Одна сложная задачка
47Программирование игр на языке Python
Одна сложная задачка
def romb( size, a ):
t.pendown()
t.left( a )
for i in range(3):
t.forward( size )
t.right( 2*a )
t.forward( size )
t.right( 180-2*a )
t.left( 180-a )
t.penup()
! Добавьте заливку!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
48. Программирование игр на языке Python Переменные
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
49. Что мы уже знаем
49Программирование игр на языке Python
Что мы уже знаем
def square( size ):
t.pendown()
for i in range(4):
t.forward(size)
size
t.right(90)
t.penup()
это изменяемая
(переменная)
величина
square(100)
? Что нарисует?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
50. Как нарисовать?
50Программирование игр на языке Python
Как нарисовать?
colors = ["red", "green", "blue"]
for i in range(60):
t.color(random.choice(colors))
120
t.forward(120)
!
Длина должна
t.backward(120)
120
изменяться!
t.right(6)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
51. Вводим переменную
51Программирование игр на языке Python
Вводим переменную
colors = ["red", "green", "blue"]
L = 120 # присваивание значения
for i in range(60):
t.color(random.choice(colors))
t.forward(L)
L
! L – это переменная!
t.backward(L)
L
t.right(6)
? Что нарисует?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
52. Меняем переменную
52Программирование игр на языке Python
Меняем переменную
colors = ["red", "green", "blue"]
L = 120 # начальное значения
for i in range(60):
t.color(random.choice(colors))
t.forward(L)
t.backward(L)
изменение
t.right(6)
значения
переменной
L = L - 2
? Что нарисует?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
53. Как это происходит в Python?
53Программирование игр на языке Python
Как это происходит в Python?
Оперативная память
120
L
свободна
118
свободна
L
свободна
свободна
? Что если
L = 120
M = L – 2 ?
L = L – 2
L – 2
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
54. Практика
54Программирование игр на языке Python
Практика
1)
3)
© К.Ю. Поляков, 2025
2)
4)
http://kpolyakov.spb.ru
55. Программирование игр на языке Python Интерактивность
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
56. Интерактивность
56Программирование игр на языке Python
Интерактивность
! Интерактивность – это диалог (обмен
данными) между человеком и компьютером
во время работы программы!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
57. Вывод текста
Программирование игр на языке Python57
Вывод текста
print( "Привет!" )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
58. Вывод текста и переменной
58Программирование игр на языке Python
Вывод текста и переменной
name = "Федот"
print( "Привет,",
, name )
? Как добавить «!» в конце?
добавлен
пробел!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
59. Строки можно складывать!
Программирование игр на языке Python59
Строки можно складывать!
name = input( "Ваше имя: " )
+"!" )
print( "Привет,", name+"!"
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
60. Ввод чисел
60Программирование игр на языке Python
Ввод чисел
age = input( "Сколько тебе лет? " )
print( "Через 5 лет тебе будет ",
age + 5, "лет" )
TypeError: can only concatenate str (not "int")
to str
str – строка символов (string)
int – целое число (integer)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
61. Ввод чисел
61Программирование игр на языке Python
Ввод чисел
преобразовать в
целое число
age = int
int(input( "Сколько тебе лет? " ))
print( "Через 5 лет тебе будет ",
age + 5, "лет" )
? Что если ввести «Архип»?
ValueError: invalid literal for int()
with base 10: 'Архип'
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
62. Задание
62Программирование игр на языке Python
Задание
1) Диалог программы с человеком:
=== ПРОГРАММА-ЗНАКОМСТВО ===
Как тебя зовут? Петя
Сколько тебе лет? 14
Что ты любишь делать? играть в футбол
Привет, Петя!
Ты родился в 2011 году и ты любишь
играть в футбол.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
63. Задание
Программирование игр на языке Python63
Задание
2) Диалог программы с человеком:
=== ПРОСТОЙ КАЛЬКУЛЯТОР ===
Введи первое число (a): 7
Введи второе число (b): 5
a + b = 12
a – b = 2
a * b = 35
a в степени b
a ** b = 16807
a / b = 1.4
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
64. Программирование игр на языке Python Выбор вариантов
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
65. Выбор одного из двух вариантов
65Программирование игр на языке Python
Выбор одного из двух вариантов
if – если…
? Если age<14?
age = int(input( "Сколько тебе лет? " ))
if age >= 14:
блок
print( "Ты уже большой!" )
print( "У тебя есть паспорт!" )
if age < 14:
print( "У тебя пока нет паспорта..." )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
66. Выбор одного из двух вариантов
66Программирование игр на языке Python
Выбор одного из двух вариантов
Лучше так:
age = int(input( "Сколько тебе лет? " ))
if age >= 14:
if-блок
print( "Ты уже большой!" )
print( "У тебя есть паспорт!" )
else:
print( "У тебя пока нет паспорта..." )
if – если…
else – иначе…
! Между if-блоком и else не
else-блок
могут стоять другие команды!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
67. Символы сравнения
67Программирование игр на языке Python
Символы сравнения
if a >=
? b:
...
> – больше
< – меньше
>= – больше или равно
<= – меньше или равно
if a == b:
...
== – равно
if a != b:
...
!= – не равно
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
68. Как выбрать из трёх вариантов?
68Программирование игр на языке Python
Как выбрать из трёх вариантов?
Известно, сколько лет Андрею
(переменная a) и Борису (b).
Программа должна определить,
кто из них старше.
! Какие варианты?
1) Андрей старше (a > b)
2) Борис старше (a < b)
3) одного возраста (a == b)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
69. Как выбрать из трёх вариантов?
69Программирование игр на языке Python
Как выбрать из трёх вариантов?
a = int(input( "Возраст Андрея > " ))
b = int(input( "Возраст Андрея > " ))
if a > b:
print( "Андрей старше" )
if a < b:
print( "Борис старше" )
if a == b:
print( "Они одного возраста" )
? Можно с двумя if?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
70. Только два if
70Программирование игр на языке Python
Только два if
if a > b:
print( "Андрей старше" )
else:
if aa << b:
b:
if
print( "Борис
"Борис старше"
старше" ))
print(
else:
else:
print( "Они
"Они одного
одного возраста"
возраста" ))
print(
вложенный условный
оператор
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
71. Только два if
Программирование игр на языке Python71
Только два if
if a > b:
print( "Андрей старше" )
elif a < b:
print( "Борис старше" )
else:
print( "Они одного возраста" )
elif = elseif
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
72. Задание
72Программирование игр на языке Python
Задание
1) Программа определяет, положительно ли
введённое число
Введите число: 123
Это положительное число!
Введите число: 0
Это не положительное число!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
73. Задание
73Программирование игр на языке Python
Задание
2) Программа различает положительные числа,
отрицательные числа и 0
Введите число: 123
Это положительное число!
Введите число: -5
Это отрицательное число!
Введите число: 0
Это ноль!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
74. Задание
74Программирование игр на языке Python
Задание
3) Программа вводит отметку (число от 2 до 5) и
выводит её значение (слово)
Введите отметку: 5
Отлично!
Введите отметку: 3
Удовлетворительно.
Введите отметку: 123
Нет такой отметки!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
75. Задание
75Программирование игр на языке Python
Задание
4) Игра «Камень-ножницы-бумага»
Ход первого игрока: ножницы
Ход второго игрока: бумага
Игрок 1 победил! Ножницы режут бумагу!
Ход первого игрока: ножницы
Ход второго игрока: ножницы
Ничья!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
76. Программирование игр на языке Python Цикл с условием
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
77. Как устроиться на работу?
77Программирование игр на языке Python
Как устроиться на работу?
? Сколько резюме
нужно послать?
! Повторяем, пока не получим
предложение о работе («оффер»)!
пока не получили оффер:
послать(резюме)
© К.Ю. Поляков, 2025
while – пока…
http://kpolyakov.spb.ru
78. Игра «Угадай число»
78Программирование игр на языке Python
Игра «Угадай число»
Компьютер «задумывает» число от 0 до 10.
Человек пытается угадать его. Если угадал,
программа заканчивает работу.
Сохраняем случайное число в переменной
from random import randint
x = randint( 0, 10 )
Пока не ввели число, равное x
? Когда
while число != x:
остановится?
ввести число
сдвиг
блока
© К.Ю. Поляков, 2025
это «псевдокод»
(нельзя выполнить)
http://kpolyakov.spb.ru
79. Человек угадывает число
79Программирование игр на языке Python
Человек угадывает число
from random import randint
x = randint( 0, 10 )
? Что плохо?
guess = 1000
while guess != x:
input( "Ваше
число:
" ) " ))
guess = int(input(
"Ваше
число:
if guess == x:
print( "Вы угадали!" )
else:
print( "Вы не угадали. " )
? Как должна реагировать программа?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
80. Ещё одно решение
80Программирование игр на языке Python
Ещё одно решение
from random import randint
x = randint( 0, 10 )
guess = 1000
# вне отрезка [0; 10]
while guess != x:
guess = int(input( "Ваше число: " ))
if guess != x:
print( "Вы не угадали. " )
print( "Вы угадали!" )
? Что изменилось?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
81. Ещё одно решение
81Программирование игр на языке Python
Ещё одно решение
from random import randint
x = randint( 0, 10 )
guess = int(input( "Ваше число: " ))
while guess != x:
guess = int(input( "Ваше число: " ))
if guess != x:
print( "Вы не угадали. " )
print( "Вы угадали!" )
? Что изменилось?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
82. Задание
Программирование игр на языке Python82
Задание
1) Угадай число от 1 до 100
Я задумал число от 1 до 100.
Ваше число: 35
Неверно. Попробуйте ещё раз!
Ваше число: 56
Неверно. Попробуйте ещё раз!
Ваше число: 73
Угадали!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
83. Задание
83Программирование игр на языке Python
Задание
2) Угадай число от 1 до 100 с подсказкой.
Я задумал число от 1 до 100.
Ваше число: 35
Неверно. Моё число больше!
Попробуйте ещё раз!
Ваше число: 56
Неверно. Моё число меньше!
Попробуйте ещё раз!
Ваше число: 47
Угадали!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
84. Задание
84Программирование игр на языке Python
Задание
3) Угадай число от 1 до 100 с подсказкой и
подсчётом числа попыток.
Я задумал число от 1 до 100.
Ваше число: 35
Неверно. Моё число больше!
Попробуйте ещё раз!
Ваше число: 56
Неверно. Моё число меньше!
Попробуйте ещё раз!
Ваше число: 47
Угадали! Попыток: 3.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
85. Программирование игр на языке Python Выход из цикла
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
86. Задача
86Программирование игр на языке Python
Задача
Компьютер «задумывает» число от 1 до 100.
Человек пытается угадать его. Если угадал,
программа заканчивает работу.
Кроме того, программа заканчивает работу
после 5 неудачных попыток.
? Как считать неудачные попытки?
1) вводим переменную count
2) сначала count = 0
?
3) при вводе числа
count = count + 1
увеличить
на 1
или count += 1
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
87. Считаем попытки
87Программирование игр на языке Python
Считаем попытки
count = 0
while guess != x:
guess = int(input( "Ваше число: " ))
count += 1
увеличить на 1
if guess != x:
print( "Вы не угадали. " )
! count – это переменная-счётчик!
? Как разрешить не больше 5 попыток?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
88. Как выйти из цикла?
88Программирование игр на языке Python
Как выйти из цикла?
«истина»
! Это бесконечный цикл!
while True:
guess = int(input( "Ваше число: " ))
if guess == 5:
print( "Вы ввели число 5" )
break
break
закончить
цикл
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
89. Программа с бесконечным циклом
89Программирование игр на языке Python
Программа с бесконечным циклом
это не нужно
guess = 1000
while True
True:
guess = int(input( "Ваше число: " ))
if guess == x:
закончить цикл
break
break
print( "Вы не угадали. " )
print( "Вы угадали!" )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
90. Не более 5 попыток
90Программирование игр на языке Python
Не более 5 попыток
count = 0
while True:
guess = int(input( "Ваше число: " ))
count += 1
if guess == x: break
break
print( "Вы не угадали. " )
закончить
if count == 5:
цикл
break
print(
"Вы
)
if guess
==угадали!"
x:
print( "Вы угадали!" )
?
Что
плохо?
else:
print( "Вы не угадали за 5 попыток." )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
91. Другой вариант
91Программирование игр на языке Python
Другой вариант
count = 5
while True:
guess = int(input( "Ваше число: " ))
count -= 1
if guess == x: break
print( "Вы не угадали. " )
if count
count ==
== 00 :
? Что изменилось?
break
if guess == x:
print( "Вы угадали!" )
else:
print( "Вы не угадали за 5 попыток." )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
92. Задание
92Программирование игр на языке Python
Задание
1) Угадай число от 1 до 100 с подсказкой.
Не более 7 попыток.
Я задумал число от 1 до 100.
Ваше число: 35
Неверно. Моё число больше!
Попробуйте ещё раз!
Ваше число: 56
Неверно. Моё число меньше!
Попробуйте ещё раз!
Ваше число: 47
Угадали!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
93. Задание
93Программирование игр на языке Python
Задание
2) «Угадай животное». Не более 6 попыток.
Я задумал животное из этого списка:
лев, заяц, лиса, волк, коза, корова
Кто это? волк
Неверно. Попробуйте ещё раз!
Кто это? лиса
Неверно. Попробуйте ещё раз!
Кто это? коза
Угадали!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
94. Задание
94Программирование игр на языке Python
Задание
3) Сумматор до нуля. Программа вводит числа и
складывает их, пока не будет введён 0.
Ваше число: 35
Текущая сумма: 35
Ваше число: 56
Текущая сумма: 91
Ваше число: 0
Чисел в сумме: 2
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
95. Задание
95Программирование игр на языке Python
Задание
4) Сумматор. Программа вводит числа и
складывает их, пока не получит сумму 100 или
больше.
Ваше число: 35
Текущая сумма: 35
Ваше число: 56
Текущая сумма: 91
Ваше число: 19
Текущая сумма: 110
Чисел в сумме: 3
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
96. Программирование игр на языке Python Викторина (ещё раз про списки)
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
97. Еще раз про списки
97Программирование игр на языке Python
Еще раз про списки
questions = [
"Сколько будет 2+2?",
"Какой язык мы изучаем?",
"Вена – это столица какой страны?"
]
answers = [
"4",
"Python",
"Австрия"
]
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
98. Что можно делать со списком
98Программирование игр на языке Python
Что можно делать со списком
Добавить элемент
questions.append(
"Какое животное говорит 'му-у-у'?" )
answers.append( "корова" )
Обратиться к элементу
print( questions[0] ) # Сколько будет 2+2?
print( answers[1] )
# Python
Заменить элемент
answers[1] = "C++"
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
99. Перебор элементов списка
99Программирование игр на языке Python
Перебор элементов списка
Сколько будет 2+2?
Какой язык
мы изучаем?
Вена – это столица
какой страны?
Какое животное
говорит 'му-у-у'?
questions
for q in questions:
print( q )
Сколько будет 2+2?
Какой язык мы изучаем?
Вена – это столица какой страны?
Какое животное говорит 'му-у-у'?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
100. Перебор по индексам
100Программирование игр на языке Python
Перебор по индексам
0, 1, 2, 3
4
индекс
сколько раз
len – длина
(length)
for i in range( len(questions) ):
print( questions[i] )
questions[0]
Сколько будет 2+2?
Какой язык мы изучаем?
Вена – это столица какой страны?
Какое животное говорит 'му-у-у'?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
101. Викторина
101Программирование игр на языке Python
Викторина
for i in range( len(questions) ):
# вывести вопрос questions[ ii]
# ввести ответ answers[ii ]
# если ответ верный, увеличить счёт
# сообщить окончательный счёт
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
102. Викторина
102Программирование игр на языке Python
Викторина
for i in range( len(questions) ):
print( questions[i] )
ans = input()
реакция на
if ans == answers[i]:
print( "Правильно!" ) каждый ответ
else:
print( "К сожалению, неверно..." )
? Как подсчитать правильные ответы?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
103. Викторина с подсчетом
103Программирование игр на языке Python
Викторина с подсчетом
score
score == 00
for i in range( len(questions) ):
print( questions[i] )
ans = input()
if ans == answers[i]:
print( "Правильно!" )
score == score
score
score ++1 1
else:
print( "К сожалению, неверно..." )
print( "Ваш
) )
print(
"Ваш результат:",
результат:",score
score
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
104. Задание
104Программирование игр на языке Python
Задание
1) Своя викторина (3-4 вопроса и ответы). В
конце выводится счёт.
2) Своя викторина (3-4 вопроса и ответы), где
каждый вопрос имеет свою «стоимость» в
баллах. В конце выводится счёт.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
105. Программирование игр на языке Python Анимация
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
106. Как сделать анимацию?
106Программирование игр на языке Python
Как сделать анимацию?
Анимация — это быстрая смена изображений
(«кадров») на экране.
а)
б)
? Насколько быстрая?
© К.Ю. Поляков, 2025
в)
г)
≥ 16 кадров/c
http://kpolyakov.spb.ru
107. Перемещение шарика на фоне
107Программирование игр на языке Python
Перемещение шарика на фоне
Где-то сохранить:
выводим тут
• запомнить фон под
шариком
• нарисовать шарик
Переместить:
• восстановить фон под шариком (стереть)
• изменить координаты
• запомнить фон под новым местом
• нарисовать шарик
не нужно
запоминать!
? Если фон одноцветный?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
108. Анимации черепашки
108Программирование игр на языке Python
Анимации черепашки
import turtle
import time
# Библиотека для работы
# с таймером
t = turtle.Turtle()
for i in range(200):
t.forward(1)
# Двигаем черепашку
time.sleep(0.01) # Задержка 0,01 с
turtle.done()
целая и дробная части
числа разделяются
точкой!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
109. Анимации шарика
109Программирование игр на языке Python
Анимации шарика
import turtle
import time
# Библиотека для работы
# с таймером
ball = turtle.Turtle()
ball.shape("circle") # #форма
- круг
ball.shape("circle")
форма
- круг
ball.color("red")
# #цвет
- красный
ball.color("red")
цвет
- красный
ball.penup()
# #поднять
перо
ball.penup()
поднять
перо
for i in range(200):
ball.forward(1) # Двигаем шарик
time.sleep(0.01) # Задержка 0,01 с
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
110. Как определить координаты?
110Программирование игр на языке Python
Как определить координаты?
Y
(x,y)
x
(0,0)
ball.xcor()
ball.ycor()
y
X
print( ball.xcor(), ball.ycor() )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
111. Через цикл while
111Программирование игр на языке Python
Через цикл while
Настройка окна:
Переменная для
управления окном
window = turtle.Screen()
window.bgcolor( "gray" )
window.setup( 600, 400 )
# фон
# размеры
ball.color( "red" )
while
while ball.xcor()
ball.xcor() << 200:
200:
ball.forward(1)
# Двигаем шарик
time.sleep(0.01) # Задержка 0,01 с
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
112. Переброска шарика в нужную точку
112Программирование игр на языке Python
Переброска шарика в нужную точку
ball.setx(150)
ball.sety(120)
Y
150
120
© К.Ю. Поляков, 2025
X
http://kpolyakov.spb.ru
113. Задание
113Программирование игр на языке Python
Задание
1) Установите размер экрана 580 на 580,
зелёный цвет фона. Шарик белого цвета
движется от левой границы экрана до правой.
Программа заканчивает работу, когда шарик
упирается в левую границу окна.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
114. Задание
114Программирование игр на языке Python
Задание
2) Два шарика едут с одинаковой скоростью:
один справа налево, второй – снизу вверх.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
115. Задание
115Программирование игр на языке Python
Задание
3) Ещё два шарика едут по диагоналям. Все 4
должны остановиться в конце на краю поля.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
116. Программирование игр на языке Python Управление клавишами
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
117. Окно «слушает» клавиатуру
117Программирование игр на языке Python
Окно «слушает» клавиатуру
window = turtle.Screen()
def moveUp():
... # что делать при нажатии ↑
def moveDown():
... # что делать при нажатии ↓
window.listen() # Начинаем слушать
window.onkey( moveUp, "Up" ) # вверх
window.onkey( moveDown, "Down" ) # вниз
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
118. Как изменять координаты
118Программирование игр на языке Python
Как изменять координаты
def moveUp(): # что делать при нажатии ↑
y = player.ycor()
player.sety( y + 10 )
def moveDown(): # при нажатии ↓
y = player.ycor()
player.sety( y - 10 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
119. Обозначения клавиш
119Программирование игр на языке Python
Обозначения клавиш
Стрелки:
"Up", "Down", "Left", "Right"
Спецклавиши: "space" (пробел), "Escape",
"Return" (Enter), "Backspace"
Функциональные: "F1" … "F12"
Цифры: "0" … "9"
Буквы: "a" … "z", "A" … "Z"
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
120. Задание
120Программирование игр на языке Python
Задание
1) Установите размер экрана 600 на 600, синий
цвет фона. Квадрат белого цвета управляется
клавишами-стрелками. В начале квадрат
находится в правом нижнем углу экрана.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
121. Задание
121Программирование игр на языке Python
Задание
2) В начале квадрат находится в центре экрана.
При движении он не может выйти за пределы
экрана.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
122. Задание
122Программирование игр на языке Python
Задание
3) Два квадрата разного цвета управляются
разными клавишами. При движении они не могут
выйти за пределы экрана.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
123. Программирование игр на языке Python Управление «по требованию». Игра «Змейка»
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
124. Что такое управление «по требованию»?
124Программирование игр на языке Python
Что такое управление «по требованию»?
При нажатии клавиши управления Змейка
изменяет режим движения, в остальное время
двигается так же, как и раньше.
? Как запомнить, куда двигаться?
# Голова змейки
! Переменная,
связанная с
head = turtle.Turtle()
объектом –
head.shape("square")
свойство!
head.color("white")
direction
head.penup()
направление:
head.dir = "stop"
"up", "down",
"left", "right"
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
125. Функция «движение»
125Программирование игр на языке Python
Функция «движение»
def move():
if head.dir == "up":
размер
y = head.ycor()
20 20
head.sety(y + 20)
elif head.dir == "down":
y = head.ycor()
head.sety(y - 20)
... # самостоятельно влево и вправо
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
126. Основной цикл
126Программирование игр на языке Python
Основной цикл
window = turtle.Screen()
window.bgcolor( "black" )
window.setup( 580, 580 )
window.tracer( 0 )
...
Когда закончится цикл?
?
while True:
move() # двигаем Змейку
window.update()
# обновляем окно
time.sleep( 0.1 ) # ждём 0,1 с
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
127. Изменение направления
127Программирование игр на языке Python
Изменение направления
def up():
head.dir = "up"
def down():
head.dir = "down"
# Привязка клавиш
window.listen()
window.onkey( up, "Up" )
window.onkey( down, "Down" )
... # самостоятельно влево и вправо
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
128. Выход по Esc
Программирование игр на языке Python128
Выход по Esc
def escape():
head.dir = "exit"
window.onkey( escape, "Escape" )
...
while head.dir != "exit":
move()
window.update()
time.sleep( 0.1 )
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
129. Задание
129Программирование игр на языке Python
Задание
1) Установите размер экрана 580 на 580, чёрный
цвет фона. Квадрат белого цвета управляется
клавишами-стрелками. Соберите программу
движения Змейки.
2) Сделайте так, чтобы Змейка не могла выйти
за пределы поля.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
130. Программирование игр на языке Python Змейка с хвостом
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
131. Змейка из трёх квадратов
131Программирование игр на языке Python
Змейка из трёх квадратов
20 20
head
tail1
tail2
head = turtle.Turtle()
head.shape("square")
head.color("yellow")
head.penup()
head.dir = "stop"
tail1 = turtle.Turtle()
tail1.shape("square")
tail1.color("darkgreen")
tail1.penup()
tail1.sety( -20 )
© К.Ю. Поляков, 2025
это не простая
переменная, а
свойство объекта
head!
? tail2?
http://kpolyakov.spb.ru
132. Движение змейки
132Программирование игр на языке Python
Движение змейки
head
tail1
tail2
? Куда движется
head?
в направлении
head.dir
© К.Ю. Поляков, 2025
tail1.setx(head.xcor())
tail1.sety(head.ycor())
x1 = tail1.xcor()
y1 = tail1.ycor()
tail2.setx( x1 )
tail2.sety( y1 )
? В каком порядке
передвигать?
tail2
tail1
head
http://kpolyakov.spb.ru
133. Движение целой змейки
Программирование игр на языке Python133
Движение целой змейки
def move():
if head.dir != "stop":
tail2.setx( tail1.xcor() )
tail2.sety( tail1.ycor() )
tail1.setx( head.xcor() )
tail1.sety( head.ycor() )
... # тут всё, как раньше:
# двигаем head <- head.dir
? Почему сначала tail2?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
134. Задание
134Программирование игр на языке Python
Задание
1) Сделайте Змейку из трёх звеньев.
2) Сделайте Змейку из четырёх звеньев разного
цвета.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
135. Программирование игр на языке Python Список для хвоста змейки
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
136. Список из звеньев змейки
136Программирование игр на языке Python
Список из звеньев змейки
head
tail1
tail2
список
0
1
2
snake = [head, tail1, tail2]
snake[0]
© К.Ю. Поляков, 2025
snake[1]
индексы
snake[2]
http://kpolyakov.spb.ru
137. Движение змейки
137Программирование игр на языке Python
Движение змейки
0
1
2
snake = [head, tail1, tail2]
tail2.setx(tail1.xcor())
tail2.sety(tail1.ycor())
двигаем
tail2
snake[2].setx(snake[1].xcor())
snake[2].sety(snake[1].ycor())
tail1.setx(head.xcor())
tail1.sety(head.ycor())
двигаем
tail1
snake[1].setx(snake[0].xcor())
snake[1].sety(snake[0].ycor())
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
138. Движение змейки – цикл по всем звеньям
138Программирование игр на языке Python
Движение змейки – цикл по всем звеньям
i=2
i-1
snake[2].setx(snake[1].xcor())
snake[2].sety(snake[1].ycor())
i=1
двигаем
tail2
i-1
snake[1].setx(snake[0].xcor())
snake[1].sety(snake[0].ycor())
двигаем
tail1
! Различие только в индексах!
изменение i: 2, 1 (в обратном порядке)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
139. Цикл «в обратном порядке»
139Программирование игр на языке Python
Цикл «в обратном порядке»
N = 5
for i in range(N):
print( i )
? Что напечатает?
N = 4
for i in range(N,0,-1):
print( i )
© К.Ю. Поляков, 2025
0
1
2
3
4
4
3
2
1
от 0 до N-1
от N до 1
http://kpolyakov.spb.ru
140. Движение змейки
140Программирование игр на языке Python
Движение змейки
snake[2].setx(snake[1].xcor())
snake[2].sety(snake[1].ycor())
snake[1].setx(snake[0].xcor())
snake[1].sety(snake[0].ycor())
3
N = len(snake)
for i in range(N-1, 0, -1):
snake[i].setx(snake[i-1].xcor())
snake[i].sety(snake[i-1].ycor())
2
© К.Ю. Поляков, 2025
!
1
1
0
Для любой длины змейки!
http://kpolyakov.spb.ru
141. Еда для Змейки
Программирование игр на языке Python141
Еда для Змейки
food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("red")
food.penup()
food.goto(0, 100) # еда здесь
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
142. Змейка ест еду
142Программирование игр на языке Python
Змейка ест еду
ближе 20 пикс
def checkFood():
if head.distance(food) < 20:
x = random.randint(-280, 280) в другое
место
y = random.randint(-280, 280)
food.goto(x, y)
new = turtle.Turtle()
ещё одно
new.speed(0)
звено
new.shape("square")
new.color("darkgreen")
new.penup()
добавить в
список
snake.append(new)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
143. Изменения в основном цикле
Программирование игр на языке Python143
Изменения в основном цикле
...
while head.dir != "exit":
checkFood()
checkFood()
move()
window.update()
time.sleep( 0.1 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
144. Задание
144Программирование игр на языке Python
Задание
1) Запустите программу, где Змейка есть еду и
удлиняется.
2) Сделайте, чтобы Змейка была разноцветной.
Названия тёмных цветов начинаются с “dark”.
3) Сделайте, чтобы на поле было две порции
еды.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
145. Программирование игр на языке Python Счёт в игре
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
146. Счёт и дисплей для него
146Программирование игр на языке Python
Счёт и дисплей для него
текущий
счёт
лучший
счёт
score = best = 0
display = turtle.Turtle()
display.hideturtle() # скрыть Черепаху
display.goto( 0, 250 ) # центр текста
display.color( "white" ) # цвет текста
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
147. Вывод информации на дисплей
147Программирование игр на языке Python
Вывод информации на дисплей
текущий
счёт
лучший
счёт
def showScore():
display.clear() # очистить дисплей
display.write(
f"Счет: {score} Рекорд: {best}",
align="center",
font=("Courier", 24) )
showScore() # вывести начальный счёт
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
148. Изменение счёта
148Программирование игр на языке Python
Изменение счёта
? В какой момент изменяется счёт?
def checkFood():
if head.distance(food) < 20:
...
глобальные
snake.append(new)
переменные
global score, best
score += 10
best = max( best, score )
showScore()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
149. Завершение игры
149Программирование игр на языке Python
Завершение игры
Попытка заканчивается, когда
1) Змейка пересекает сама себя.
2) Змейка выходит за границы поля
? Что делать в этом случае?
1) От Змейки оставить только голову, остальные
звенья удалить.
2) Поставить Змейку в начальное положение
(0,0).
3) Счёт = 0.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
150. Завершение игры
150Программирование игр на языке Python
Завершение игры
def checkError():
x = head.xcor()
y = head.ycor()
# проверка выхода за границы
if x < -280 or x > 280 or \
перенос на
y < -280 or y > 280:
следующую
строку
restart()
restart()
# проверка самопересечения
for t in snake[1:]: # кроме головы
if head.distance(t) < 20:
restart()
restart()
break
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
151. Перезапуск игры
151Программирование игр на языке Python
Перезапуск игры
def restart():
global snake, score
time.sleep(1)
# ждем 1 с
head.goto(0, 0)
# голову в (0,0)
head.dir = "stop"
удаляем все,
for t in snake[1:]:
кроме головы
t.setx(1000)
t.sety(1000) # за границы поля
del t
# удалить
snake = [head]
score = 0
# обновить счёт
showScore()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
152. Изменения в основном цикле
Программирование игр на языке Python152
Изменения в основном цикле
...
while head.dir != "exit":
checkFood()
checkError()
move()
window.update()
time.sleep( 0.1 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
153. Задание
153Программирование игр на языке Python
Задание
1) Соберите программу, где счёт увеличивается
после того, как Змейка съела еду.
2) Сделайте так, чтобы при ошибке
(самопересечении или выходе за границы
поля) начиналась новая попытка.
3) Сделайте так, чтобы при выходе за границы
поля змейка появлялась с другой стороны.
4) Сделайте так, чтобы при рестарте программы
длина змейки была равна 3.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
154. Программирование игр на языке Python Игра «Жизнь» (Game of Life)
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
155. Игра «Жизнь» (Game of Life)
155Программирование игр на языке Python
Игра «Жизнь» (Game of Life)
Дж. Конвей, 1970 г.
Клетка зарождается,
если ровно 3 соседа.
?
Клетка выживает,
если 2 или 3 соседа.
?
?
?
?
?
?
?
Клетка погибает от
одиночества, если
< 2 соседей.
Клетка погибает от
перенаселения, если
> 3 соседей.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
156. Окно для игры
156Программирование игр на языке Python
Окно для игры
import turtle
window = turtle.Screen()
window.title( "Игра Жизнь" )
window.bgcolor( "white" )
window.setup( width=600, height=600 )
window.tracer(0)
... # здесь drawGrid и другие процедуры
drawGrid()
# рисуем поле
window.mainloop() # запуск игры
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
157. Как храним данные
157Программирование игр на языке Python
Как храним данные
HEIGHT
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
переменная
grid
WIDTH
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
158. Размеры поля grid
158Программирование игр на языке Python
Размеры поля grid
константы
(постоянные)
WIDTH = 20
HEIGHT = 20
SIZE = 20
# ширина
# высота
# размер клетки в пикселях
Левый верхний угол поля
x0 = - WIDTH*SIZE / 2
y0 = HEIGHT*SIZE / 2
© К.Ю. Поляков, 2025
(x0, y0)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
(0,0 0)
http://kpolyakov.spb.ru
159. Таблица grid
159Программирование игр на языке Python
Таблица grid
Можно так (но плохо):
grid = [ [0, 0, 0, …, 0],
[0, 0, 0, …, 0]
...
[0, 0, 0, …, 0]
]
Лучше так:
это одна
строка
grid = [ [0]*WIDTH
for row in range(HEIGHT) ]
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
160. Создаем Черепаху, которая рисует
160Программирование игр на языке Python
Создаем Черепаху, которая рисует
t = turtle.Turtle()
t.speed(0)
t.penup() # без следа
t.hideturtle()
включим след,
когда нужно
скрыть
Черепаху
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
161. Рисуем одну ячейку
161Программирование игр на языке Python
Рисуем одну ячейку
def drawCell( row, col,
isAlive ):
x = x0 + col*SIZE
y = y0 - row*SIZE
t.goto(x, y)
...
col
0
1
2
3
4
5
6
7
8
9
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
2
0
0
0
1
0
0
0
0
0
0
3
0
0
1
1
1
0
0
0
0
0
4
0
0
0
1
1
0
0
0
0
0
row 5
0
0
0
0
0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
0
0
7
0
0
0
0
0
0
0
0
0
0
row – строка
8
0 0 0 0 0 0 0 0 0 0
9
0 0 0 0 0 0 0 0 0 0
col – столбец
isAlive = 0 – клетка мертва
isAlive = 1 – клетка жива
(x, y) – левый верхний угол клетки
? Куда смотрит Черепаха?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
162. Рисуем одну ячейку (продолжение)
162Программирование игр на языке Python
Рисуем одну ячейку (продолжение)
def drawCell( row, col,
isAlive ):
...
t.pendown()
t.fillcolor(
"black" if isAlive
else "white" )
t.begin_fill()
for i in range(4):
t.forward( SIZE )
t.right(90)
t.end_fill()
t.penup()
© К.Ю. Поляков, 2025
col
0
1
2
3
4
5
6
7
8
9
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
2
0
0
0
1
0
0
0
0
0
0
3
0
0
1
1
1
0
0
0
0
0
4
0
0
0
1
1
0
0
0
0
0
row 5
0
0
0
0
0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
0
0
7
0
0
0
0
0
0
0
0
0
0
8
0
0
0
0
0
0
0
0
0
0
9
0
0
0
0
0
0
0
0
0
0
http://kpolyakov.spb.ru
163. Рисуем всё поле
163Программирование игр на языке Python
Рисуем всё поле
цикл по всем
строкам
цикл по всем
столбцам
def drawGrid():
for row in range(HEIGHT):
for col in range(WIDTH):
drawCell( row, col, grid[row][col] )
рисуем одну
ячейку
© К.Ю. Поляков, 2025
это данные из
таблицы
http://kpolyakov.spb.ru
164. Задание
164Программирование игр на языке Python
Задание
1) Соберите программу, которая рисует поле.
2) Попробуйте изменить размер поля и клеток,
как вам больше нравится.
3) Выберите другой цвет для живой клетки
(вместо чёрного).
4) Попробуйте сделать рисунок на поле,
заполняя единицами нужные ячейки таблицы:
grid[10][5] = 1
grid[10][6] = 1
...
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
165. Программирование игр на языке Python Щелчки мышью
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
166. Щелчки мышью
166Программирование игр на языке Python
Щелчки мышью
1) Определить координаты точки, где щёлкнули
(x, y)
2) Если попали мимо поля, ничего не делаем.
3) Определили координаты ячейки, по которой
щелкнули (строку row, столбец col)
4) Изменить состояние ячейки
1→0
0→1
© К.Ю. Поляков, 2025
? Где?
в таблице
grid
http://kpolyakov.spb.ru
167. Процедура-обработчик щелчка
167Программирование игр на языке Python
Процедура-обработчик щелчка
def onClick( x, y ):
... # содержание дальше
window.listen()
window.onscreenclick( onClick, btn=1 )
щелчок мышь
по экрану
© К.Ю. Поляков, 2025
1 – левая
кнопка мыши
http://kpolyakov.spb.ru
168. Координаты ячейки
168Программирование игр на языке Python
Координаты ячейки
def onClick( x, y ):
row = int( (y0 - y) // SIZE )
col = int( (x - x0) // SIZE )
...
? Как понять, что
(x0, y0)
© К.Ю. Поляков, 2025
col
0
1
2
3
4
5
6
7
8
9
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
2
0
0
0
1
0
0
0
0
0
0
3
0
0
1
1
1
0
0
0
4
0
0
0
1
1
0
0
0
0 0y)
(x,
row 5
0
0
0
0
0
0
0
6
0
0
0
0
0
0
7
0
0
0
0
0
8
0
0
0
0
9
0
0
0
0
не попали?
row < 0
row > HEIGHT
col < 0
col > WIDTH
x – x0
y0 – y
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
http://kpolyakov.spb.ru
169. Координаты ячейки
169Программирование игр на языке Python
Координаты ячейки
def onClick( x, y ):
row = int( (y0 - y) // SIZE )
col = int( (x - x0) // SIZE )
0→1
if 0 <= row < HEIGHT and \
1→0
0 <= col < WIDTH:
grid[row][col] = 1 - grid[row][col]
drawCell( row, col, grid[row][col] )
сразу
перерисовать
ячейку
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
170. Очистка поля
170Программирование игр на языке Python
Очистка поля
def clearField():
global grid
...
? Что тут?
drawGrid()
window.listen()
window.onscreenclick( onClick, btn=1 )
window.onkey( clearField, 'c' )
при нажатии
клавиши «с»
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
171. Задание
171Программирование игр на языке Python
Задание
1) Сделайте так, чтобы состояние клеток поля
можно было изменять щелчками мышкой.
2) Добавьте процедуру очистки поля по клавише
«c».
3) Добавьте процедуру, которая заполняет все
поле живыми клетками при нажатии клавиши
«f».
4) *Добавьте процедуру, которая заполняет все
поле живыми клетками в шахматном порядке
при нажатии клавиши «x».
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
172. Программирование игр на языке Python Следующее поколение
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
173. Переход к следующему поколению
173Программирование игр на языке Python
Переход к следующему поколению
1) Клетка зарождается, если ровно 3 соседа.
2) Живая клетка выживает, если у нее
2 или 3 соседа.
? Какие проблемы на краях?
?
?
?
?
?
?
?
?
Для каждой клетки:
1) Найти число соседей k
2) Если клетка = 0 и k = 3, то клетка = 1.
3) Если клетка = 1 и (k < 2 или k > 3),
то клетка = 0.
grid[row][col]
? Что изменить?
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
174. Жива ли клетка?
174Программирование игр на языке Python
Жива ли клетка?
def isAlive( row, col ):
if 0 <= row < HEIGHT and \
0 <= col < WIDTH:
return grid[row][col]
else:
return 0
если эта клетка
клетка внутри
поля, то …
вне поля, то 0
! Решили проблему с краями!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
175. Сколько соседей?
175Программирование игр на языке Python
Сколько соседей?
def neighbors( row, col ):
count = isAlive( row-1, col-1 ) + \
isAlive( row-1, col ) + \
isAlive( row-1, col+1 ) + \
isAlive( row, col-1 ) + \
...
return count
col-1 col col+1
row-1 ? ? ?
row
?
row+1
?
© К.Ю. Поляков, 2025
?
?
! Длинно и
некрасиво!
?
http://kpolyakov.spb.ru
176. Сколько соседей?
176Программирование игр на языке Python
Сколько соседей?
def neighbors( row, col ):
по всем 9
клеткам
count = 0
for r in range(row-1, row+2):
for c in range(col-1, col+2):
count += isAlive( r, c )
return count - isAlive(row, col)
col-1 col col+1
row-1 ? ? ?
row
?
row+1
?
© К.Ю. Поляков, 2025
1, если клетка жива,
или 0, если нет
?
?
?
http://kpolyakov.spb.ru
177. Следующее поколение
177Программирование игр на языке Python
Следующее поколение
цикл по всем
def nextGeneration():
строкам
global grid
for row in range(HEIGHT):
цикл по всем
столбцам
for col in range(WIDTH):
k = neighbors( row, col )
if grid[row][col] == 1:
клетка
if not(2 <= k <= 3):
жива
grid[row][col] = 0
клетка не жива
elif k == 3:
и 3 соседа
grid[row][col] = 1
? Что плохо?
© К.Ю. Поляков, 2025
таблица
меняется
неверно
определяем
соседей
http://kpolyakov.spb.ru
178. Новая таблица newGrid
178Программирование игр на языке Python
Новая таблица newGrid
заполняем новую
def nextGeneration():
таблицу нулями
global grid
newGrid = [ [0]*WIDTH
for row in range(HEIGHT) ]
...
# строим новую таблицу
grid = newGrid
заменяем старую
drawGrid()
таблицу новой
перерисовываем
сетку на поле
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
179. Строим новую таблицу
179Программирование игр на языке Python
Строим новую таблицу
def nextGeneration():
двойной цикл по
...
всем ячейкам
for row in range(HEIGHT):
for col in range(WIDTH):
k = neighbors( row, col )
if grid[row][col] == 1:
клетка
if 2 <= k <= 3:
жива
newGrid[row][col] = 1
newGrid[row][col]
клетка не
elif k == 3:
жива и 3
newGrid[row][col] = 1
newGrid[row][col]
соседа
...
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
180. Задание
180Программирование игр на языке Python
Задание
1) Сделайте так, чтобы процедура
newGeneration срабатывала при нажатии на
клавишу «пробел».
2) Сделайте так, чтобы при нажатии на клавишу
«m» поле «переживало» сразу 5 поколений.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
181. Программирование игр на языке Python Сохранение поля
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
182. Загрузка и сохранение поля
182Программирование игр на языке Python
Загрузка и сохранение поля
1) При нажатии клавиши «s» (Save…)
сохраняем состояние поля в файле life.sav.
2) При нажатии «l» (Load…) программа
загружает состояние поля из файла life.sav.
[[1, 1, 0, ..., 0],
[0, 1, 1, ..., 0],
[0, 0, 1, ..., 0],
...
]
в файле будет всё в
одну строчку
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
183. Как записать в файл?
183Программирование игр на языке Python
Как записать в файл?
открыть файл
работа с файлом
закрыть файл
"r" - чтение
"w" – запись
"a" – добавление
fileName = "life.sav"
with open( fileName, "w" ) as F:
файловый
file=F )
print( "Привет!", file=F
объект
...
файл закроется
автоматически
© К.Ю. Поляков, 2025
вывод в
файл
http://kpolyakov.spb.ru
184. Сохранение таблицы
184Программирование игр на языке Python
Сохранение таблицы
def saveGrid():
global grid
fileName = "life.sav"
with open( fileName, "w" ) as F:
print( grid, file=F )
print( f"Файл {fileName} сохранён." )
window.listen()
...
window.onkey( saveGrid, 's' )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
185. Загрузка таблицы
185Программирование игр на языке Python
Загрузка таблицы
def loadGrid():
global grid
чтение
fileName = "life.sav"
with open( fileName, "r" ) as F:
все данные
grid
grid == eval(
eval( F.read()
F.read() ))
файла
drawGrid()
print( f"Файл {fileName} загружен." )
window.onkey( loadGrid, 'l' )
! Данные должны быть
правильные!
© К.Ю. Поляков, 2025
? А если нет?
http://kpolyakov.spb.ru
186. Обработка ошибок (исключения)
186Программирование игр на языке Python
Обработка ошибок (исключения)
def loadGrid():
global grid
fileName = "life.sav"
try: # попытаться сделать...
... # загружаем данные из файла
drawGrid()
print( f"Файл {fileName} загружен." )
except: # если произошла ошибка...
print( f"Не удалось загрузить "
f"файл {fileName}." )
! «Исключение» – ошибка во время работы!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
187. Сообщение на экране
Программирование игр на языке Python187
Сообщение на экране
дисплей –
это тоже
Черепаха
display = turtle.Turtle()
display.penup()
display.hideturtle()
display.speed( 0 )
display.goto( 0, -290 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
188. Сообщение на экране
188Программирование игр на языке Python
Сообщение на экране
def showInfo( s ):
display.clear()
display.write( s, align="center",
font=("Courier", 16) )
Вместо
print( f"..." )
используем
showInfo( f"..." )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
189. Запрос имени файла
189Программирование игр на языке Python
Запрос имени файла
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from pathlib import Path
для записи
Вместо
fileName = "life.sav"
используем
для чтения
fileName = askopenfilename (
filetypes = [ ("Файлы SAV", "*.sav"),
("Все файлы", "*.*") ] )
if fileName: # если имя не пустое!
... # здесь выполняем чтение/запись файла
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
190. Обработка имени файла
190Программирование игр на языке Python
Обработка имени файла
fileName = askopenfilename ( ... )
fileName = asksaveasfilename ( ... )
! Получаем полное имя файла!
D:\Works\Games\Life\life1.sav
не хватает
места
showInfo( f"Файл {fileName} загружен." )
Получить только само имя:
fileName = Path(fileName).name
showInfo( f"Файл {fileName} загружен." )
всё хорошо
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
191. Задание
191Программирование игр на языке Python
Задание
1) Сделайте так, чтобы состояние поля можно
было сохранить в файле life.sav и
восстановить из него.
2) Добавьте информационную строку внизу
окна.
3) Добавьте обработку ошибок (при неверных
данных в файле программа не должна
завершаться аварийно).
4) Добавьте возможность выбора файла с
помощью диалогового окна.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
192. Программирование игр на языке Python Объекты и классы
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
193. Что такое объект?
193Программирование игр на языке Python
Что такое объект?
Объект – это что-то, имеющее границы. Объект
можно выделить из окружающей среды.
• человек, собака, кошка
• ручка, тетрадь, портфель
• машина, самолёт, корабль
•…
Можно сказать
•как он выглядит?
•из чего состоит?
•что умеет делать (что с ним можно
делать?)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
194. Что такое класс?
194Программирование игр на языке Python
Что такое класс?
Класс – это описание общих свойств группы
объектов.
Класс «автомобиль»
• имеет кузов, двигатель, колеса, руль, …
• можно ездить вперёд и назад, …
Объекты класса «автомобиль»:
! Класс – «чертёж» (шаблон), по которому
можно создавать объекты этого класса.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
195. Класс и объект в программе
195Программирование игр на языке Python
Класс и объект в программе
Класс «Мяч»
class Ball:
описание
класса
pass
print( Ball )
<class '__main__.Ball'>
b = Ball()
print( b )
создание
объекта
<__main__.Ball object at 0x0000005F>
адрес в
памяти
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
196. Свойства – то, что у него есть
Программирование игр на языке Python196
Свойства – то, что у него есть
class Ball:
x = 0
свойства
y = 0
создаём объект
b = Ball()
print( b.x, b.y )
0 0
b.x = 100
меняем свойства
b.y = 200
print( b.x, b.y )
100 200
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
197. Методы – то, что он умеет
197Программирование игр на языке Python
Методы – то, что он умеет
class Ball:
x = 0
используем
метод
y = 0
свойства
def say(
say( self
self ):
):
def
print( f"Я
f"Я вв точке
точке ({self.x},{self.y})"
({self.x},{self.y})" ))
print(
! Self – это слово для обращения к свойствам
объекта, который вызвал метод.
b = Ball()
b.say()
Я в точке(0,0)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
198. Метод __init__ (конструктор)
198Программирование игр на языке Python
Метод __init__ (конструктор)
конструктор
class Ball:
def __init__( self, x0, y0 ):
self.x = x0
self.y = y0
def say( self ):
print( f"Я в точке ({self.x},{self.y})" )
! Конструктор – это метод, который
вызывается при создании объекта
b = Ball( 20, 150 )
b.say()
# Я в точке (20, 150)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
199. Значения по умолчанию
Программирование игр на языке Python199
Значения по умолчанию
class Ball:
def __init__( self, x0=0,
x0=0, y0=0
y0=0 ):
self.x = x0
если не
self.y = y0
указать…
...
b = Ball( 20, 150 )
b.say()
# Я в точке (20, 150)
b2 = Ball()
b2.say()
# Я в точке (0, 0)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
200. Задание
200Программирование игр на языке Python
Задание
1) Постройте класс Попугай (Parrot), который умеет говорить
какую-то фразу, заранее определённую при описании
класса.
Пример:
p = Parrot()
p.say()
Привет, друзья!
2) Измените класс так, чтобы фраза задавалась при создании
конкретного экземпляра.
Пример:
p1 = Parrot( "Гав!" )
p2 = Parrot( "Мяу!" )
p1.say()
Гав!
p2.say()
Мяу!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
201. Задание
201Программирование игр на языке Python
Задание
3) Измените класс так, чтобы фразу можно было изменять во
время работы программы.
Пример:
p = Parrot( "Гав!" )
p.say()
Гав!
p.newText( "Мяу!" )
p.say()
Мяу!
4) Измените класс так, чтобы при вызове метода say можно
было задать число повторений.
Пример:
p = Parrot( "Гав!" )
p.say()
Гав!
p.newText( "Мяу!" )
p.say( 3 )
Мяу! Мяу! Мяу!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
202. Задание
202Программирование игр на языке Python
Задание
5) *Изменить класс так, чтобы можно было добавлять фразы в
набор фраз, которые знает попугай. При вызове метода say
попугай выдаёт случайную фразу из своего набора.
Пример:
p = Parrot( "Гав!" )
p.say()
Гав!
p.learn( "Мяу!" )
p.say()
Гав!
p.say(3)
Мяу! Мяу! Мяу!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
203. Программирование игр на языке Python Класс на основе Черепахи
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
204. Мяч – это особая Черепаха (наследование)
204Программирование игр на языке Python
Мяч – это особая Черепаха (наследование)
базовый
класс
import turtle
class Ball( turtle.Turtle ):
...
производный
класс
! Мяч – это объект, который имеет
(«наследует») все свойства и методы,
которые есть у Черепахи!
Мяч – это «разновидность» Черепахи!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
205. Добавляем свойства
205Программирование игр на языке Python
Добавляем свойства
цвет
import turtle
class Ball( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
super().__init__()
# создаем Черепаху
self.shape( "circle" )
self.color( color0 )
методы
self.penup()
Черепахи
self.speed( 0 )
self.goto( x0, y0 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
206. Основная программа: используем класс
206Программирование игр на языке Python
Основная программа: используем класс
window = turtle.Screen()
window.bgcolor( "black" )
window.setup( 800, 600 )
# фон
# размеры
ball = Ball( 0, 0, "white" )
ball2 = Ball( -100, 100, "red" )
turtle.done()
! Второй объект
добавляется одной
строчкой!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
207. Добавляем скорость
207Программирование игр на языке Python
Добавляем скорость
import turtle
class Ball( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
...
скорости по оси
self.vx = 5
X
и
по
оси
Y
self.vy = -5
def move( self ):
x = self.xcor()
новый метод движение
self.setx( x+self.vx )
y = self.ycor()
self.sety( y+self.vy )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
208. Основная программа: анимация
208Программирование игр на языке Python
Основная программа: анимация
window = turtle.Screen()
window.bgcolor( "black" )
window.setup( 800, 600 )
turtle.tracer(0)
# фон
# размеры
ball = Ball( 0, 0, "white" )
while True:
ball.move()
window.update()
time.sleep( 0.05 )
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
209. Остановка при нажатии Esc
209Программирование игр на языке Python
Остановка при нажатии Esc
stop = False
def escape():
global stop
stop = True
срабатывает при
нажатии Esc
window.listen()
window.onkey( escape, "Escape" )
while not stop :
ball.move()
window.update()
time.sleep( 0.05 )
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
210. Отскок от стенок
210Программирование игр на языке Python
Отскок от стенок
vx
vx
vy
vy
vx
vx
vy
vy
vx
vy
vy
def checkCollision():
x = ball.xcor()
if x <= -390 or x >= 390:
ball.vx = -ball.vx
... # самостоятельно!
© К.Ю. Поляков, 2025
vx
vx
vy
vy
vx
http://kpolyakov.spb.ru
211. Основная программа: отскок от стенок
211Программирование игр на языке Python
Основная программа: отскок от стенок
def checkCollision():
...
while True:
ball.move()
checkCollision()
window.update()
time.sleep( 0.05 )
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
212. Задание
212Программирование игр на языке Python
Задание
1) Соберите программу, в которой летает шарик
и отскакивает от стенок.
2) Постройте программу, в которой летают 5
шариков разного цвета и отскакивают от
стенок. Перенесите проверку столкновений в
метод move класса Ball.
3) Измените конструктор класса Ball так, чтобы
каждый шарик получал случайное
направление движения.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
213. Программирование игр на языке Python Добавляем ракетки
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
214. Ракетка – это тоже Черепаха
214Программирование игр на языке Python
Ракетка – это тоже Черепаха
«наследник»
Черепахи
конструктор
import turtle
class Paddle( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
super().__init__()
увеличить
self.shape( "square" )
ширину в
5 раз
self.shapesize( stretch_wid=5,
(20 100)
stretch_len=1 )
self.color( color0 )
self.penup()
self.speed( 0 )
self.goto( x0, y0 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
215. Основная программа с ракетками
215Программирование игр на языке Python
Основная программа с ракетками
ball = Ball( 0, 0, "white" )
leftPaddle = Paddle( -350, 0, "blue" )
rightPaddle = Paddle( 350, 0, "red" )
while True:
ball.move()
checkCollision()
window.update()
time.sleep( 0.05 )
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
216. Движение ракетки
216Программирование игр на языке Python
Движение ракетки
class Paddle( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
...
def moveUp( self ):
y = self.ycor()
self.sety( y + 20 )
def moveDown( self ):
... # самостоятельно!
window.listen()
window.onkey( escape, "Escape" )
window.onkey( rightPaddle.moveUp, "Up" )
window.onkey( rightPaddle.moveDown, "Down" )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
217. Отскок шарика от ракетки
217Программирование игр на языке Python
Отскок шарика от ракетки
правая
ракетка
def checkCollision():
x = ball.xcor()
y = ball.xcor()
yRight = rightPaddle.ycor()
if x > 340 and \
yRight-50 <= y <= yRight+50:
ball.vx = - ball.vx
... # самостоятельно!
y+50
y
y–50
левая
ракетка
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
218. Задание
218Программирование игр на языке Python
Задание
1) Соберите программу, в которой летает шарик
и отскакивает от стенок и ракеток.
2) Измените программу так, чтобы вторая
ракетка тоже двигалась. Выберите для нее
клавиши управления.
3) Измените программу так, чтобы ракетки не
могли выйти за границы поля.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
219. Программирование игр на языке Python Добавляем счёт
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
220. Дисплей – тоже Черепаха
220Программирование игр на языке Python
Дисплей – тоже Черепаха
class Display( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
super().__init__()
self.color( color0 )
self.penup()
self.hideturtle()
self.speed( 0 )
очков
self.goto( x0, y0 )
слева и
self.scoreLeft == 00
self.scoreLeft
справа
self.scoreRight == 00
self.scoreRight
self.update()
self.update()
обновить
на экране
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
221. Вывод информации
221Программирование игр на языке Python
Вывод информации
class Display( turtle.Turtle ):
...
def update( self ):
self.clear()
self.write( f"Игрок Л: {self.scoreLeft} "
f"Игрок П: {self.scoreRight}",
align="center",
font=("Courier", 24) )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
222. Увеличение счёта
Программирование игр на языке Python222
Увеличение счёта
class Display( turtle.Turtle ):
...
def addPointLeft( self ):
self.scoreLeft += 1
self.update()
def addPointRight( self ):
# самостоятельно!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
223. Подсчёт очков
223Программирование игр на языке Python
Подсчёт очков
def checkCollision():
прошёл ракетку и
...
ушёл за поле
if x > 390:
display.addPointLeft()
ball.goto( 0, 0 )
... # так же и для второго игрока
! Убрать отскок от боковых стенок!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
224. Задание
224Программирование игр на языке Python
Задание
1) Соберите полную программу.
2) Измените программу так, чтобы после гола
шарик летел в сторону того, кто забил этот
гол.
3) Измените программу так, чтобы после того,
как кто-то наберет 5 очков, игра
заканчивалась и на месте счета появлялась
надпись «Выиграл игрок Л (или П)». Через 2
секунды игра должна начинаться заново с
нулевого счёта. Добавьте в класс Display
метод reset, который обнуляет счёт.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
225. Задание
225Программирование игр на языке Python
Задание
4) Сделайте так, чтобы после выигрыша какогото игрока новая игра запускалась только
после нажатия на пробел ("space").
Учтите, что программа обрабатывает нажатия
клавиш только при вызове
window.update()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
226. Программирование игр на языке Python Играет компьютер
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
227. Гарантированный выигрыш компьютера
227Программирование игр на языке Python
Гарантированный выигрыш компьютера
def autoPlay():
if ball.ycor() < leftPaddle.ycor():
leftPaddle.moveDown()
elif ... # самостоятельно!
? Что плохо?
def autoPlay():
if ball.ycor() < leftPaddle.ycor()-30:
-30:
leftPaddle.moveDown()
elif ... # самостоятельно!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
228. Вызов функции 1 раз в 100 мс
228Программирование игр на языке Python
Вызов функции 1 раз в 100 мс
вызвать еще раз
def autoPlay():
через 100 мс
...
window.ontimer( autoPlay, 100 )
Первый вызов:
window.ontimer( autoPlay, 100 )
while True:
...
window.update()
time.sleep( 0.05 )
основной
цикл
turtle.done()
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
229. Движение вверх и вниз
229Программирование игр на языке Python
Движение вверх и вниз
import turtle
class Paddle( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
super().__init__()
...
направление
self.dir = 0
движения
1 # вверх
-1 # вниз
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
230. Движение вверх и вниз
230Программирование игр на языке Python
Движение вверх и вниз
def autoPlay():
y = leftPaddle.ycor()
if y <= -240:
leftPaddle.dir = 1
# самостоятельно другую сторону!
if leftPaddle.dir == 1:
leftPaddle.moveUp()
# самостоятельно другую сторону!
window.ontimer( autoPlay, 100 )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
231. Задание
231Программирование игр на языке Python
Задание
1) Соберите программу, в которой
гарантированно выигрывает компьютер.
2) Соберите программу, в которой левая ракетка
движется поочередно вверх и вниз через всё
поле.
3) Соберите программу, в которой в движение
левой ракетки добавлена случайность: в
среднем один раз из трёх выбирается
неверное направление. Используйте условие
if randint(0, 2) == 0: ...
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
232. Программирование игр на языке Python Игра «Арканоид»
© К.Ю. Поляков, 2025http://kpolyakov.spb.ru
233. Игра «Арканоид»
233Программирование игр на языке Python
Игра «Арканоид»
блоки для
«выбивания»
шарик
ракетка
(движется)
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
234. Этап 1. Шарик
Программирование игр на языке Python234
Этап 1. Шарик
Экран 600 800.
Шарик (объект класса
Ball) летает и
отталкивается от стенок
поля.
При нажатии клавиши
Escape программа
заканчивает работу.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
235. Этап 2. Ракетка
Программирование игр на языке Python235
Этап 2. Ракетка
Добавляем ракетку
(объект класса Paddle).
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
236. Модульная организация программы
236Программирование игр на языке Python
Модульная организация программы
from ballcls import Ball
from paddlecls import Paddle
основная
программа
модули
main.py
ballcls.py
paddlecls.py
класс Ball
класс Paddle
import turtle
class Ball( turtle.Turtle ):
def __ init__( self, ... )
...
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
237. Этап 3. Ракетка отбивает шарик
Программирование игр на языке Python237
Этап 3. Ракетка отбивает шарик
Шарик отталкивается от
ракетки. Коррекция
скорости:
x = ball.xcor()
xp = paddle.xcor()
ball.vx += (x - xp) / 10
! Полёт шарика
зависит от того,
какая часть ракетки
по нему попала!
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
238. Этап 3. Ракетка отбивает шарик
238Программирование игр на языке Python
Этап 3. Ракетка отбивает шарик
Ракетка следует за мышью.
event.x
x
def movePaddle(event):
x = event.x - 300
paddle.setx( x )
canvas = window.getcanvas()
canvas.bind( "<Motion>", movePaddle )
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
239. Этап 4. Блоки
Программирование игр на языке Python239
Этап 4. Блоки
Добавить блоки разного
цвета (7 рядов по 10
блоков случайного
цвета).
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
240. Этап 4. Блоки
240Программирование игр на языке Python
Этап 4. Блоки
Класс Block в файле blockcls.py
import turtle
class Block( turtle.Turtle ):
def __init__( self, x0, y0, color ):
super().__init__()
self.shape( "square" )
self.color(color )
self.shapesize( stretch_wid=1,
stretch_len=2 )
self.penup()
блок 20 40
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
241. Этап 4. Блоки
241Программирование игр на языке Python
Этап 4. Блоки
Добавить блоки разного цвета (7 рядов по 10
блоков случайного цвета).
blocks = [] # пустой список
colors = ["red", "orange", "yellow", "green",
"cyan", "blue", "purple"]
for row in range(7):
for col in range(10):
случайный
x = -230 + col*50
цвет
y = 250 - row*25
block = Block( x, y, random.choice(colors) )
blocks.append( block )
добавить в
список блоков
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
242. Этап 5. Выбивание блоков
Программирование игр на языке Python242
Этап 5. Выбивание блоков
Шарик выбивает блоки и
отталкивается от них
(скорость .vy меняется
на обратную).
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
243. Этап 5. Выбивание блоков
243Программирование игр на языке Python
Этап 5. Выбивание блоков
x = ball.xcor()
y = ball.ycor()
проверить
все блоки
for block in blocks:
xBlock = block.xcor()
yBlock = block.ycor()
если шарик
попал на блок
if xBlock-25 < x < xBlock+25 and \
yBlock-10 < y < yBlock+10:
block.goto( 1000, 1000 ) # убрать далеко
blocks.remove( block )
# удалить
ball.vy = -ball.vy # отскок
break # дальше не проверять
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
244. Этап 6. Дисплей (счёт, жизни)
Программирование игр на языке Python244
Этап 6. Дисплей (счёт, жизни)
Табло со счётом (число
выбитых блоков). Всего
3 «жизни», «жизнь»
теряется, если шарик
проходит линию ракетки.
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
245. Этап 6. Дисплей (счёт, жизни)
245Программирование игр на языке Python
Этап 6. Дисплей (счёт, жизни)
Табло со счётом (число выбитых блоков). Всего
3 «жизни», «жизнь» теряется, если шарик
проходит линию ракетки.
Файл displaycls.py
import turtle
class Display( turtle.Turtle ):
def __init__( self, x0, y0, color0 ):
super().__init__()
...
self.score = 0
# счёт
self.lives = 3
# жизни
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
246. Этап 6. Дисплей (счёт, жизни)
246Программирование игр на языке Python
Этап 6. Дисплей (счёт, жизни)
Шарик прошёл линию ракетки.
display.lives -= 1
окончание
display.update()
игры
if display.lives == 0:
ball.vx = ball.vy = 0
global stop
закончить
игру
stop = True
display.gameOver()
остановить
шарик
сообщение об
окончании игры
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
247. Этап 7. Постепенное усложнение игры
247Программирование игр на языке Python
Этап 7. Постепенное усложнение игры
После каждых 5 набранных очков скорость
движения шарика увеличивается на 5%.
ball.vx *= 1.05
ball.vy *= 1.05
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
248. Конец фильма
248Программирование игр на языке Python
Конец фильма
ПОЛЯКОВ Константин Юрьевич
д. т. н., учитель информатики
г. Санкт-Петербург
kpolyakov@mail.ru
© К.Ю. Поляков, 2025
http://kpolyakov.spb.ru
programming