数据结构课程写的迷宫
以前把代码上传过,通过上传资源,后来才发现上传的资源CSDN收费下载……
现在放到文章里
去年,2020年写的代码
记忆中,accessMazePrime和move函数是在网上搜的代码
生成随机迷宫,设置迷宫难度,Prim算法查找迷宫出口,用户自己走迷宫这几个功能。
/**
* LF 迷宫
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h> // 用来定位,刷新指定位置 局部刷新
#define random(x) (rand()%x) // 生成不重复的随机数
int ** initMaze(int row, int column); //优雅 // 分配地址,初始化迷宫
void accessMazePrime(int row, int column, int **maze); // 生成随机迷宫
void printMaze(int row, int column, int **maze); // 打印整个迷宫,局部刷新前调用用来初始化
void freeMaze(int **maze, int row); // 释放二维迷宫数组空间
void move(int row, int column, int **maze); //迷宫移动 // 用户控制迷宫移动 wasd
void showMain(); // 显示主函数界面
int ** initVisited(int **visited, int row, int column); // 初始化一个二维数组,元素值为0或1,标记是否访问过该结点
void pathFind(int **visited, int **maze, int x, int y, int *DA_x, int *SW_y, int row, int column, int *pFindExitFlag); // 查找迷宫路径,寻找出口
int selectOption(int smaller, int bigger); // 两个参数表示范围,要求:smaller < 返回值 < bigger
void mazeGameDescription(); // 游戏说明
void mazeGame(); // 系统创建迷宫,集成了初始化迷宫,生成迷宫,寻找迷宫出口等功能,在主函数中调用
int selectSize(); // 选择迷宫尺寸 -- 难度
void showSelectSizeMenu(); // 显示难度菜单
void showUserOrSystemPathFindMenu(); // 显示开始游戏的方式,计算机进行游戏,用户进行游戏,在选定难度之后调用
void systemFindMazeExit(int row, int column, int **maze); // 计算机查找迷宫出口
void setMazeBeginAndEnd(int row, int column, int **maze); // 设置迷宫的起点和终点
void gotoxy(int x, int y); // 定位指定位置,坐标从(0,0)开始
void putcharMaze (int mazeNum); // 根据二位数组元素的值打印指定的字符
void gotoxyAndPutchar (int x, int y, int **maze); // 定位指定的坐标(x,y),并根据maze[y][x]的值打印指定的字符,用于局部刷新,gotoxy()和putcharMaze()的集成
// 猜测不malloc,地址不变
// malloc 本质上是重新分配了地址空间,所以指针变量指向的地址空间会改变,所以要return 地址给指针变量
// 而其他情况,例如对分配好地址空间的变量,用指针在函数之间传递,改变指针指向的变量的值,其地址不变,不需要return返回变量地址,因为地址并没有改变
// 对指针在函数间传递有了更深的理解,不再是简单的 传递指针,修改变量的值,指针指向的变量不变,有了更深层次的理解,又回归了概念。收获满满。
int main(void)
{
int option; // 选项
while (1) {
showMain(); // 调用主函数菜单
option = selectOption(0,2); // 获取用户选择
switch (option) {
case 1:mazeGame();break; // 迷宫游戏
case 2:mazeGameDescription();break; // 游戏说明
case 0:return 0; // 退出程序
default:;
}
printf("按任意键继续");
getch();
}
}
void gotoxyAndPutchar (int x, int y, int **maze)
{
// 局部刷新
gotoxy(x,y); // 调用函数定位,坐标为(x,y),(0,0)开始
putcharMaze(maze[y][x]); // 根据(x,y)位置对应的maze[y][x]值,输出对应的字符
}
void gotoxy(int x, int y)
{
//COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标
COORD cor;
//句柄
HANDLE hout;
//设定我们要定位到的坐标
cor.X = x;
cor.Y = y;
//GetStdHandle函数获取一个指向特定标准设备的句柄,包括标准输入,标准输出和标准错误。
//STD_OUTPUT_HANDLE正是代表标准输出(也就是显示屏)的宏
hout = GetStdHandle(STD_OUTPUT_HANDLE);
//SetConsoleCursorPosition函数用于设置控制台光标的位置
SetConsoleCursorPosition(hout, cor);
}
void mazeGame()
{
int size; // 迷宫尺寸 迷宫难度
int endFlag = 0;
while (1) {
showSelectSizeMenu();
size = selectSize();
if (size != 0) {
// 判断是否进行游戏,是,选择难度;否,返回主菜单
int row, column;
int **maze;</