10. неделя

IQ Марафон, Part I.

Поле, строки, файлы, параметры функций

Тема лабораторной

На этом занятии вам предстоит написать еще одну игру - облегчённую версию игры IQ Marathon

Цели

  1. Научиться работать с файлами.
  2. Работать с параметрами функций.
  3. Работать со строками.
  4. Работать с многомерными полями (массивами)
  5. Научиться работать с тернарными оператором.

Инструкции

Шаг 1: Part I.

IQ Marathon это простая игра, в которой находится корова. Всегда двигается по направлению своего взгляда до тех пор, пока не наткнётся на преграду. Задача игрока - добавить стрелочки для бурёнки таким образом, чтобы у неё вышло добраться до финиша. На данном этапе вам предстоит написать облегчённую версию этой игры.

Игра IQ Marathon
Рис. 1: Игра 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). Код можно протестировать на данном файлк.

Дополнительные источники

  1. Файлы и язык Си
  2. Многомерные массивы в C
  3. Функция fopen(): c-reference, cplusplus.com - Opens a file and returns a file stream associated with that file.
  4. Функция fclose(): c-reference, cplusplus.com - Closes the given file stream.
  5. Функция fscanf(): c-reference, cplusplus.com - Reads data from stdin, interprets it according to format and stores the results into given locations.
  6. Функция fprintf(): c-reference, cplusplus.com - Loads the data from the given locations, converts them to character string equivalents and writes the results to stdout.
  7. Функция perror(): c-reference, cplusplus.com - Displays a character string corresponding of the current error to stderr.
  8. Функция fgetc(): c-reference, cplusplus.com - Reads the next character from the given input stream.
  9. Функция fputc(): c-reference, cplusplus.com - Writes a character ch to the given output stream stream.
  10. Функция fgets(): c-reference, cplusplus.com - Gets a character string from a file stream.
  11. Функция fputs(): c-reference, cplusplus.com - Writes a character string to a file stream.
  12. Функция putchar(): c-reference, cplusplus.com - Writes a character to stdout.

Видео