Перезапуск и проверка игры
10 минут · 50:00–60:00 в часовом практикуме
Результат задачи: Добавить R для новой попытки и проверить весь игровой цикл.
Рабочий файл
Открой game.py в распакованном проекте. Продолжаем файл предыдущей задачи. Python и Arcade уже должны быть установлены. После изменения сохрани и запусти Run → Run Module / F5. Старое игровое окно закрой.
Скачать учебную папку со всеми картинками ↓Что используем в этом блоке
- Сброс состояния
- Возврат всех изменявшихся значений к началу раунда.
Подзадача 1 · Собери сброс в функцию
Добавь restart перед обработчиком клавиш. Возвращаем старт героя, положение и направление метеора, состояние и набор клавиш.
def restart(): global x, y, meteor_x, meteor_speed, state x, y = 210, 235 meteor_x = 720 meteor_speed = 200 state = "playing" keys.clear()Как работает блок
- global перечисляет только переменные, которым присваиваем новые значения.
- star_x, star_y и meteor_y не меняются в раунде, поэтому сбрасывать их не требуется.
- keys.clear() убирает ввод от предыдущей попытки.
Подзадача 2 · Подключи R
Замени прежний key_pressed на этот блок. Остальные подключения окна сохраняются.
def key_pressed(key, modifiers): keys.add(key) if key == arcade.key.R: restart()Как работает блок
- R вызывает сброс в ходе игры, после победы и после проигрыша.
- Правила движения повторно не пишем: состояние playing снова разрешает update.
Подзадача 3 · Проверь цикл целиком
Запусти игру: двигайся, отпусти клавишу, проверь края, столкнись, нажми R, найди звезду, снова нажми R. Затем сверяй свой файл с полным итогом.
Как работает блок
- После каждого R начальные координаты и направление должны совпадать.
- Если изменил старт героя или скорость патруля для своей версии, обнови и начальные значения, и restart.

Самостоятельная модификация
- Сделай свой маршрут и объясни три изменения. Дополнительно добавь WASD, таймер или паузу после основной проверки.
Критерий готовности
- Оба исхода проверены; R работает после каждого; старая нажатая клавиша не переносится в новую попытку.
Полный game.py после задачи 6
Сверь расположение блоков или скачай файл в корень распакованного проекта рядом с assets. Это полная рабочая версия на данном этапе.
Скачать game.py задачи 6 ↓Посмотреть весь файл
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(). Если меняли старт, сверьте значения в двух местах.
Открыть сценарий блока →