I'm trying to create a maze with a mouse inside moving up down left right in 200 moves. I've got everything working besides the fact that it duplicates the heart on the other side(If it exits on the left, it'll be duplicated at the right end) when the heart shape(mouse) when it escapes the maze via the left/right exit.

Can anyone point out what i'm doing wrong?

``````#include <stdio.h>
#include <time.h>

int main(void){

int y[12][12] = {{0},{0}};
int x;
int i;
int j;
int a;
int b;
int c;
int d;
int roll;
int move;

srand(time(NULL));

a=5;
b=5;
y[5][5]=003;

{

for(i=1; i<=10;i++){
y[1][i] = 2;
if(i==5 || i==6)
y[1][i] = 0;}

for(i=1; i<=10;i++){
y[10][i] = 2;
if(i==5 || i==6)
y[10][i] = 0;}

for(i=4; i<=7;i++){
y[7][i] = 2;}

for(j=1; j<=10;j++){
y[j][1] = 2;
if(j==5 || j==6)
y[j][1] = 0;}

for(j=1; j<=10;j++){
y[j][10] = 2;
if(j==5 || j==6)
y[j][10] = 0;}

for(j=1; j<=4;j++){
y[j][4] = 2;}

for(j=4; j<=5;j++){
y[j][8] = 2;}}

for(roll=1;roll<=200;roll++){
move = 1+rand()%4;

if (move==1){
if(y[a-1][b] !=2){
y[a][b] = 0;
y[a-1][b] = 003;
a= a-1;}}

if (move==2){
if(y[a+1][b] !=2){
y[a][b] = 0;
y[a+1][b] = 003;
a=a+1;}}

if (move==3){
if(y[a][b-1] !=2){
y[a][b] = 0;
y[a][b-1] = 003;
b=b-1;}}

if (move==4){
if(y[a][b+1] !=2){
y[a][b] = 0;
y[a][b+1] = 003;
b=b+1;}}

if(a>11 || b>11 || a<0 || b<0){
printf("The Mouse Escaped");
break;}
else{
printf("%d\t%d\n",roll,move);}

for(i=0; i<=12; i++){
for(j=0; j<=12; j++){
if (y[i][j]==003)
printf("%c",003);
else if (y[i][j]==2)
printf("%c",254);
else
printf(" ");}
printf("\n");
}
}
printf("\n");

return 0;
}``````

Any help is greatly appreciated, thanks first. :)

Edited by rlhh: n/a

2
Contributors
4
Replies
6
Views
8 Years
Discussion Span
Last Post by jephthah

Hi. first a comment, then the answer:

the reason why it took 14 hours for someone to reply, is that your code is nearly unreadable. yes, you used code blocks and yes you used indentations, and that's a great start. thank you.

but your lack of a consistent style of bracketing, lack of a consistent style of indentation, and a seeming aversion to using whitespace or giving your variables meaningful names, well, all of that makes it very hard to understand what you're doing.

and if you think this is a pedantic criticism, it's not. unreadable code is worthless in the industry, even if it "works". companies lose millions of dollars and people lose jobs because code is not intelligible to others.

so, i felt sorry for you not getting an answer, but i had to fix your code to make it readable before i could spot the the (very simple) error.

here's your newly formatted code. merry christmas:

``````#include <stdio.h>
#include <time.h>

int main(void)
{

int x, y[12][12] = {{0},{0}};
int roll, move;

int i, j;               // okay, these are loop indexes
int a, b, c, d;         // but these are meaningless names here

srand(time(NULL));

a=5;
b=5;
y[5][5]=003;         // "magic numbers" are not good programming

{  // <--- WHY IS THIS BRACKET HERE?

for(i=1; i<=10;i++)
{
y[1][i] = 2;          // more magic numbers
if(i==5 || i==6)      // okay, it just gets worse from here.
y[1][i] = 0;      // so no more comments about it after this
}

for(i=1; i<=10;i++)
{
y[10][i] = 2;
if(i==5 || i==6)
y[10][i] = 0;
}

for(i=4; i<=7;i++)
{
y[7][i] = 2;
}

for(j=1; j<=10;j++)
{
y[j][1] = 2;
if(j==5 || j==6)
y[j][1] = 0;
}

for(j=1; j<=10;j++)
{
y[j][10] = 2;
if(j==5 || j==6)
y[j][10] = 0;
}

for(j=1; j<=4;j++)
{
y[j][4] = 2;
}

for(j=4; j<=5;j++)
{
y[j][8] = 2;
}

} // <--- END OF MEANINGLESS BRACKET PAIR

for(roll=1;roll<=200;roll++)
{
getchar();
move = 1+rand()%4;

if (move==1)
{
if(y[a-1][b] !=2)
{
y[a][b] = 0;
y[a-1][b] = 003;
a= a-1;
}
}

if (move==2)
{
if(y[a+1][b] !=2)
{
y[a][b] = 0;
y[a+1][b] = 003;
a=a+1;
}
}

if (move==3)
{
if(y[a][b-1] !=2)
{
y[a][b] = 0;
y[a][b-1] = 003;
b=b-1;
}
}

if (move==4)
{
if(y[a][b+1] !=2)
{
y[a][b] = 0;
y[a][b+1] = 003;
b=b+1;
}
}

if(a>11 || b>11 || a<0 || b<0)
{
printf("The Mouse Escaped");
break;
}
else
{
printf("%d\t%d\n",roll,move);
}

for(i=0; i<=12; i++)        // OK... here's the first error
{
for(j=0; j<=12; j++)    // and here's the second.
{
if (y[i][j]==003)
printf("%c",003);

else if (y[i][j]==2)
printf("%c",254);

else
printf(" ");
}
printf("\n");
}
}

printf("\n");

return 0;
}``````

and the error is the equal signs. they need to be removed:

for(i=0; i<=12; i++)
for(j=0; j<=12; j++)

the reason is the variable is declared as `int y[12][12]` . the index runs from 0-11, not 0-12.

Edited by jephthah: n/a

Nice :)

Sorry about the lack of the proper programming style.

I've just started learning programming and I'm not been really taught the proper way to do it.

Thanks for the answer and I'll read up on proper programming styles.

Would this be a lot better?

``````#include <stdio.h>
#include <time.h>

int main(void){

int y[11][11] = {{0},{0}};
int i,j;             //loop indexes
int a,b;             //position of the mouse(x,y)
int roll,move;

srand(time(NULL));

a=5;                // y = 5
b=5;                // x = 5
y[5][5]=002;        //starting position of the mouse, 002 = ASCII code of character

for(i=1; i<=10;i++) //loop to set the first row of the maze, 5 & 6 as the exit
{
y[1][i] = 254;    //254 is the ASCII code for the blocks
if(i==5 || i==6)
y[1][i] = 0;
}

for(i=1; i<=10;i++) //loop to set the last row of the maze, 5 & 6 as the exit
{
y[10][i] = 254;
if(i==5 || i==6)
y[10][i] = 0;
}

for(i=4; i<=7;i++)  //loop to set the 7th row of the maze
{
y[7][i] = 254;
}

for(j=1; j<=10;j++) //loop to set the first column of the maze, 5 & 6 as the exit
{
y[j][1] = 254;
if(j==5 || j==6)
y[j][1] = 0;
}

for(j=1; j<=10;j++) //loop to set the last column of the maze, 5 & 6 as the exit
{
y[j][10] = 254;
if(j==5 || j==6)
y[j][10] = 0;
}

for(j=1; j<=4;j++) //loop to set the 4th column of the maze
{
y[j][4] = 254;
}

for(j=4; j<=5;j++)  //loop to print the 8th column of the maze
{
y[j][8] = 254;
}

for(roll=1;roll<=200;roll++)    //200 random moves
{
move = 1+rand()%4;

if (move==1)            //1 = up
{
if(y[a-1][b] !=254)
{
y[a][b] = 0;
y[a-1][b] = 002;
a= a-1;
}
}

if (move==2)            //2 = down
{
if(y[a+1][b] !=254)
{
y[a][b] = 0;
y[a+1][b] = 002;
a=a+1;
}
}

if (move==3)          //3 = left
{
if(y[a][b-1] !=254)
{
y[a][b] = 0;
y[a][b-1] = 002;
b=b-1;
}
}

if (move==4)        //4 = right
{
if(y[a][b+1] !=254)
{
y[a][b] = 0;
y[a][b+1] = 002;
b=b+1;
}
}

if(a>=11 || b>=11 || a<=0 || b<=0)      //When the mouse gets out of the maze
{
printf("The Mouse Escaped\n\n");
break;
}
else
{
printf("%d\t%d\n",roll,move);       //roll = number of moves the mouse took, move = direction of current movement

for(i=0; i<=11; i++)
{
for(j=0; j<=11; j++)
{
if (y[i][j]==002)
printf("%c",002);

else if (y[i][j]==254)
printf("%c",254);

else
printf(" ");
}
printf("\n");
}
printf("\n");
}
}
return 0;
}``````

Sorry about the lack of the proper programming style.

I've just started learning programming and I'm not been really taught the proper way to do it.

yeah, and i was a little overly-bitchy. overall, you're on the right track: everyone has to learn somewhere, and "proper coding style" comes mostly with experience.

so, don't stress it too much. you're doing as well as a beginner should be expected. just keep it in mind that "readable code" is just as important as "working code". here's a few general principles:

-- make your variable names meaningful. don't be afraid to use long variable names. use capital letters and/or underscores to make multi-word variable names.

-- use #defines to name your "magic numbers", rather than just sticking them in the code with the hope that you'll remember what they mean 6 months later.

-- there's no single "best" bracketing style, but you do need to pick one bracketing style and always stick with it. don't mix it up.

-- make judicious use of whitespace to separate code functionality.

-- learn to make you code modular by creating subroutines that do particular tasks, rather than lumping everything under main()

Would this be a lot better?

not especially. fundamentally this is the same thing. any differences are matters of degree.

it still uses "magic numbers" that are cryptic and error-prone, variable names that are similarly meaningless to the reader, and is still a huge string of code that has no modularity or separation of functionality.

here's one quick suggestion:

``````#define MAX_NUM_COLUMNS         12
#define MAX_NUM_ROWS            12

#define MOUSE_CHAR              002
#define SPACE_CHAR              032
#define WALL_CHAR               254

int maze_board[MAX_NUM_COLUMNS][MAX_NUM_ROWS];  // contains maze elements
int x_pos, y_pos;                               // indexes position in maze

// ....
// ....

for (x_pos = 0; x_pos < MAX_NUM_COLUMNS; x_pos++)
{
// ....
for (y_pos = 0; y_pos < MAX_NUM_ROWS, y_pos++)
{
// ....
prinf("%c", maze_board[x_pos][y_pos];
// ....
// etc.``````

now this is just a start. there would be a lot more to do along these lines, especially with regard to describing the maze and printing the walls and moving the mouse. that is where a lot of the real confusion is.

what you really need to do is modularize the various maze setup and printing operations as their own subroutines, and have them called from main() as functions.

.

Edited by jephthah: n/a