Member 14092627 Ответов: 3

Возникли проблемы с игрой в лабиринт на языке Си


Я делал игру, чтобы ходить по лабиринтам и решать их для проекта колледжа.

Я пытался заставить своего персонажа двигаться, и, как ни странно, он отлично работал в течение примерно 20 минут с перемещением персонажа и подсчетом шагов. После этого он просто перестал работать, и код остался прежним. Это была проблема с компилятором (DEV C++) или код неисправен?

W, A, S, D предназначены для перемещения, но каждый раз, когда я нажимаю один из них, персонаж не перемещается и просто спамит шаги: 0 для каждого клика.

Что я уже пробовал:

Основная часть (игрок-это символ ascii; ex/ey-координаты входа; sx/sy-координаты конца) :
steps=0;

do
{
	do
	{
		key=getch();
		printf("steps: %d", steps);
		if(key=='w')
		{
			steps+=1;
					
			if(*(lab+pointerpoint(ex, ey-2))==track)
			{
				system("cls");
				*(lab+pointerpoint(ex, ey))=track;
				*(lab+pointerpoint(ex, ey-2))=player;
				printlab();						
			}
			else
			{
				steps-=1;
				continue;
			}
		}
		if(key=='s')
		{
			steps+=1;
			if(*(lab+pointerpoint(ex, ey+2))==track)
			{
				system("cls");
				*(lab+pointerpoint(ex, ey))=track;
				*(lab+pointerpoint(ex, ey+2))=player;
				printlab();						
			}
			else
			{
				steps-=1;
				continue;
			}
		}
				
		if(key=='a')
		{
			steps+=1;
		        if(*(lab+pointerpoint(ex-2, ey))==track)
			{
				system("cls");
				*(lab+pointerpoint(ex, ey))=track;
				*(lab+pointerpoint(ex-2, ey))=player;
				printlab();
			}
			else
			{
				steps-=1;
				continue;
			}
		}
		if(key=='d')
		{
			steps+=1;
			if(*(lab+pointerpoint(ex+1, ey))==track)
			{
				system("cls");
				*(lab+pointerpoint(ex, ey))=track;
				*(lab+pointerpoint(ex+2, ey))=player;
				printlab();	
			}
			else
			{
				steps-=1;
				continue;
			}
		}
				
	} while( *(lab+pointerpoint(ex, ey)) != *(lab+pointerpoint(sx, sy)) );
			
} while(key!='q');
		
//The function that generates the maze (N is size):

void labgen(int x, int y)
{
	if(N%2==0) 
		N++;
	sx=N-1; 
	sy=N;

	maze = (char *)malloc(sizeof(char)*N*N+sizeof(char));
	*(maze+pointerpoint(N, N)+1)='\0';

	int i=0;
	for( ; i<N*N ; i++)
	{
		*(maze+i)=wall;
	}

	*(lab+pointerpoint(ex, ey))=player;
	*(lab+pointerpoint(ex, ey+1))=track;
	*(lab+pointerpoint(sx, sy))=track;
	nextblock(ex, ey+1); 
			
}
//Functions that deal with points:

char point(int x, int y)
{
	if(x<1||y<1||x>N||y>N) return '0';
	int point = N*(y-1)+x -1;
	return *(lab+point);
}

int pointerpoint(int x, int y)
{
	int point = N*(y-1)+x -1;
	return point;
}

3 Ответов

Рейтинг:
1

KarstenK

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

Важный совет: научитесь работать со структурами и массивами. Ваш лабиринт-это двумерный (не 3, была опечатка) массив

char *maze = malloc()
char value = maze[x][y];//access

это сделает ваш код более читабельным быстрее и отлаживаемый для тебя. Вы можете каким-то образом просмотреть память в отладчике. Подробнее читайте в документации.

бонус-совет: подумайте о заглавных символах типа "W"


Member 14092627

Спасибо вам за ваш ответ, я обнаружил, что проблема заключается в том, что
if(*(lab+pointerpoint(ex, ey-2))==track) (для W), похоже, что код не вводит это if.

Рейтинг:
1

Patrice T

Цитата:
Это была проблема с компилятором (DEV C++) или код неисправен?

Странности против вашего кода, Вы единственный, кто может сказать, потому что мы не можем запустить ваш код.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

Rick York

Have you noticed how similar the code is for each key entry? That is an indication that you should make a function out of that sequence of code and pass the values that differ for each key to it which appear to be the x and y values. My general rule of thumb is if I see a sequence of code repeated three times (twice for longer sequences) then I seriously consider making it a function. If performance is an issue there are many ways to handle it. For example, if you don't want to push so much data on the stack then wrap all the parameters into a structure and pass a pointer to the structure. That is very, very simple. It is also a much better way to deal with lots of variables that might be declared as global. I have had to maintain a few programs now where numerous data variables were declared as global and I had to make lots of changes when I distributed the processing across multiple threads. It was very annoying so now I am very careful about using global variables. I wrap them into a namespace or data structure called "global" just to make them obvious.