Главная страница
Навигация по странице:

  • Экзаменационная работа Направление подготовки 09.02.07 Информационные системы и программирование Профиль «

  • ПРОЕКТИРОВАНИЕ АЛГОРИТМА И РАСПЕРЕДЕЛЕНИЕ ВРЕМЕННЫХ ПРОМЕЖУТКОВ Проектирование алгоритма

  • Распределение временных промежутков

  • Генерация и отрисовка лабиринта

  • СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  • Отчет. Галиуллин Денис Дмитриевич Преподаватель Галиуллин Д. Д. Верхняя Тура 2022 в настоящее время любое занятие


    Скачать 181.99 Kb.
    НазваниеГалиуллин Денис Дмитриевич Преподаватель Галиуллин Д. Д. Верхняя Тура 2022 в настоящее время любое занятие
    Дата26.09.2022
    Размер181.99 Kb.
    Формат файлаdocx
    Имя файлаОтчет.docx
    ТипЗанятие
    #697010

    Министерство просвещения Российской Федерации

    Государственное Автономное Профессиональное Училище Свердловской области

    «Верхнетуринский Механический Техникум»

    Экзаменационная работа

    Направление подготовки 09.02.07 Информационные системы и программирование

    Профиль «Разработка web и мультимедийных приложений»

    Исполнитель:

    студент группы

    328

    __________________


    Галиуллин Денис Дмитриевич

    Руководитель:

    Преподаватель

    __________________


    Галиуллин Д. Д.



    Верхняя Тура

    2022

    В настоящее время любое занятие имеющее прикладной характер имеет свою автоматизированную версию.

    Автоматизированная версия проектирования лабиринта представляет собой мгновенное создание уникальных вариантов лабиринта.

    Кажется, что это просто развлекающее задание. Однако, ценность лабиринтов сложно переоценить.

    Значимость сия творения следующая:

    • тренируется устойчивое визуальное внимание, поэтому их часто используют на курсах скорочтения

    • развиваются усидчивость и терпение

    • тренируется зрительная память

    • стимулируется мелкая моторика, т.к. проводимая линия не должна пересекать и касаться стенок лабиринта

    • развивается способность планировать в уме – предвидеть последствий своих действий и понимать связь между совершенным действием и полученным результатом.

    • стимулируется желание к поиску выходов из «сложных ситуаций».

    Лабиринт — это по сути плоскость, поделенная на клеточки. Мы можем перемещаться по плоскости, попадая из одного клеточки в другую. Однако на каждом шаге мы можем двигаться только в определенных направлениях, которые зависят от того, в какой клетке мы находимся. То есть, имеет место запрет на «хождение сквозь стены».

    Цель – создать генератор уникальных лабиринтов на высокоуровневом языке программирования Python

    В соответствии с поставленной целью сформулированы следующие задачи:

    • Проектирование

    • Создание алгоритма генерации лабиринта

    • Создание функция генерации лабиринта

    • Создание графического интерфейса

    • Создание игрового процесса

    • Проведение тестирования программы

    • Оформление документации

    ПРОЕКТИРОВАНИЕ АЛГОРИТМА И РАСПЕРЕДЕЛЕНИЕ ВРЕМЕННЫХ ПРОМЕЖУТКОВ

    Проектирование алгоритма



    Рис. 1 Алгоритм программы

    Из схемы, представленной выше, мы видим, что программа начинает свою работу с точки запуска приложения. Далее, идет ряд условий, поддерживающий уникальность и правильность каждого лабиринта. После достижения игроком конечной точки, лабиринт меняет своё построение.

    Данный проект имеет всего одного актора: пользователь – после запуска и генерации лабиринта он имеет следующие возможности:

    • Движение вправо, влево, вперед, назад

    • Закрытие программы

    Те же функции отображены на языке графического описания UML ниже.



    Рис. 2 Диаграмма вариантов использования

    Разберем последовательность исполнения программы. После запуска программы разворачивается череда вызовов исполнительных блоков. Более полня информация представлена на языке графического описания UML ниже.



    Рис. 3 Диаграмма последовательности

    Распределение временных промежутков

    Для эффективного распределения времени была использована методология Ганта.

    Задачи, подлежащие к выполнению, были перечислены выше при формировании цели.



    Рис. 4 Диаграмма Ганта

    РАЗРАБОТКА КОДА

    Для написания программы был выбран язык программирования Python.

    Python — высокоуровневый язык программирования общего назначения с динамической строгой типизацией и автоматическим управлением памятью, ориентированный на повышение производительности разработчика, читаемости кода и его качества, а также на обеспечение переносимости написанных на нём программ.

    Для упрощения написания кода были использованы следующие модули:

    • Random – модуль генерации случайных чисел

    • Time – модуль мониторинга реального времени

    • Pygame – библиотека пользовательского интерфейса для создания динамических игр.

    Разработка интерфейса

    Перед создание интерфейса был создан его макет. На нем отображается сгенерированных лабиринт, счетчик времени, счетчик пройдённых лабиринтов, рекордное время.

    :

    Рис. 5 Шаблон интерфейса

    Листинг 1

    Интерфейс

    import random

    import pygame

    import time

    border = 5 # ширина рамки

    width_line = 40 # ширина окна

    width_walls = 5 # толщина стен

    color_way = (255, 255, 255) # цвет фона

    color_wall = (0, 0, 0) # цвет стен

    color_player = (0, 0, 255) # цвет игрока

    color_start = (255, 255, 255)# цвет начальной точки

    color_finish = (255, 0, 0) # цвет цонечной точки

    trace = True # отображение пройденного пути

    color_trace = color_player #цвет пройденного пути

    width = 25 # ширина лабиринта

    height = 10 # высота лабиринта

    width_window = ((width * 2 - 1) // 2 + 1) * width_line + ((width * 2 - 1) // 2) * width_walls + border * 2 # ширина окна

    height_window = ((height * 2 - 1) // 2 + 1) * width_line + ((height * 2 - 1) // 2) * width_walls + border * 2 # высота окна

    info = True # отобаржение информации

    score = 0 # кол-во понтов

    t = 0 # начальное время

    record_time = 9999

    if width < 10:

    info = False

    if info:

    height_window += 70

    matrix_base = []
    pygame.init()

    window = pygame.display.set_mode((width_window, height_window))

    pygame.display.set_caption("Лабиринт")

    font = pygame.font.Font(None, 25)

    flag_game = True

    start_time = time.time()
    while flag_game: # основной игровой цикл

    text1 = font.render("Пройдено лабиринтов: " + str(score), True, (255, 255, 255))

    window.blit(text1, [5, height_window - 65])

    pygame.draw.rect(window, (0, 0, 0), (5, height_window - 40, width_window, 20))

    text2 = font.render("Время: " + str(int(t)), True, (255, 255, 255))

    window.blit(text2, [5, height_window - 40])

    if record_time == 9999:

    text3 = font.render("Рекордное время: " + str(0), True, (255, 255, 255))

    window.blit(text3, [5, height_window - 20])

    else:

    text3 = font.render("Рекордное время: " + str(int(record_time)), True, (255, 255, 255))

    window.blit(text3, [5, height_window - 20])

    pygame.display.update()
    Генерация и отрисовка лабиринта
    Листинг 2

    Функции генерации и отрисовки лабиринта

    def start_point_generate(n, m):

    if random.choice([True, False]):

    if random.choice([True, False]):

    start = (0, random.randint(0, m - 1))

    else:

    start = (n - 1, random.randint(0, m - 1))

    else:

    if random.choice([True, False]):

    start = (random.randint(0, n - 1), 0)

    else:

    start = (random.randint(0, n - 1), m - 1)

    return start
    def finish_point_generate(start, n, m):

    return n - 1 - start[0], m - 1 - start[1]

    def transition_choice(x, y, rm):

    choice_list = []

    if x > 0:

    if not rm[x - 1][y]:

    choice_list.append((x - 1, y))

    if x < len(rm) - 1:

    if not rm[x + 1][y]:

    choice_list.append((x + 1, y))

    if y > 0:

    if not rm[x][y - 1]:

    choice_list.append((x, y - 1))

    if y < len(rm[0]) - 1:

    if not rm[x][y + 1]:

    choice_list.append((x, y + 1))

    if choice_list:

    nx, ny = random.choice(choice_list)

    if x == nx:

    if ny > y:

    tx, ty = x * 2, ny * 2 - 1

    else:

    tx, ty = x * 2, ny * 2 + 1

    else:

    if nx > x:

    tx, ty = nx * 2 - 1, y * 2

    else:

    tx, ty = nx * 2 + 1, y * 2

    return nx, ny, tx, ty

    else:

    return -1, -1, -1, -1

    def draw_labyrinth(matrix, start, finish, width_line=20, width_walls=5, color_way=(255, 255, 255),

    color_wall=(0, 0, 0),

    border=5, color_start=(0, 255, 0), color_finish=(255, 0, 0)):

    """Рисование лабиринта"""

    width = (len(matrix) // 2 + 1) * width_line + (len(matrix) // 2) * width_walls + border * 2

    height = (len(matrix[0]) // 2 + 1) * width_line + (len(matrix[0]) // 2) * width_walls + border * 2

    for i in range(width):

    for j in range(height):

    if i < border or width - i <= border or j < border or height - j <= border: # отображение границ лабиринта

    pygame.draw.line(window, color_wall, [i, j], [i, j], 1)

    else:

    if (i - border) % (width_line + width_walls) <= width_line:

    x = (i - border) // (width_line + width_walls) * 2

    else:

    x = (i - border) // (width_line + width_walls) * 2 + 1

    if (j - border) % (width_line + width_walls) <= width_line:

    y = (j - border) // (width_line + width_walls) * 2

    else:

    y = (j - border) // (width_line + width_walls) * 2 + 1

    if matrix[x][y]:

    pygame.draw.line(window, color_way, [i, j], [i, j], 1)

    else:

    pygame.draw.line(window, color_wall, [i, j], [i, j], 1)

    pygame.draw.rect(window, color_start, (

    border + start[0] * (width_line + width_walls), border + start[1] * (width_line + width_walls), width_line,

    width_line))

    pygame.draw.rect(window, color_finish, (

    border + finish[0] * (width_line + width_walls), border + finish[1] * (width_line + width_walls), width_line,

    width_line))

    Перемещение игрока

    Листинг 3

    Функции удаления и появления игрока на клетке

    def draw_player():

    pygame.draw.circle(window, color_player, (border + player[0] * (width_line + width_walls) + width_line // 2,

    border + player[1] * (width_line + width_walls) + width_line // 2),

    width_line // 2 - 3)
    def delete_player():

    if (player[0], player[1]) == start:

    pygame.draw.circle(window, color_start, (border + player[0] * (width_line + width_walls) + width_line // 2,

    border + player[1] * (width_line + width_walls) + width_line // 2),

    width_line // 2 - 3)

    else:

    pygame.draw.circle(window, color_way, (border + player[0] * (width_line + width_walls) + width_line // 2,

    border + player[1] * (width_line + width_walls) + width_line // 2),

    width_line // 2 - 3)

    if trace:

    pygame.draw.circle(window, color_trace, (border + player[0] * (width_line + width_walls) + width_line // 2,

    border + player[1] * (width_line + width_walls) + width_line // 2),

    width_line // 3 - 3)

    ТЕСТИРОВАНИЕ ПРИЛОЖЕНИЯ

    Критерий

    Не функционирует

    Функционирует с ограничением

    Функционирует полностью

    Запуск приложения







    +

    Передвижения игрока







    +

    Сохранение изменений

    +







    Изменение данных




    +




    Генерация лабиринта




    +





    Таб. 1 Оценка критерий тестирования
    ПЕРСПЕКТИВЫ РАЗВИТИЯ

    • Написание кода по технологии ООП

    • Переработка алгоритма генерации кода, так как данный предоставляет более примитивный вариант лабиринтов

    • Добавление главного меню

    • Изменение настроек генерации лабиринта в главном меню

    • Добавление новых видов лабиринта

    ЗАКЛЮЧЕНИЕ

    Мы считаем, что добились цели. Нами была спроектирована и разработана программа для генерации уникальных вариантов лабиринта.

    При генерации соблюдаются некоторые правила:

    1. Лабиринт не должен иметь циклов, т. е. к каждой клетке лабиринта существует только единственный путь.

    2. В лабиринте должны отсутствовать замкнутые области, к каждой клетке мы должны иметь доступ.

    Проект предполагает доработку идеи. Мы намереваемся сделать следующее:

    • Настройки генерации

    • Выбор генерации

    • Привлекательный интерфейс

    Нами было проведено тестирование нашего продукта. Мы извлекли полезные данные, которые в дальнейшем помогут нам сделать приложение более гибким.

    СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

    Python 3 для начинающих и чайников – уроки программирования [Электронный ресурс] URL: https://pythonworld.ru/ (дата обращения 05.05.2022). — Текст: электронный

    Pygame и разработка игр. [Электронный ресурс] URL: https://younglinux.info/pygame/pygame (дата обращения: 30.04.2022)

    Язык программирования Python: что такое и где используется – Логотип и история [Электронный ресурс] URL: https://all-python.ru/osnovy/yazyk-programmirovaniya.html (дата обращения: 12.05.2022)

    Простое руководство по UML-диаграммам и моделированию баз данных [Электронный ресурс] URL: https://www.microsoft.com/ru-ru/microsoft-365/business-insights-ideas/resources/guide-to-uml-diagramming-and-database-modeling (дата обращения: 12.05.2022)

    Библиотека Pygame [Электронный ресурс] URL: https://pythonru.com/uroki/biblioteka-pygame-chast-1-vvedenie#Создание-шаблона-Pygame (дата обращения: 07.06.2022)


    написать администратору сайта