Тема лабораторной
На этом занятии вам предстоит написать еще одну игру - облегчённую версию игры IQ Marathon
Цели
- Научиться работать с файлами.
- Работать с параметрами функций.
- Работать со строками.
- Работать с многомерными полями (массивами)
- Научиться работать с тернарными оператором.
Инструкции
Шаг 1: Part I.
IQ Marathon это простая игра, в которой находится корова. Всегда двигается по направлению своего взгляда до тех пор, пока не наткнётся на преграду. Задача игрока - добавить стрелочки для бурёнки таким образом, чтобы у неё вышло добраться до финиша. На данном этапе вам предстоит написать облегчённую версию этой игры.
Вашим заданием является считать поле игры из файла и поместить в него стрелочки <, v, > и ^ так, чтобы коровка добралась до своей цели.
Задача 1.1
Скачайте базу программы из файла iq_marathon.c.
Задача 1.2
Считайте из файла поле игры в двухразмерный массив world
.
Для этого вы можете использовать следующие функции:
fopen()
Инициализация работы с файлом, его открытиеfclose()
Окончание работы с файлом, его закрытиеfscanf()
Считывание из файла в определённом форматеfgets()
Считывание из файла ряда (строки)fgetc()
Считывание символа из файла
В файле содержатся размеры: ширина (целое число, макс. 30), высота игрового поля (целое число, макс. 20) и само наполнение поля (строка). Эти 3 значения отделены друг от друга пробелом. Пример файла:
10 5 XXXXXXXXXX|X F X X|XXXXX X|X E X|XXXXXXXXXX
Строка в файле представляет само игровое поле:
- X Стена (граница мира)
- W, S, E и N исходная позиция бурёнки - запад, юг, восток и север соответственно.
- F Целевая позиция
- ' ' (пробел) Пустое место на поле
- | Не является частью игрового поля, а отделяет ряды
Решение протестируйте на файле карты maze1.
Задача 1.3
Создайте функцию void draw(const int height, const int width, char world[][width+1])
, с помощью которой будет можно вывести на экран настоящую ситуацию на игровом поле. Решение протестируйте на файле карты maze1.
На данный момент в игровом мире должно быть следующее:
- X Стена (граница мира)
- W, S, E и N исходная позиция бурёнки - запад, юг, восток и север соответственно.
- F Целевая позиция
- ' ' (пробел) Пустое место на поле
В том случае, если в файле maze1 находится следующее:
10 5 XXXXXXXXXX|X F X X|XXXXX X|X E X|XXXXXXXXXX
тогда массив world
можно представить в таком виде:
XXXXXXXXXX
X F X X
XXXXX X
X E X
XXXXXXXXXX
Функция draw()
выведет это на экран в данном виде:
XXXXXXXXXX
X F X X
XXXXX X
X E X
XXXXXXXXXX
Шаг 2: Help Functions
В следующих заданиях займитесь написанием вспомогательных функций, которые помогут в программировании самой игры.
Задача 2.1
Напишите функцию char find_cow(const int height, const int width, int *x, int *y, char world[][width+1])
, которая найдет на игровом поле коровку и узнает её направление.
- Если известна ширина и высота мира, тогда возможно пройти по миру
world
и искать корову. Т.е. нам нужно найти W, S, E или. N. - При нахождении позиции коровы функция запишет её в
*x
и*y
так, чтобы она соответствовала координатам бурёнки на карте. - Также, функция будет возвращать направление коровы (символ).
Задача 2.2
Напишите функцию void find_finish(const int height, const int width, int *finish_x, int *finish_y, char world[][width+1])
, с помощью которой можно будет найти финиш.
- Поскольку нам известна высота и ширина мира, на можно постепенно проходить по миру
world
и искать целевую позицию. В данном случае ищем знак F. - В случае нахождения финиша функция должна записать его координаты в
*finish_x
a*finish_y
. - Функция не возвращает ничего (
void
).
Задача 2.3
Напишите функцию char change_direction(const int x, const int y, const int finish_x, const int finish_y, const char direction)
, которая будет возвращать любой из символов W, S, E, N в зависимости от того, как должно измениться направление коровы.
В параметрах функции находятся актуальные координаты позиции коровки, координаты финиша и актуальное направление коровки. Возвращаемым значением функции должен быть символ, представляющий новое направление для коровы.
Логика нашего варианта игры будет следующая: Корова будет идти всегда прямо, пока не наткнётся на стену (знак X). Затем сменит своё направление. Если настоящее направление коровы W или E, новым направление может быть только S или N согласно тому, в какой стороне финиш. Аналогично, если актуальное направление коровы S или N, новым направление могут быть W и E.
Комментарий
Последние 3 функции мы будем использовать на следующем занятии. Поэтому, необязательно их вызывать в главной функции main()
.
Дополнительные задачи
Задача A.1
Измените вашу реализацию так, чтобы стало возможным работать с файлом, в котором в каждой строке находится другой уровень. В таком случае, игрок сначала должен будет указать номер уровня, для которого игра будет решена (игрок будет считать начиная с 1). Код можно протестировать на данном файлк.
Дополнительные источники
- Файлы и язык Си
- Многомерные массивы в C
- Функция
fopen()
: c-reference, cplusplus.com - Opens a file and returns a file stream associated with that file. - Функция
fclose()
: c-reference, cplusplus.com - Closes the given file stream. - Функция
fscanf()
: c-reference, cplusplus.com - Reads data fromstdin
, interprets it according to format and stores the results into given locations. - Функция
fprintf()
: c-reference, cplusplus.com - Loads the data from the given locations, converts them to character string equivalents and writes the results tostdout
. - Функция
perror()
: c-reference, cplusplus.com - Displays a character string corresponding of the current error tostderr
. - Функция
fgetc()
: c-reference, cplusplus.com - Reads the next character from the given input stream. - Функция
fputc()
: c-reference, cplusplus.com - Writes a character ch to the given output stream stream. - Функция
fgets()
: c-reference, cplusplus.com - Gets a character string from a file stream. - Функция
fputs()
: c-reference, cplusplus.com - Writes a character string to a file stream. - Функция
putchar()
: c-reference, cplusplus.com - Writes a character tostdout
.