@voproser45654
Мечтаю писать на машинных кодах

Нормален ли такой код?

#include <windows.h>
#include <stdio.h>
#include <conio.h>

char map[10][20];
int x = 5, y = 5;
char key;

int main()
{
	for (;;)
	{
		sprintf(map[0], "##########");  // Создание карты
		for (int i = 1; i < 9; ++i) // Создание карты
			sprintf(map[i], "#        #");
		sprintf(map[9], "##########");  // Создание карты
		map[y][x] = '@'; // Символ игрока
		system("cls"); // Очищение экрана
		for (int i = 0; i < 10; ++i)
		{
			printf("%s\n", map[i]); // Отрисовка карты
		}
		key = getch();
		switch (key)
		{
			case 'w':  // Проверка имени клавиши
				if (map[y - 1][x] != '#') // Если следущая клетка в этом направлении не занята, уменьшить переменную
					--y;
				break;
			case 'a':
				if (map[y][x - 1] != '#')
					--x;
				break;
			case 's':
				if (map[y + 1][x] != '#')
					++y;
				break;
			case 'd':
				if (map[y][x + 1] != '#')
					++x;
				break;
		}
	}
}
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
@rPman
'магические константы' - что такое 9 или 10?, мне то понятно но чтобы их понимать нужно изучать код, размеры области нужно определить в переменные или константы, приучаться надо с самого начала к тому чтобы такого не было. То же самое с символами кнопок управления, определи для них переменные, пусть сначала это будут константы, заданные в коде, зато позже будет проще сделать изменяемые настройки.

Отсюда кстати баг, ширина у тебя при определении буфера карты определена как 20 а при заполнении экрана - 'стенками' забита строкой в 10 (хотя ожидалось что будет еще один цикл, заполняющий посимвольно строку).

Правильно - определить буфер как содержимое стенок # и заполнить его однократно вне игрового цикла (тут можно и другие препятствия расставить, например сделать лабиринт), не важно константами или алгоритмом.

А в бесконечном цикле просто выводить содержимое map и уже во время вывода проверять x,y положения 'игрока' и выводить его на экран вместо символа карты. Достоинство такого подхода - карта может состоять не только из символов стенок но и любых других, проходимых.

ну и красивости раскидай по функциям вывод экрана и обработку клавиш управления, так же внутри вызова каждой клавиши проверку на стенку вынеси в вызов отдельной функции (в параметрах - символ карты), возвращает boolean, является ли символ проходимым, благодаря этому позже проще будет добавить другие символы стенок

Следующим шагом x,y определи структурой, если продолжать дальше, в идеологии объектного программирования (да я вижу что это С, но простой вызов метода у структуры/класса сделать можно) в этой структуре определи функции, описывающие действия над персонажем (обработка действий - там функция что разбирает нажатые клавиши, только по логике нав ход должны подаваться не клавиши а константы, определяющие действие, вывод на экран - вернет символ, проверку проходимости точки на карте, т.е. стены, и т.п.) тогда будет проще добавить к примеру второго игрока или NPC и т.п.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Нормален ли такой код?

В каком смысле "нормален"? Он понятен, но не очень хорошо организован и делает какие-то с виду лишние действия.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы