用C语言实现走迷宫

本文介绍了一个使用C语言实现的老鼠走迷宫程序。通过二维数组模拟迷宫,利用getch()获取用户输入,控制老鼠移动。当老鼠到达出口时,程序会显示所用时间。迷宫地图由0、1、2表示,分别代表道路、墙壁和老鼠的位置。程序通过清理屏幕和更新坐标来实现动态走动效果。

思考与准备

  首先,要实现老鼠走迷宫的效果,我们可以采用 二维数组 的方式,通过改变老鼠的坐标来实现走动的效果。

  我们额外用到的头文件有:

  • #include<getch.h>
      通过调用getch()函数来识别 上下左右的操作。
  • #include<stdlib.h>
      采用 system(“clear”);清理屏幕,实现视觉上的走动效果。
  • #include<time.h>
      
    time(NULL) ;
    功能:返回自1970-1-1 0:0:0 到当前时间过了多少秒
    记录游戏开始时间与结束时间,相减的到游戏所用时间。

大致思路

  • 1、定义二维数组作为迷宫
       0   <=>    ’ ’   代表可通行的路
       1    <=>   ‘#’   代表墙壁
       2   <=>    ‘@’   代表老鼠
  • 2、定义变量记录老鼠的坐标
  • 3、记录游戏开始时间
  • 4、进入死循环
       1)、清理屏幕 system(“clear”);
       2)、显示迷宫(遍历打印二维数组)
       3)、获取方向键并处理
          判断前方是否是路
            如果是:1、老位置=0;
                   2、新位置=2
                  3、更新老鼠坐标
    4)、判断是否到达出口
    是:获取游戏结束时间
    结束程序

代码

#include<stdio.h>
#include<getch.h>
#include<time.h>
#include<stdlib.h>

int main(int argc,const char* argv[])
{
	char maze[10][10]={
		{1,1,1,1,1,1,1,1,1,1},
		{1,1,1,1,1,1,1,1,1,1},
		{1,1,1,1,1,0,0,0,1,1},
		{1,0,1,1,1,0,1,0,1,1},
		{1,2,1,0,0,0,1,0,1,1},
		{1,0,1,0,1,1,1,0,1,1},
		{1,0,1,0,1,1,1,0,1,1},
		{1,0,0,0,1,1,1,0,1,1},
		{1,1,1,1,1,1,1,0,0,0},
		{1,1,1,1,1,1,1,1,1,1}
		};
	//设置老鼠初始坐标
	int m_x=4,m_y=1;
	
	//h获取开始时间
	time_t start_time = time(NULL);
	
	for(;;) //死循环
	{
		system("clear");
		//打印地图
		for(int i=0;i<10;i++)
		{
			for(int j=0;j<10;j++)
			{
				switch(maze[i][j])
				{
					case 0:printf("  ");break;
					case 1:printf("# ");break;
					case 2:printf("@ ");break;
				}
			}
			printf("\n");
		}
		
		//判断是否到达终点
		if(8==m_x && 9==m_y)
		{
			time_t end_time=time(NULL);
			printf("游戏结束!用时%ds\n",end_time-start_time);
			break;
		}
		
		switch(getch())
		{
			case 183://上
				if(0==maze[m_x-1][m_y])
				{
					maze[m_x-1][m_y]=2;
					maze[m_x][m_y]=0;
					m_x=m_x-1;
				}
				break;
			case 184://下
				if(0==maze[m_x+1][m_y])
				{
					maze[m_x+1][m_y]=2;
					maze[m_x][m_y]=0;
					m_x=m_x+1;
				}
				break;
			case 185://右
				if(0==maze[m_x][m_y+1])
				{
					maze[m_x][m_y+1]=2;
					maze[m_x][m_y]=0;
					m_y=m_y+1;
				}
				break;
			case 186://左
				if(0==maze[m_x][m_y-1])
				{
					maze[m_x][m_y-1]=2;
					maze[m_x][m_y]=0;
					m_y=m_y-1;
				}
				break;
		}
	}
}

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现迷宫游戏,需要以下步骤: 1. 定义迷宫地图 可以使用二维数组来表示迷宫地图,0表示空地,1表示障碍物。 ```c int maze[8][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 0, 1, 1, 1, 0}, {0, 1, 1, 0, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 1, 1, 1, 0, 1, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; ``` 2. 定义当前位置和目标位置 用两个变量来表示当前位置和目标位置。 ```c int current_x = 1; int current_y = 1; int target_x = 6; int target_y = 6; ``` 3. 实现寻路算法 可以使用深度优先搜索或广度优先搜索等算法来寻找通路。这里以广度优先搜索为例。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_QUEUE_SIZE 100 int maze[8][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 0, 1, 1, 1, 0}, {0, 1, 1, 0, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 1, 1, 1, 0, 1, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; int current_x = 1; int current_y = 1; int target_x = 6; int target_y = 6; typedef struct { int x; int y; } point; point queue[MAX_QUEUE_SIZE]; int front = 0; int rear = 0; void enqueue(point p) { if (rear == MAX_QUEUE_SIZE) { printf("Queue overflow!\n"); exit(1); } queue[rear++] = p; } point dequeue() { if (front == rear) { printf("Queue underflow!\n"); exit(1); } return queue[front++]; } int is_empty() { return front == rear; } int is_valid(int x, int y) { return x >= 0 && x < 8 && y >= 0 && y < 8 && maze[x][y] == 0; } void print_path(point prev[][8], int x, int y) { if (x == current_x && y == current_y) { printf("(%d, %d) ", x, y); return; } print_path(prev, prev[x][y].x, prev[x][y].y); printf("(%d, %d) ", x, y); } int main() { point prev[8][8] = {0}; int visited[8][8] = {0}; point start = {current_x, current_y}; enqueue(start); visited[current_x][current_y] = 1; while (!is_empty()) { point p = dequeue(); int x = p.x; int y = p.y; if (x == target_x && y == target_y) { printf("Path found: "); print_path(prev, x, y); printf("\n"); return 0; } if (is_valid(x-1, y) && !visited[x-1][y]) { point next = {x-1, y}; enqueue(next); visited[x-1][y] = 1; prev[x-1][y] = p; } if (is_valid(x+1, y) && !visited[x+1][y]) { point next = {x+1, y}; enqueue(next); visited[x+1][y] = 1; prev[x+1][y] = p; } if (is_valid(x, y-1) && !visited[x][y-1]) { point next = {x, y-1}; enqueue(next); visited[x][y-1] = 1; prev[x][y-1] = p; } if (is_valid(x, y+1) && !visited[x][y+1]) { point next = {x, y+1}; enqueue(next); visited[x][y+1] = 1; prev[x][y+1] = p; } } printf("Path not found!\n"); return 0; } ``` 4. 打印路径 当找到通路时,可以通过回溯法打印出路径。 ```c void print_path(point prev[][8], int x, int y) { if (x == current_x && y == current_y) { printf("(%d, %d) ", x, y); return; } print_path(prev, prev[x][y].x, prev[x][y].y); printf("(%d, %d) ", x, y); } ``` 这样,就可以用C语言实现一个迷宫游戏了。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值