前言:

制作一个迷宫游戏是一个有趣的编程挑战。首先,我们需要设计一个二维数组来表示迷宫的布局,其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来,我们需生成迷宫。在生成迷宫的过程中,我们需要确保迷宫中有足够的障碍物,以便玩家需要找到一条从起点到终点的路径。最后,我们需要编写代码来显示迷宫,接收用户的输入,更新迷宫的状态,判断游戏是否结束,并提供重新开始的选项。通过完成这个迷宫游戏项目,我们可以提高自己的编程能力和逻辑思维能力。

1. 打印菜单

void menu()

{

printf("|---------------------------------------|\n");

printf("| |\n");

printf("| 走迷宫 |\n");

printf("| 1.play |\n");

printf("| 2.exit |\n");

printf("| |\n");

printf("|---------------------------------------|\n");

}

int main()

{

int input = 0;

do

{

menu();

printf("请选择:");

scanf("%d", &input);

switch (input)

{

case 1:

game();

break;

case 0:

printf("退出游戏!\n");

break;

default:

printf("选择有误,请重新选择!\a\n");

}

} while (input);

}

2. 分析迷宫的组成要素

迷宫的组成要素无非就是:墙、路、入口、出口,根据这些要素我们可以设置一个数组然后随机给其赋值为0,1,2,3,当数组等于0时打印路(这里用空格代替),等于1时打印墙(这里用█代替),等于2打印入口(这里用S代替),等于3时打印出口(这里用E代替)。

3. 实现迷宫的组成要素

因为这些要素的生成都与随机数有关,所以这里就要使用到time函数、srand函数和rand函数来进行随机数的生成。

#include

srand((time(NULL))

int x = rand();

3.1 生成路

给数组初始化为0生成路,后面再用随机数生成。

for (int i = 0; i < SIZE; i++)

{

for (int j = 0; j < SIZE; j++)

{

maze[i][j] = 0;

}

}

3.2 生成围墙

还需要设置围墙将我们的迷宫围起来,防止数组的越界访问。

for (int i = 0; i < SIZE; i++)

{

maze[0][i] = 1;

maze[i][0] = 1;

maze[SIZE - 1][i] = 1;

maze[i][SIZE - 1] = 1;

}

3.3 生成入口和出口

因为入口和出口都是只有一个,所以这里我们需要单独使用随机数生成入口和出口。

int start_x = rand() % SIZE;

int start_y = rand() % SIZE;

maze[start_y][start_x] = 2;

int end_x = rand() % SIZE;

int end_y = rand() % SIZE;

maze[end_y][end_x] = 3;

3.4 防止入口或出口出现在围墙上

这里使用了goto语句

again:

//围墙

for (int i = 0; i < SIZE; i++)

{

maze[0][i] = 1;

maze[i][0] = 1;

maze[SIZE - 1][i] = 1;

maze[i][SIZE - 1] = 1;

}

//设置入口与出口

int start_x = rand() % SIZE;

int start_y = rand() % SIZE;

maze[start_y][start_x] = 2;

int end_x = rand() % SIZE;

int end_y = rand() % SIZE;

maze[end_y][end_x] = 3;

//防止入口或出口出现在围墙上

if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1

|| end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1)

{

goto again;

}

3.5 生成墙

for (int i = 0; i < SIZE; i++)

{

for (int j = 0; j < SIZE; j++)

{

if (maze[i][j] != 2 && maze[i][j] != 3)

{

if (rand() % 4 == 0)

{

maze[i][j] = 1;

}

}

}

}

4. 操作移动

在这里用到了getch()函数,这个函数需要用#include 来进行调用。

#include

int main()

{

while (1)

{

int x = getch();

if (x == 'w')

printf("上\n");

if (x == 'a')

printf("左\n");

if (x == 's')

printf("下\n");

if (x == 'd')

printf("右\n");

}

return 0;

}

do

{

system("cls");

print_maze(maze);

int x = getch();

if (x == 'w')//上

{

if (maze[start_y - 1][start_x] != 1)

{

maze[start_y][start_x] = 0;

start_y--;

maze[start_y][start_x] = 2;

}

}

if (x == 'a')//左

{

if (maze[start_y][start_x - 1] != 1)

{

maze[start_y][start_x] = 0;

start_x--;

maze[start_y][start_x] = 2;

}

}

if (x == 's')//下

{

if (maze[start_y + 1][start_x] != 1)

{

maze[start_y][start_x] = 0;

start_y++;

maze[start_y][start_x] = 2;

}

}

if (x == 'd')//右

{

if (maze[start_y][start_x + 1] != 1)

{

maze[start_y][start_x] = 0;

start_x++;

maze[start_y][start_x] = 2;

}

}

if (maze[end_y][end_x] == 2)

{

printf("恭喜你成功通关!\n");

break;

}

} while (1);

 其中system("cls")函数的作用是清屏,它需要使用#icnldue进行调用。

完整代码 :

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

#include

#include

#define SIZE 45

//打印迷宫

void print_maze(int maze[SIZE][SIZE])

{

for (int i = 0; i < SIZE; i++)

{

for (int j = 0; j < SIZE; j++)

{

if (maze[i][j] == 1)

{

printf("█");

}

else if (maze[i][j] == 2)

{

printf("S");//入口

}

else if (maze[i][j] == 3)

{

printf("E");//出口

}

else

{

printf(" ");

}

}

printf("\n");

}

printf("\n");

}

void generate_maze(int maze[SIZE][SIZE])

{

again:

for (int i = 0; i < SIZE; i++)

{

for (int j = 0; j < SIZE; j++)

{

maze[i][j] = 0;

}

}

//围墙

for (int i = 0; i < SIZE; i++)

{

maze[0][i] = 1;

maze[i][0] = 1;

maze[SIZE - 1][i] = 1;

maze[i][SIZE - 1] = 1;

}

//设置入口与出口

int start_x = rand() % SIZE;

int start_y = rand() % SIZE;

maze[start_y][start_x] = 2;

int end_x = rand() % SIZE;

int end_y = rand() % SIZE;

maze[end_y][end_x] = 3;

//防止入口或出口出现在围墙上

if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1

|| end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1)

{

goto again;

}

//设置迷宫

for (int i = 0; i < SIZE; i++)

{

for (int j = 0; j < SIZE; j++)

{

if (maze[i][j] != 2 && maze[i][j] != 3)

{

if (rand() % 4 == 0)

{

maze[i][j] = 1;

}

}

}

}

//操作S移动

do

{

system("cls");

print_maze(maze);

int x = getch();

if (x == 'w')//上

{

if (maze[start_y - 1][start_x] != 1)

{

maze[start_y][start_x] = 0;

start_y--;

maze[start_y][start_x] = 2;

}

}

if (x == 'a')//左

{

if (maze[start_y][start_x - 1] != 1)

{

maze[start_y][start_x] = 0;

start_x--;

maze[start_y][start_x] = 2;

}

}

if (x == 's')//下

{

if (maze[start_y + 1][start_x] != 1)

{

maze[start_y][start_x] = 0;

start_y++;

maze[start_y][start_x] = 2;

}

}

if (x == 'd')//右

{

if (maze[start_y][start_x + 1] != 1)

{

maze[start_y][start_x] = 0;

start_x++;

maze[start_y][start_x] = 2;

}

}

if (maze[end_y][end_x] == 2)

{

printf("恭喜你成功通关!\n");

break;

}

} while (1);

}

void menu()

{

printf("|---------------------------------------|\n");

printf("| |\n");

printf("| 走迷宫 |\n");

printf("| 1.play |\n");

printf("| 2.exit |\n");

printf("| |\n");

printf("|---------------------------------------|\n");

}

void game()

{

srand(time(NULL));

int maze[SIZE][SIZE];

//打印迷宫

generate_maze(maze);

}

int main()

{

int input = 0;

do

{

menu();

printf("请选择:");

scanf("%d", &input);

switch (input)

{

case 1:

game();

break;

case 0:

printf("退出游戏!\n");

break;

default:

printf("选择有误,请重新选择!\a\n");

}

} while (input);

}

效果图: 

以上就是使用c语言写迷宫的全部内容啦,如果上述内容对你有帮助的话不要忘记点上一个小小的赞和关注呦,期待我们下次再见。

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: