ИГРА ПУШКА
ШАГ 1: Подготовка игры
ШАГ 2: Создаем игровое окно
ШАГ 3: Создаем пушку игрока
ШАГ 6: Стрельба лазерами
ШАГ 7: Движение лазера
ШАГ 8: Создание врагов-пришельцев
ШАГ 9: Удаление объектов (лазеров и врагов)
ШАГ 10: Настройка управления клавиатурой
ШАГ 11: Главный игровой цикл
МЫ УЗНАЛИ
584.18K

ПУШКА (1)

1. ИГРА ПУШКА

2. ШАГ 1: Подготовка игры

import random
import time
import turtle
# Настройки игры
FRAME_RATE = 30 # Сколько раз в секунду обновляется экран
TIME_FOR_1_FRAME = 1 / FRAME_RATE # Время между обновлениями
# Скорости и размеры
CANNON_STEP = 10
# На сколько пикселей двигается пушка
LASER_LENGTH = 20
# Длина лазерного луча
LASER_SPEED = 20
# Скорость лазера
ALIEN_SPAWN_INTERVAL = 1.2 # Каждые 1.2 секунды появляется новый враг
ALIEN_SPEED = 3.5
# Скорость падения врагов

3. ШАГ 2: Создаем игровое окно

# Создаем окно игры
window = turtle.Screen()
window.tracer(0) # Отключаем автоматическое обновление (будем
обновлять вручную)
window.setup(0.5, 0.75) # Размер окна (половина ширины, 3/4 высоты
экрана)
window.bgcolor(0.2, 0.2, 0.2) # Темно-серый фон - как космос!
window.title("The Real Python Space Invaders")
# Определяем границы экрана
LEFT = -window.window_width() / 2 # Левая граница
RIGHT = window.window_width() / 2 # Правая граница
TOP = window.window_height() / 2 # Верхняя граница
BOTTOM = -window.window_height() / 2 # Нижняя граница
FLOOR_LEVEL = 0.9 * BOTTOM
# Уровень земли (где стоит пушка)
GUTTER = 0.025 * window.window_width() # Отступ от краев

4. ШАГ 3: Создаем пушку игрока

# Создаем лазерную пушку
cannon = turtle.Turtle()
cannon.penup()
# Поднимаем "перо" - не оставляем следов
cannon.color(1, 1, 1) # Белый цвет (RGB: 1,1,1 - максимальная
яркость)
cannon.shape("square") # Базовая форма - квадрат
cannon.setposition(0, FLOOR_LEVEL) # Ставим пушку на уровень
земли
cannon.cannon_movement = 0 # Движение пушки: -1=влево,
0=стоим, 1=вправо

5.

ШАГ 4: Функция рисования пушки
def draw_cannon():
cannon.clear() # Стираем старую пушку
cannon.turtlesize(1, 4) # Основание пушки (высота=1, ширина=4)
cannon.stamp() # "Штампуем" отпечаток основания пушки на экране
cannon.sety(FLOOR_LEVEL + 10) # Поднимаемся на 10 пикселей вверх
cannon.turtlesize(1, 1.5) # Средняя часть пушки (уже)
cannon.stamp()
cannon.sety(FLOOR_LEVEL + 20) # Поднимаемся еще выше
cannon.turtlesize(0.8, 0.3) # Верхушка пушки (самая узкая)
cannon.stamp()
cannon.sety(FLOOR_LEVEL) # Возвращаемся на исходную позицию

6.

ШАГ 5: Управление пушкой
def move_left():
cannon.cannon_movement = -1 # Двигаем пушку влево
def move_right():
cannon.cannon_movement = 1 # Двигаем пушку вправо
def stop_cannon_movement():
cannon.cannon_movement = 0 # Останавливаем пушку

7. ШАГ 6: Стрельба лазерами

def create_laser():
laser = turtle.Turtle() # Создаем новый лазер
laser.penup()
# Не оставляем следов
laser.color(1, 0, 0)
# Красный цвет (RGB: 1,0,0)
laser.hideturtle()
# Прячем стандартную черепашку
laser.setposition(cannon.xcor(), cannon.ycor()) # Старт из пушки
laser.setheading(90)
# Направляем вверх (90 градусов)
# Поднимаем лазер до кончика пушки
laser.forward(20)
# Готовимся рисовать лазерный луч
laser.pendown() # Опускаем "перо" - теперь будем рисовать
laser.pensize(5) # Толщина лазерного луча - 5 пикселей
lasers.append(laser) # Добавляем лазер в список активных лазеров

8. ШАГ 7: Движение лазера

def move_laser(laser):
laser.clear() # Стираем старую позицию лазера
laser.forward(LASER_SPEED) # Двигаем лазер
вперед (вверх)
# Рисуем лазерный луч: вперед и назад
laser.forward(LASER_LENGTH) # Рисуем луч
длиной LASER_LENGTH
laser.forward(-LASER_LENGTH) # Возвращаемся
назад (чтобы не двигаться)

9. ШАГ 8: Создание врагов-пришельцев

def create_alien():
alien = turtle.Turtle()
alien.penup()
alien.turtlesize(1.5) # Черепашка в 1.5 раза больше обычной
# Случайная позиция вверху экрана (между левым и правым краем)
alien.setposition(
random.randint(
int(LEFT + GUTTER), # Левая граница + отступ
int(RIGHT - GUTTER), # Правая граница - отступ
),
TOP, # В самом верху экрана
)
alien.shape("turtle") # Используем форму черепашки как пришельца
alien.setheading(-90) # Направляем вниз (к земле)
# Случайный цвет для пришельца
alien.color(random.random(), random.random(), random.random())
aliens.append(alien) # Добавляем в список врагов

10. ШАГ 9: Удаление объектов (лазеров и врагов)

def remove_sprite(sprite, sprite_list):
sprite.clear()
# Стираем с экрана
sprite.hideturtle() # Прячем черепашку
window.update()
# Обновляем экран
sprite_list.remove(sprite) # Удаляем из списка
turtle.turtles().remove(sprite) # Удаляем из
всех черепашек

11. ШАГ 10: Настройка управления клавиатурой

# Привязываем клавиши к функциям:
window.onkeypress(move_left, "Left")
# Стрелка влево
window.onkeypress(move_right, "Right")
# Стрелка вправо
window.onkeyrelease(stop_cannon_movement, "Left") # Отпустили влево
window.onkeyrelease(stop_cannon_movement, "Right") # Отпустили вправо
window.onkeypress(create_laser, "space")
# Пробел - выстрел
window.onkeypress(turtle.bye, "q")
# Q - выход из игры
window.listen() # "Слушаем" нажатия клавиш

12. ШАГ 11: Главный игровой цикл

# Начальные значения
alien_timer = 0 # Таймер для создания врагов
game_timer = time.time() # Таймер игры
score = 0
# Счет игрока
game_running = True # Игра активна
# ГЛАВНЫЙ ЦИКЛ ИГРЫ - повторяется 30 раз в секунду!
while game_running:
timer_this_frame = time.time() # Засекаем время начала кадра
# Показываем время и счет
time_elapsed = time.time() - game_timer
text.clear()
text.write(
f"Time: {time_elapsed:5.1f}s\nScore: {score:5}",
font=("Courier", 20, "bold"),
)
# ДВИЖЕНИЕ ПУШКИ
new_x = cannon.xcor() + CANNON_STEP * cannon.cannon_movement
# Проверяем, не выходит ли пушка за границы
if LEFT + GUTTER <= new_x <= RIGHT - GUTTER:
cannon.setx(new_x)
draw_cannon() # Перерисовываем пушку на новой позиции
# ДВИЖЕНИЕ ЛАЗЕРОВ
for laser in lasers.copy(): # Копируем список чтобы безопасно удалять
move_laser(laser)
# Удаляем лазер, если он улетел за верх экрана
if laser.ycor() > TOP:
remove_sprite(laser, lasers)
break
# ПРОВЕРКА СТОЛКНОВЕНИЙ: лазер vs враги
for alien in aliens.copy():
if laser.distance(alien) < 20: # Если расстояние < 20 пикселей
remove_sprite(laser, lasers) # Удаляем лазер
remove_sprite(alien, aliens) # Удаляем врага
score += 1 # +1 к счету!
break
# СОЗДАНИЕ НОВЫХ ВРАГОВ
if time.time() - alien_timer > ALIEN_SPAWN_INTERVAL:
create_alien()
# Создаем нового врага
alien_timer = time.time() # Сбрасываем таймер
# ДВИЖЕНИЕ ВРАГОВ
for alien in aliens:
alien.forward(ALIEN_SPEED) # Двигаем врага вниз
# ПРОВЕРКА ПРОИГРЫША: если враг достиг земли
if alien.ycor() < FLOOR_LEVEL:
game_running = False # Конец игры!
break
# ПОДДЕРЖАНИЕ СТАБИЛЬНОЙ СКОРОСТИ ИГРЫ
time_for_this_frame = time.time() - timer_this_frame
# Если кадр обработался слишком быстро - ждем до конца интервала
if time_for_this_frame < TIME_FOR_1_FRAME:
time.sleep(TIME_FOR_1_FRAME - time_for_this_frame)
window.update() # Обновляем экран!
### **ШАГ 12: Конец игры**
```python
# Показываем надпись "GAME OVER"
splash_text = turtle.Turtle()
splash_text.hideturtle()
splash_text.color(1, 1, 1) # Белый цвет
splash_text.write("GAME OVER", font=("Courier", 40, "bold"), align="center")
turtle.done() # Завершаем работу с черепашкой

13. МЫ УЗНАЛИ

Мы создали настоящую компьютерную игру с нуля!
English     Русский Rules