Глава 3 · Добавляем правила

Перезапуск и проверка игры

10 минут · 50:00–60:00 в часовом практикуме

Результат задачи: Добавить R для новой попытки и проверить весь игровой цикл.

Рабочий файл

Открой game.py в распакованном проекте. Продолжаем файл предыдущей задачи. Python и Arcade уже должны быть установлены. После изменения сохрани и запусти Run → Run Module / F5. Старое игровое окно закрой.

Скачать учебную папку со всеми картинками ↓

Что используем в этом блоке

Сброс состояния
Возврат всех изменявшихся значений к началу раунда.

Подзадача 1 · Собери сброс в функцию

Добавь restart перед обработчиком клавиш. Возвращаем старт героя, положение и направление метеора, состояние и набор клавиш.

Python
def restart():    global x, y, meteor_x, meteor_speed, state    x, y = 210, 235    meteor_x = 720    meteor_speed = 200    state = "playing"    keys.clear()

Как работает блок

  1. global перечисляет только переменные, которым присваиваем новые значения.
  2. star_x, star_y и meteor_y не меняются в раунде, поэтому сбрасывать их не требуется.
  3. keys.clear() убирает ввод от предыдущей попытки.

Подзадача 2 · Подключи R

Замени прежний key_pressed на этот блок. Остальные подключения окна сохраняются.

Python
def key_pressed(key, modifiers):    keys.add(key)    if key == arcade.key.R:        restart()

Как работает блок

  1. R вызывает сброс в ходе игры, после победы и после проигрыша.
  2. Правила движения повторно не пишем: состояние playing снова разрешает update.

Подзадача 3 · Проверь цикл целиком

Запусти игру: двигайся, отпусти клавишу, проверь края, столкнись, нажми R, найди звезду, снова нажми R. Затем сверяй свой файл с полным итогом.

Как работает блок

  1. После каждого R начальные координаты и направление должны совпадать.
  2. Если изменил старт героя или скорость патруля для своей версии, обнови и начальные значения, и restart.
Рабочий результат задачи 6: перезапуск и проверка игры.
Рабочий результат задачи 6: перезапуск и проверка игры. Нажми на кадр, чтобы увеличить.

Самостоятельная модификация

  1. Сделай свой маршрут и объясни три изменения. Дополнительно добавь WASD, таймер или паузу после основной проверки.

Критерий готовности

  • Оба исхода проверены; R работает после каждого; старая нажатая клавиша не переносится в новую попытку.

Полный game.py после задачи 6

Сверь расположение блоков или скачай файл в корень распакованного проекта рядом с assets. Это полная рабочая версия на данном этапе.

Скачать game.py задачи 6 ↓
Посмотреть весь файл
Python
import arcadeWIDTH = 1280HEIGHT = 800x = 210y = 235SPEED = 270keys = set()star_x, star_y = 1070, 540meteor_x, meteor_y = 720, 385meteor_speed = 200state = "playing"window = arcade.Window(WIDTH, HEIGHT, "Звезда и Метеор")background = arcade.load_texture("assets/background.png")hero = arcade.load_texture("assets/astronaut.png")star = arcade.load_texture("assets/star.png")meteor = arcade.load_texture("assets/meteor.png")message = arcade.Text("", 640, 710, (255, 226, 136), 30,                      anchor_x="center", font_name="Arial")def draw_image(texture, x, y, size):    arcade.draw_texture_rect(texture, arcade.XYWH(x, y, size, size))def touches(ax, ay, bx, by):    return abs(ax - bx) < 60 and abs(ay - by) < 60def restart():    global x, y, meteor_x, meteor_speed, state    x, y = 210, 235    meteor_x = 720    meteor_speed = 200    state = "playing"    keys.clear()def draw():    window.clear()    arcade.draw_texture_rect(background, arcade.LBWH(0, 0, WIDTH, HEIGHT))    draw_image(hero, x, y, 132)    draw_image(star, star_x, star_y, 90)    draw_image(meteor, meteor_x, meteor_y, 132)    message.text = ""    if state == "won":        message.text = "Звезда найдена!"    elif state == "lost":        message.text = "Столкновение."    message.draw()def key_pressed(key, modifiers):    keys.add(key)    if key == arcade.key.R:        restart()def key_released(key, modifiers):    keys.discard(key)def update(delta_time):    global x, y    global meteor_x, meteor_speed    global state    if state != "playing":        return    if arcade.key.RIGHT in keys:        x += SPEED * delta_time    if arcade.key.LEFT in keys:        x -= SPEED * delta_time    if arcade.key.UP in keys:        y += SPEED * delta_time    if arcade.key.DOWN in keys:        y -= SPEED * delta_time    x = max(96, min(1184, x))    y = max(171, min(589, y))    meteor_x += meteor_speed * delta_time    if meteor_x > 1110:        meteor_x = 1110        meteor_speed = -200    elif meteor_x < 340:        meteor_x = 340        meteor_speed = 200    if touches(x, y, meteor_x, meteor_y):        state = "lost"    elif touches(x, y, star_x, star_y):        state = "won"window.on_draw = drawwindow.on_key_press = key_pressedwindow.on_key_release = key_releasedwindow.on_update = updatewindow.on_deactivate = keys.cleararcade.run()
Преподавателю: объяснение блока и запись видео

Начните так: «Последняя задача — замкнуть цикл: начало, движение, результат, новый раунд. После этого получаем завершённую мини-игру.»

Спросите: Почему недостаточно вернуть только координаты героя?

Ответ: Метеор, его направление, состояние результата и старый ввод тоже влияют на новый раунд.

Если не получается: Если новая попытка сразу завершена, забыли playing. Если герой летит сам, проверьте keys.clear(). Если меняли старт, сверьте значения в двух местах.

Открыть сценарий блока →