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