HW помогите! 1. Сделать лабиринт 50х50. 2. Подсчитайте время и шаги. 3. Попросите пользователя перемещаться по лабиринту. 4. Лабиринт должен быть случайным, но иметь 2 входа, 2 выхода и как минимум 1 путь от любого входа до любого выхода. 5. Используйте указатели.
Основная проблема. Попытка сделать лабиринт разрешимым - я пробовал рекурсивный подход в глубину, но, похоже, он не работает, и я не уверен, как это исправить ( или что-то пошло не так).
Я боролся с этим заданием всю неделю ... Я думаю, что мне удалось почти выполнить его - просто нужна помощь в прокладывании пути через лабиринт (т.е. путь без X от начальной позиции к выходу. Я еще не пытался использовать в нем указатели ... думал, что напишу код, пока не смогу заставить его работать, затем использую указатели, чтобы сделать его там, где я могу ( пока их не устраивает) Любой совет будет принят с благодарностью!
#include <stdio.h>
#include <stdlib.h> // for the code to refresh screen
#include <time.h> // for the code to track time
int x =50 ; //SIZE rows
int y =50 ; //SIZE columns
void print(char a[x][y]); //print the maze
void drawoutline(char b[x][y]); // draw the outline of the maze
void initial(char b[x][y]); //initial the maze to all 'X'
void walk(char b[x][y]); //maze solvin starting
void recursive(int r, int c, int b[x][y]); // idea for 'depth-first algorithim' to setting a clear path
int main(void) // MAIN function start:
{
srand(time(NULL));
char b[x][y];
initial(b); // draw the maze
drawoutline(b); //draw boundary for the maze
recursive(15,0,b);
print(b);
walk(b);
return 0;
} // end MAIN
void print(char a[x][y])
{
system("@cls||clear");//refresh screen
for(int i=0;i<x;i++)//using loop to print maze characters
{
for(int j=0;j<y;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}
printf("\n"); // new line to serpeate maze from text
} // end print
void drawoutline(char b[x][y]) // function draw maze
{
for(int i=0;i<y-1;i++)//draw first -
{
b[0][i]='-';
}
for(int i=0;i<y-1;i++)//draw last -
{
b[x-1][i]='-';
}
for(int i=0;i<x;i++)//draw left | wall
{
b[i][0]='|';
}
for(int i=0;i<x;i++)//draw right |
{
b[i][y-1]='|';
}
// possible to make lines 79-91 neater/with pointers?
b[14][0] = ' '; // 2 Start gates ( 2 entrances to maze)
b[15][0] = ' ';
b[16][0] = ' ';
b[34][0] = ' ';
b[35][0] = ' ';
b[36][0] = ' ';
// 2 ending gates
b[14][49] = ' ';
b[15][49] = ' ';
b[16][49] = ' ';
b[34][49] = ' ';
b[35][49] = ' ';
b[36][49] = ' ';
} // end function drawoutline
void initial(char b[x][y]) //set maze to 'X' or space
{
for(int i=0;i<x;i++) // random number geeneator?? (to make maze desgin, Xs are walls, empty space are walkways )
// This seems to work for genrating the maze wuthot the solution path, but maybe better way if recurvive clear path isnt working ???
{
for(int j=0;j<y;j++)
{
if (rand() % 2 == 0){
b[i][j]=' ';
}
else{
b[i][j]='X';
}
}
}
b[15][0] = 0;
} // end function intital RECURSIVE attempting:
void recursive(int r, int c, int b[x][y])
{
int Direction = 1 + (rand() % 4) ; // creates random number 1,2,3 or 4
while ( (r != 34) && (r != 35) && ( r != 36) && (r != 14) && (r != 15) && ( r != 16) && (c != 49 ) ) {
// while POSTION in NOT on EXIT (one of the two exits)
if (Direction == 1){ // Up, two cells -x
b[r-2][c] = ' ';
b[r-1][c] = ' ';
recursive(r - 2, c,b);
}
else if ( Direction == 2){ // Right, two cells +y
b[r][c + 2] = ' ';
b[r][c + 1] = ' ';
recursive(r, c + 2,b);
}
else if( Direction == 3){ // Down +x
b[r+2][c] = ' ';
b[r+1][c] = ' ';
recursive(r + 2, c,b);
}
else{ // LEFT -y
b[r][c - 2] = ' ';
b[r][c - 1] = ' ';
recursive(r, c - 2,b);
}
}
}
void walk(char b[x][y])
{
time_t start = time(NULL);
int xx=15,yy=0; //start point
char player = '0'; //player symbol
char choice;//choice to move (W,A,S,D) or '1' to quit.
char temp;//to record symbol for current location
temp = b[xx][yy];//record symbol for current location
b[xx][yy]=player;//set current location to player symbol ( 0 means player position.
print(b);//print
int sum = 0;
while(choice !='1')//quit if choice == 1
{
time_t end = time(NULL);
printf("Time elapsed: %d seconds\n", (end - start));
printf("Steps taken: %d\n",sum);
printf("Type w,a,s, or d then 'enter' to move the cursor '0' to the end. You can't pass through walls (X's) \n");
scanf("%c",&choice); //get choice for swtich
switch (choice)
{
case 'w':
if((xx-1)>=0 && b[xx-1][yy]==' ')//(xx-1)>=0 to test if it would walk to the outside of map. b[xx-1][yy]==' ' makes sure that the player can't pass through the wall
{
b[xx][yy]=temp;//current location changes to the record saved in temp
temp = b[xx-1][yy];//use temp to record next location
b[xx-1][yy]=choice;//next location changes to player symbol
xx=xx-1;//change x value for current position
sum++;
}
break;
case 'a':
if((yy-1)>=0 && b[xx][yy-1]==' ')//(yy-1)>=0 to test if it would walk to the outside of map. b[xx][yy-1]==' ' makes sure that the player can't pass through the wall
{
b[xx][yy]=temp;
temp = b[xx][yy-1];
b[xx][yy-1]=choice;
yy=yy-1;
sum++;
}
break;
case 's':
if((xx+1)<x && b[xx+1][yy]==' ')//same as above
{
b[xx][yy]=temp;
temp = b[xx+1][yy];
b[xx+1][yy]=choice;
xx=xx+1;
sum++;
}
break;
case 'd':
if((yy+1)<y && b[xx][yy+1]==' ')//same as above
{
b[xx][yy]=temp;
temp = b[xx][yy+1];
b[xx][yy+1]=choice;
yy=yy+1;
sum++;
}
break;
default:printf("try again\n");// defualt to 'no correct input'
}
b[xx][yy]=player;
print(b); //print after each move
}
b[xx][yy]=temp; //reset current postion symbol to '0'
} // end function walk