Skip to content
Indiora edited this page Jun 6, 2020 · 7 revisions

СОДЕРЖАНИЕ

Введение

  1. Задание
  2. Ход выполнения работы
    2.1 Подключение стандартных библиотек языка Си 2.2 Инициализация новых настроек для терминала 2.3 Генерация награды 2.4 Вызов помощи 2.5 Проверка координат игрока 2.6 Вызов справки 2.7 Выбор размера лабиринта 2.8 Генерация начальной сетки для лабиринта 2.9 Выбор сложности игры 2.10 Выбор модели персонажа 2.11 Выбор модели стен 2.12 Генерация лабиринта 2.13 Отрисовка движения Заключение Список используемых источников Приложение A Приложение Б

ВВЕДЕНИЕ

Цель работы: реализовать игру лабиринт на языке программирования Си. Реализация программы должна содержать функции стандартной библиотеки языка Си. Разработка велась на базе операционной системы Ubuntu.

1. ЗАДАНИЕ

ВАРИАНТ 4

Требуется рисовать поле в консоли с использованием псевдографики. Ваша программа должна генерировать случайный лабиринт и дать возможность игроку пройти его.

2​. ХОД ВЫПОЛНЕНИЯ РАБОТЫ

2.1. Подключение стандартных библиотек языка Си

Были подключены 4 стандартные библиотеки языка Си: <stdlib.h>, <stdio.h>, <string.h>, <termios.h>. И созданы 2 константы: WALL (значение для стен), CELL (значение для клеток ), обе константы могут быть легко изменены по надобности, что упрощает редактирование программы.

2.2. Инициализация новых настроек считывания для терминала функция initTermios()

За инициализацию новых настроек терминала отвечает функция initTermios(), которая с помощью tcgetattr(0, &old) записывает старые настройки в переменную old, а с помощью tcsetattr(0, TCSANOW, &currentter) устанавливает новые записанные в currentter, в новых настройках буфер у терминала отключен. За считывание символов в программе отвечают кастомная функция getch() которая до считывания символа с помощью initTermios() переводит терминал в неканонический режим и отключает буфер, а после считывания возвращает стандартные настройки терминала с помощью tcsetattr(0, TCSANOW, &old);.

2.3. Генерация награды reward()

При успешном прохождении лабиринта игрок получает одну из 7 случайных наград за это отвечает функция reward(). Реализованная с помощью генератора псевдослучайных чисел и оператора if().

2.4 Вызов помощи функция Help()

Для вызова справки реализована функция help(), которая выводит краткую справку об игре. С помощью оператора printf().

2.5 Проверка координат игрока Game()

Функция game() отвечает за проверку координат игрока во время игры с помощью оператора if(), если игрок столкнулся со стеной то функция выводит сообщение о проигрыше, в случае победы выводит сообщение о выигрыше и вызывает функцию reward() описанную выше.

2.6 Выбор модели игрока Player_choose()

Игроку на выбор предлагается 4 модели не считая призовых. Функция printf() выводит в консоль возможные варианты. Клавиша нажатая игроком считывается с помощью getch(). Затем с помощью оператора switch() в переменную player соответствующие значение.

2.7 Выбор модели стен функция Wall_choose()

Игроку на выбор предлагается 4 модели не считая призовых. Функция printf() выводит в консоль возможные варианты. Клавиша нажатая игроком считывается с помощью getch(). Затем с помощью оператора switch() в переменную wall записывает соответствующие значение.

2.8 Выбор сложности игры функция complexity_Choose()

Игроку на выбор предлагается 2 сложности. С помощью getch() считывается клавиша нажатая игроком. Затем с помощью оператора switch() в переменную complexity записывает соответствующие значение.

2.9 Выбор размера лабиринта функция Size_choose()

Игроку на выбор предлагается 3 размера лабиринта. С помощью getch() считывается клавиша нажатая игроком. Затем с помощью оператора switch() в переменные size.x и size.y записываются соответствующие значения.

2.10 Генерация начальной сетки для лабиринта функция Generate_initial_grid().

Для создания начальной сетки инициализируется переменная maze для двумерного массива в теле main(). После чего, она передается в функцию Generate_initial_grid(). Затем с помощью двух циклов for данный массив заполняется. Если обе координаты нечетные записывается значение CELL, в противном случае WALL.

2.11 Генерация лабиринта функция Generate_maze()

Лабиринт генерируется с помощью двух циклов for, во вложенном цикле с помощью if() сначала проверяется условие того, что i не равно 0, если оно выполняется то переменная whdig увеличивается на 1. После чего она увеличится на 1. Затем проверяется переменная whdig, если она не равна 1, то выбирается случайное число в зависимости от которого выбирается какое действие будет предпринято, если выпадет один то удалиться стена над текущей клеткой, если 2 то правая стена текущей клетки. Независимо от того выпадет 1 или 2 текущая клетка поменяет свое значение curent.x на 2 переменная whdig обнулиться. Закончиться первая итерация вложенного цикла. После чего текущая клетка увеличит свое значение curent.y на 2, а значение curent.x станет равно 1. Закончиться одна итерация цикла.

2.12 Отрисовка лабиринта функция Maze_drawing()

С помощью двух циклов for и операторов if выполняется отрисовка лабиринт по двумерному массиву. Если значение массива равно 1 отрисовывается стена, если 0 то клетка, если 2 то игрок и если 4 то финиш.

2.13 Перемещения игрока функция Character_management()

В теле функции с помощью getch() считывается нажатая игроком кнопка результат записывается в переменную keysArrow. Затем с помощью if() меняется координата игрока на поле в соответствии с нажатой клавишей. После чего вызывается функция Game() описанная выше и значению клетки в которой находиться игрок присваивается 2.

2.14 Выбор клетки для финиша функция finish()

С помощью оператора if() проверяется середина последней строки поля, если значение этой клетки равно 1, то финишем становится клетка левее неё, в противном случае финишем становиться она сама.

ЗАКЛЮЧЕНИЕ

В результате выполнения данной работы была реализована игра лабиринт на языке программирования Си. Была создана стабильная программа, выполняющая функции, указанные в задании и выбранные пользователем. Программа выполняет выбранные пользователем действия в соответствии с заданием.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Керниган Б. и Ритчи Д. Язык программирования Си. М.: Вильямс, 1978 288 c. 2.https://habr.com/ru/post/262345/

truct cell size; int gamestatus = 1; int height;