Can't make the object collide with the walls in my maze game.

Can anyone tell me how do I make my object stop as it approaches the wall. It goes through the wall all the time.
Here is my code.

#include<iostream>
#include<conio.h>
#include<Windows.h>
#include<stdio.h>
#include<string.h>
using namespace std;


//Global Variables
char inputKey;
void gotoXY(int, int);
void movement();


int mapArrayOne[20][35] =
{
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1 },
{ 1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1 },
{ 1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1 },
{ 1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1 },
{ 1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1 },
{ 1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1 },
{ 1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1 },
{ 1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1 },
{ 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1 },
{ 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
{ 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1 }
};

int mapArrayTwo[30][50] =
{
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 },
{ 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3 },
{ 3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,3,3,2,2,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,3,2,2,3,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,2,2,2,3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3 },
{ 3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3 },
{ 3,2,2,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,2,2,2,2,2,2,2,2,2,3,3,3,2,2,3,3,3,3,3,3,3,3,3 },
{ 3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,3,3,3,2,2,3,3,3,3,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,2,2,3,3,3,3,3,2,2,3,3,2,2,3,3,3,2,2,2,2,2,2,3,3,3,3,3,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,2,2,3,3,3,2,2,2,2,3,3,2,2,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,2,2,3,3,3,2,2,3,3,3,3,2,2,3,3,3,2,2,3,2,2,2,3,3,3,3,3,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,2,2,2,2,2,2,2,2,2,3,3,3,3,2,2,3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,3,3,2,2,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,3,3,2,2,2 },
{ 3,2,2,3,3,2,2,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,2,2,3,3,3,3,3,2,2,3,3,2,2,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3 },
{ 3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,2,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,2,2,3,3,3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3 },
{ 3,2,2,3,3,2,2,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3 },
{ 3,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,2,2,2,3,3,3,3,3,3,3 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 }
};

void displaymaze2()
{
for (int row = 0; row < 30; row++)
{
for (int column = 0; column < 50; column++)
{
switch (mapArrayTwo[row][column])
{

case 2:
cout << " ";
break;
case 3:
cout << "@";
break;
}

}

cout << endl;
}
}

void displaymaze1()
{
for (int counter = 0; counter < 20; counter++)
{
for (int newcounter = 0; newcounter < 35; newcounter++)
{
switch (mapArrayOne[counter][newcounter])
{
case 0:
cout << " ";
break;
case 1:
cout << "$";
break;
}

}
cout << endl;
}

}

void gotoXY(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void movement()
{
int x = 1;
int y = 2;
int xBefore = 1;
int yBefore = 2;

while (true)
{
gotoXY(xBefore, yBefore);
cout << " ";
gotoXY(x, y);
cout << char(1);
inputKey = _getch();
xBefore = x;
yBefore = y;

if (inputKey == 'w')
{

y -= 1;

}


else if (inputKey == 's')
{


y += 1;
}

else if (inputKey == 'a')
{




x -= 1;

}

else if (inputKey == 'd')
{

x += 1;
}


/*Should I do it like this
if(mapArrayOne[y][x] == 1)
{ x=xBefore;
y=yBefore;
} I tried this method but it doesn't work. The object only moves one space to the right and stops even though there is no wall. Also how should I move on to the next maze as i finish the first maze?*/







}
}





int main()
{
int d = 0;

cout << "----------THE MAZE GAME----------" << endl;
cout << endl;
cout << "----THE RULES----" << endl;
cout << "1) Reach to the end of the maze in a desired amount of time" << endl;
cout << "2) There will be two mazes in the game" << endl;
cout << "3) The sooner you finish the maze the more points you get" << endl;
cout << "4) You can also get bonus points depending on your difficulty" << endl;
cout << "5) You will complete the game if you clear both mazes in a desired amount of time" << endl;
cout << endl;
cout << endl;
cout << "----DIFFICULTY----" << endl;
cout << "Press from 1-3 to choose difficulty" << endl;
cout << "1) Easy (90 seconds)" << endl;
cout << "2) Medium (45 seconds)" << endl;
cout << "3) Difficult (30 seconds)" << endl;

cin >> d;

switch (d)
{
case 1:
cout << "Get ready to play" << endl;
cout << endl;
system("CLS");
cout << "-----MAZE 1-----" << endl;

displaymaze1();
movement();



break;
case 2:
cout << "Get ready to play" << endl;
cout << endl;
break;
case 3:
cout << "Get ready to play" << endl;
cout << endl;
break;
}



return 0;

}

Last edited on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (inputKey == 'w')
{
   y -= 1;
}

else if (inputKey == 's')
{
    y += 1;
}
else if (inputKey == 'a')
{
    x -= 1;
}

else if (inputKey == 'd')
{
    x += 1;
}

It doesn't appear that you do any bounds checking.

You have to check to make sure that your character isn't going to go into a wall once they move {WASD}.

Something like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const char Wall = '1';
if (inputKey == 'w')
{
    if (mapArrayOne[y-1][x] != Wall)
        y -= 1;
}

else if (inputKey == 's')
{
    if (mapArrayOne[y+1][x] != Wall)
        y += 1;
}
else if (inputKey == 'a')
{
    if (mapArrayOne[y][x-1] != Wall)
        x -= 1;
}

else if (inputKey == 'd')
{
    if (mapArrayOne[y][x+1] != Wall)
        x += 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void movement()
{
	int x = 1;
	int y = 2;
	int xBefore = 1;
	int yBefore = 2;
	
	while (true)
	{
		gotoXY(xBefore, yBefore);
		cout << " ";
		gotoXY(x, y);
		cout << char(1);
		inputKey = _getch();
		// Check to see if there is a wall or exit
		xBefore = x;
		yBefore = y;
		
		if (inputKey == 'w')
			{y -= 1;}
		else if (inputKey == 's')
			{y += 1;}
		else if (inputKey == 'a')
			{x -= 1;}
		else if (inputKey == 'd')
			{x += 1;}
	}
}
Last edited on
I tried Ganado's code, it didn't work for me. I think something is missing but haven't looked at it to figure out what.

I wanted to suggest another thing. There needs to be some way to exit.

1
2
		else if (inputKey == 'x')
			{cout << string(50, '\n');cout << "\n\n\n\n\n\n\n Alas, it was a trap, You Died!\n\n\n\n\n\n\n" << endl;break;}


Registered users can post here. Sign in or register to post.