-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Введение
- Задание
- Ход выполнения работы
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.
Требуется рисовать поле в консоли с использованием псевдографики. Ваша программа должна генерировать случайный лабиринт и дать возможность игроку пройти его.
Были подключены 4 стандартные библиотеки языка Си: <stdlib.h>, <stdio.h>, <string.h>, <termios.h>. И созданы 2 константы: WALL (значение для стен), CELL (значение для клеток ), обе константы могут быть легко изменены по надобности, что упрощает редактирование программы.
За инициализацию новых настроек терминала отвечает функция initTermios(), которая с помощью tcgetattr(0, &old) записывает старые настройки в переменную old, а с помощью tcsetattr(0, TCSANOW, ¤tter) устанавливает новые записанные в currentter, в новых настройках буфер у терминала отключен. За считывание символов в программе отвечают кастомная функция getch() которая до считывания символа с помощью initTermios() переводит терминал в неканонический режим и отключает буфер, а после считывания возвращает стандартные настройки терминала с помощью tcsetattr(0, TCSANOW, &old);.
При успешном прохождении лабиринта игрок получает одну из 7 случайных наград за это отвечает функция reward(). Реализованная с помощью генератора псевдослучайных чисел и оператора if().
Для вызова справки реализована функция help(), которая выводит краткую справку об игре. С помощью оператора printf().
Функция game() отвечает за проверку координат игрока во время игры с помощью оператора if(), если игрок столкнулся со стеной то функция выводит сообщение о проигрыше, в случае победы выводит сообщение о выигрыше и вызывает функцию reward() описанную выше.
Игроку на выбор предлагается 4 модели не считая призовых. Функция printf() выводит в консоль возможные варианты. Клавиша нажатая игроком считывается с помощью getch(). Затем с помощью оператора switch() в переменную player соответствующие значение.
Игроку на выбор предлагается 4 модели не считая призовых. Функция printf() выводит в консоль возможные варианты. Клавиша нажатая игроком считывается с помощью getch(). Затем с помощью оператора switch() в переменную wall записывает соответствующие значение.
Игроку на выбор предлагается 2 сложности. С помощью getch() считывается клавиша нажатая игроком. Затем с помощью оператора switch() в переменную complexity записывает соответствующие значение.
Игроку на выбор предлагается 3 размера лабиринта. С помощью getch() считывается клавиша нажатая игроком. Затем с помощью оператора switch() в переменные size.x и size.y записываются соответствующие значения.
Для создания начальной сетки инициализируется переменная maze для двумерного массива в теле main(). После чего, она передается в функцию Generate_initial_grid(). Затем с помощью двух циклов for данный массив заполняется. Если обе координаты нечетные записывается значение CELL, в противном случае WALL.
Лабиринт генерируется с помощью двух циклов for, во вложенном цикле с помощью if() сначала проверяется условие того, что i не равно 0, если оно выполняется то переменная whdig увеличивается на 1. После чего она увеличится на 1. Затем проверяется переменная whdig, если она не равна 1, то выбирается случайное число в зависимости от которого выбирается какое действие будет предпринято, если выпадет один то удалиться стена над текущей клеткой, если 2 то правая стена текущей клетки. Независимо от того выпадет 1 или 2 текущая клетка поменяет свое значение curent.x на 2 переменная whdig обнулиться. Закончиться первая итерация вложенного цикла. После чего текущая клетка увеличит свое значение curent.y на 2, а значение curent.x станет равно 1. Закончиться одна итерация цикла.
С помощью двух циклов for и операторов if выполняется отрисовка лабиринт по двумерному массиву. Если значение массива равно 1 отрисовывается стена, если 0 то клетка, если 2 то игрок и если 4 то финиш.
В теле функции с помощью getch() считывается нажатая игроком кнопка результат записывается в переменную keysArrow. Затем с помощью if() меняется координата игрока на поле в соответствии с нажатой клавишей. После чего вызывается функция Game() описанная выше и значению клетки в которой находиться игрок присваивается 2.
С помощью оператора if() проверяется середина последней строки поля, если значение этой клетки равно 1, то финишем становится клетка левее неё, в противном случае финишем становиться она сама.
В результате выполнения данной работы была реализована игра лабиринт на языке программирования Си. Была создана стабильная программа, выполняющая функции, указанные в задании и выбранные пользователем. Программа выполняет выбранные пользователем действия в соответствии с заданием.
- Керниган Б. и Ритчи Д. Язык программирования Си. М.: Вильямс, 1978 288 c. 2.https://habr.com/ru/post/262345/
truct cell size;
int gamestatus = 1;
int height;