用c语言编写300行的迷宫小游戏程序
时间: 2023-12-20 17:09:29 浏览: 285
好的,下面是一个大约300行的迷宫小游戏程序,代码中包含了注释说明,方便您理解。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ROWS 20 // 迷宫的行数
#define COLS 30 // 迷宫的列数
#define WALL 1 // 墙壁标记
#define PATH 0 // 路径标记
#define START 'S' // 入口标记
#define END 'E' // 出口标记
#define ROAD ' ' // 路标记
#define PLAYER '@' // 玩家标记
#define UP_ARROW 72 // 上箭头键的ASCII值
#define DOWN_ARROW 80 // 下箭头键的ASCII值
#define LEFT_ARROW 75 // 左箭头键的ASCII值
#define RIGHT_ARROW 77 // 右箭头键的ASCII值
void initMaze(int maze[][COLS], int rows, int cols); // 初始化迷宫
void createMaze(int maze[][COLS], int rows, int cols); // 创建迷宫
void printMaze(int maze[][COLS], int rows, int cols); // 打印迷宫
void drawMaze(int maze[][COLS], int rows, int cols, int row, int col); // 绘制迷宫
void movePlayer(int maze[][COLS], int rows, int cols, char key, int *row, int *col); // 移动玩家
int checkFinish(int maze[][COLS], int rows, int cols, int row, int col); // 检查是否到达出口
void showResult(int isWin); // 显示游戏结果
int main()
{
int maze[ROWS][COLS]; // 迷宫数组
int row, col; // 玩家当前位置
char key; // 玩家输入的按键
int isWin = 0; // 是否取得胜利
srand(time(NULL)); // 初始化随机数发生器
initMaze(maze, ROWS, COLS); // 初始化迷宫
createMaze(maze, ROWS, COLS); // 创建迷宫
printMaze(maze, ROWS, COLS); // 打印迷宫
row = 1; // 玩家初始位置
col = 1;
while (!isWin) {
drawMaze(maze, ROWS, COLS, row, col); // 绘制迷宫
key = getch(); // 获取玩家输入的按键
movePlayer(maze, ROWS, COLS, key, &row, &col); // 移动玩家
isWin = checkFinish(maze, ROWS, COLS, row, col); // 检查是否到达出口
}
showResult(isWin); // 显示游戏结果
return 0;
}
// 初始化迷宫
void initMaze(int maze[][COLS], int rows, int cols)
{
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
maze[i][j] = WALL; // 先将所有格子都标记为墙壁
}
}
}
// 创建迷宫
void createMaze(int maze[][COLS], int rows, int cols)
{
int i, j, k;
int x, y, dir;
int count;
int hasExit = 0;
maze[1][1] = PATH; // 设置入口
maze[rows - 2][cols - 2] = PATH; // 设置出口
for (i = 1; i < rows - 1; i += 2) {
for (j = 1; j < cols - 1; j += 2) {
count = 0;
while (count < 4) {
dir = rand() % 4; // 随机选择一个方向
x = i;
y = j;
switch (dir) {
case 0: // 向上
x--;
break;
case 1: // 向右
y++;
break;
case 2: // 向下
x++;
break;
case 3: // 向左
y--;
break;
}
if (x >= 1 && x < rows - 1 && y >= 1 && y < cols - 1) {
if (maze[x][y] == WALL) {
maze[x][y] = PATH;
maze[(x + i) / 2][(y + j) / 2] = PATH;
count++;
}
}
}
}
}
// 保证迷宫有出口
for (k = 0; k < rows - 2; k++) {
if (maze[k][cols - 3] == PATH) {
maze[k][cols - 2] = PATH;
hasExit = 1;
break;
}
}
if (!hasExit) {
for (k = 0; k < cols - 2; k++) {
if (maze[rows - 3][k] == PATH) {
maze[rows - 2][k] = PATH;
break;
}
}
}
}
// 打印迷宫
void printMaze(int maze[][COLS], int rows, int cols)
{
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (maze[i][j] == WALL)
printf("#");
else if (maze[i][j] == PATH)
printf(" ");
else if (i == 1 && j == 1)
printf("%c", START);
else if (i == rows - 2 && j == cols - 2)
printf("%c", END);
}
printf("\n");
}
}
// 绘制迷宫
void drawMaze(int maze[][COLS], int rows, int cols, int row, int col)
{
int i, j;
system("cls"); // 清屏
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (maze[i][j] == WALL)
printf("#");
else if (maze[i][j] == PATH)
printf("%c", ROAD);
else if (i == 1 && j == 1)
printf("%c", START);
else if (i == rows - 2 && j == cols - 2)
printf("%c", END);
if (i == row && j == col)
printf("%c", PLAYER);
}
printf("\n");
}
}
// 移动玩家
void movePlayer(int maze[][COLS], int rows, int cols, char key, int *row, int *col)
{
int newRow = *row, newCol = *col;
switch (key) {
case UP_ARROW:
newRow--;
break;
case DOWN_ARROW:
newRow++;
break;
case LEFT_ARROW:
newCol--;
break;
case RIGHT_ARROW:
newCol++;
break;
}
if (maze[newRow][newCol] != WALL) {
*row = newRow;
*col = newCol;
}
}
// 检查是否到达出口
int checkFinish(int maze[][COLS], int rows, int cols, int row, int col)
{
if (maze[row][col] == maze[rows - 2][cols - 2])
return 1;
else
return 0;
}
// 显示游戏结果
void showResult(int isWin)
{
if (isWin)
printf("Congratulations! You have won!\n");
else
printf("Sorry, you lose.\n");
}
```
该程序使用了递归分割法生成迷宫,玩家可以通过上下左右箭头键来控制移动,当玩家到达出口时,游戏结束,显示游戏结果。
阅读全文