
СРВ_4
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Уфимский университет науки и технологий»
Институт информатики, математики и робототехники
Кафедра вычислительной математики и кибернетики
Отчет по лабораторной работе № 4, 5
по дисциплине «Системы реального времени»
Выполнили:
Студенты группы ПРО-432Б
Ихсанова Э. А., Мустафин А. А., Видманов А. А.
Проверил старший преподаватель ВМиК:
Ковтуненко А. В.
Уфа 2024
Цель работы: изучить библиотеку simplegui по курсам и написать свой пример видеоигры.
Ход работы: были изучены курсы по simplegui и написана игра, похожая на doodle jump
Код программы:
import simplegui
import random
# Константы экрана
WIDTH = 400
HEIGHT = 600
GRAVITY = 0.5
JUMP_STRENGTH = -15
PLATFORM_WIDTH = 80
PLATFORM_HEIGHT = 10
SPEED = 5
# Глобальные переменные
player_pos = [WIDTH // 2, HEIGHT - 50]
player_vel = 0
platforms = []
score = 0
game_over = False
# Загрузка изображений с использованием simpleguitk
player_image = simplegui.load_image("https://steamuserimages-a.akamaihd.net/ugc/963102626831738904/AF6C24D887432C20A8DF151004A25B6E21DBC763/?imw=512&imh=461&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=true") # Изображение персонажа
background_image = simplegui.load_image("https://courses.cs.duke.edu/fall10/cps108/code/src/vooga/examples/control/resources/images/background.png")
# Размеры изображения персонажа
PLAYER_WIDTH = 35
PLAYER_HEIGHT = 35
# Флаг загрузки изображений
images_loaded = False
def image_loader():
global images_loaded
if player_image.get_width() > 0 and background_image.get_width() > 0:
images_loaded = True
# Таймер для проверки загрузки изображений
image_timer = simplegui.create_timer(100, image_loader)
# Создание платформ
def create_platforms():
global platforms
platforms = []
y = HEIGHT - 50
for _ in range(10):
x = random.randint(0, WIDTH - PLATFORM_WIDTH)
platforms.append([x, y])
y -= random.randint(50, 100) # Расстояние между платформами
# Фон
def draw_background(canvas):
canvas.draw_image(
background_image,
(background_image.get_width() / 2, background_image.get_height() / 2),
(background_image.get_width(), background_image.get_height()),
(WIDTH / 2, HEIGHT / 2),
(WIDTH, HEIGHT)
)
# Основная функция отрисовки
def draw(canvas):
global player_pos, player_vel, platforms, score, game_over
draw_background(canvas)
if not game_over:
# Обновляем позицию персонажа
player_vel += GRAVITY
player_pos[1] += player_vel
# Проверка на прыжок от платформы
for platform in platforms:
platform_x, platform_y = platform
if (platform_y <= player_pos[1] + PLAYER_HEIGHT / 2 < platform_y + PLATFORM_HEIGHT and
platform_x < player_pos[0] < platform_x + PLATFORM_WIDTH and
player_vel > 0):
player_vel = JUMP_STRENGTH
score += 1
# Обновляем платформы
new_platforms = []
for platform in platforms:
platform[1] += SPEED
if platform[1] < HEIGHT:
new_platforms.append(platform)
else:
# Создаем новую платформу сверху
x = random.randint(0, WIDTH - PLATFORM_WIDTH)
new_platforms.append([x, 0])
platforms = new_platforms
# Рисуем платформы
for platform in platforms:
canvas.draw_line([platform[0], platform[1]], [platform[0] + PLATFORM_WIDTH, platform[1]], PLATFORM_HEIGHT, 'Green')
# Рисуем игрока (персонаж)
canvas.draw_image(player_image, [player_image.get_width() // 2, player_image.get_height() // 2],
[player_image.get_width(), player_image.get_height()],
player_pos, [PLAYER_WIDTH, PLAYER_HEIGHT])
# Проверка на падение за нижний край экрана
if player_pos[1] > HEIGHT:
game_over = True
# Рисуем счет
canvas.draw_text("Score: " + str(score), [10, 30], 24, "White")
else:
# Отображение конца игры и кнопки перезапуска
canvas.draw_text("Game Over!", [WIDTH // 2 - 80, HEIGHT // 2], 36, "Red")
canvas.draw_text("Score: " + str(score), [WIDTH // 2 - 50, HEIGHT // 2 + 40], 24, "White")
# Обработка прыжка
def jump(key):
if key == simplegui.KEY_MAP['left']:
player_pos[0] -= 25 # Движение влево
elif key == simplegui.KEY_MAP['right']:
player_pos[0] += 25 # Движение вправо
# Сброс игры
def reset_game():
global player_pos, player_vel, platforms, score, game_over
player_pos = [WIDTH // 2, HEIGHT - 50]
player_vel = 0
create_platforms()
score = 0
game_over = False
# Обработчик кнопки перезапуска
def restart_handler():
reset_game()
# Настройка игры
frame = simplegui.create_frame("Doodle Jump", WIDTH, HEIGHT)
frame.set_draw_handler(draw)
frame.set_keydown_handler(jump)
# Создание кнопки перезапуска
frame.add_button("Restart", restart_handler, 100)
# Начало игры
reset_game()
image_timer.start()
frame.start()
Вывод: реализовали свой пример игры на CodeSkulptor.