闯关式迷宫

本文介绍了一个使用C语言实现的可交互式迷宫游戏,玩家通过控制角色'※'移动,目标是让角色与出口'☆'相遇形成'⊙'来过关。通过键盘控制,实现人(2)与出口的结合,游戏包含多个关卡并设有胜负判断和规则说明。
摘要由CSDN通过智能技术生成

C语言可闯关式迷宫

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int  map[3][9][8] =
{
	//0:空的 1:▆ :墙
	//2:※		//人
	//3:☆    //出口	
	//5:⊙	  //人(2)和出口(3)在一起
	//为让多种情况使用一种算法
	//数学艺术
	{
	1, 1, 1, 1, 1, 1, 1, 1,
	2, 0, 1, 0, 0, 1, 1, 1,
	1, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 1, 0, 1, 1, 1, 1,
	1, 0, 1, 0, 1, 0, 0, 1,
	1, 0, 1, 0, 1, 1, 1, 1,
	1, 0, 0, 1, 0, 0, 0, 1,
	1, 1, 0, 0, 0, 0, 0, 3,
	1, 1, 1, 1, 1, 1, 1, 1
	},
	{
	1, 1, 1, 1, 1, 1, 1, 1,
	2, 0, 1, 1, 0, 1, 1, 1,
	1, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 1, 0, 1, 1, 1, 1,
	1, 0, 1, 0, 0, 1, 0, 1,
	1, 1, 1, 1, 0, 0, 1, 1,
	1, 0, 0, 0, 1, 0, 1, 1,
	1, 1, 0, 0, 1, 0, 0, 3,
	1, 1, 1, 1, 1, 1, 1, 1
	},
	{
	1, 1, 1, 1, 1, 1, 1, 1,
	2, 0, 0, 1, 0, 1, 1, 1,
	1, 1, 0, 1, 0, 0, 0, 1,
	1, 0, 0, 1, 0, 1, 0, 1,
	1, 0, 1, 0, 0, 1, 0, 1,
	1, 0, 0, 0, 1, 0, 0, 1,
	1, 1, 0, 1, 1, 0, 1, 1,
	1, 1, 0, 0, 1, 0, 0, 3,
	1, 1, 1, 1, 1, 1, 1, 1
	}
};
int cas = 0;	//为0表示第一关
void drawMap()
{
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (j == 0)
				printf("\t\t");
			switch (map[cas][i][j])
			{
				//	0:空的 1:▆ :墙
			case 0:
				printf("  ");
				break;
			case 1:
				printf("▆");
				break;
				//2:※	  //人
			case 2:
				printf("※");
				break;
				//3:☆   //出口			 	
			case 3:
				printf("☆");
				break;
				//5:⊙		  //人(2)和出口(3)在一起		
			case 5:
				printf("⊙");
				break;
			}
		}
		printf("\n");
	}
}
//按键处理
void keyDown()
{
	//分析按键过程
	//定位人在哪里
	//人有两种情况:第一个是:人,第二个:人在出口处
	int i, j;
	int main();
	for (i = 0; i < 9; i++)
	{
		for (j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 2 || map[cas][i][j] == 5)
			{
				break;
			}
		}
		if (map[cas][i][j] == 2 || map[cas][i][j] == 5)
		{
			break;
		}
	}
	char ch = _getch();	//看不见的字符输入,+头文件 conio.h
	switch (ch)
	{
		//72 80   75 77
	case 'w':
	case 'W':
	case 72:
		//下一个地方等于空地或者是出口 能走
		if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
		{
			//2+3=5 :表示出口和人在一起
			//新地方(map[i-1][j])人(2)来了
			map[cas][i - 1][j] += 2;
			//老地方(map[i][j])人(2)走了
			map[cas][i][j] -= 2;
		}
		break;

	case 's':
	case 'S':
	case 80:
		//下一个地方等于空地或者是出口 能走
		if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
		{
			//2+3=5 :表示出口和人在一起
			//新地方(map[i-1][j])人(2)来了
			map[cas][i + 1][j] += 2;
			//老地方(map[i][j])人(2)走了
			map[cas][i][j] -= 2;
		}
		break;

	case 'a':
	case 'A':
	case 75:
		//下一个地方等于空地或者是出口 能走
		if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
		{
			//2+3=5 :表示出口和人在一起
			//新地方(map[i-1][j])人(2)来了
			map[cas][i][j - 1] = map[cas][i][j - 1] + 2;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] = map[cas][i][j] - 2;
			//j+=2  j=j+2 
		}
		break;

	case 'D':
	case 'd':
	case 77:
		//下一个地方等于空地或者是出口 能走
		if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
		{
			//2+3=5 :表示出口和人在一起
			//新地方(map[i-1][j])人(2)来了
			map[cas][i][j + 1] += 2;
			//老地方(map[i][j])人(2)走了
			map[cas][i][j] -= 2;
		}
		break;
	case 27:
		system("cls");
		main();
		break;
	}
}

//胜负判断
//用什么判断胜负: 人到达出口
int gameOver()
{
	int count = 0;
	//所有的地方找一遍
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 5)
				count++;
		}


	}
	return count;
}
int main();
void explation()
{
	void menu();
	system("cls");
	printf("\t\t*****************************************\n");
	printf("\t\t******************游戏规则***************\n");
	printf("\t\t*****************************************\t\t\n");
	printf("(1)玩家可以选择上、下、左、右或W、A、S、D去移动人'※'\n");
	printf(" (2)按任意键进入游戏开始页面(在英文状态下))\n");
	printf(" (3)按任意键进入第一关(在英文状态下)\n");
	printf(" (4)当人'※'和出口'☆'在一起形成'⊙',当前关卡通过\n");
	printf(" (5)在过了每一关后,按任意键进入下一关(在英文状态下)\n");
	printf(" (6)游戏过程中按“ESC”返回主菜单)\n");
	printf("请按任意键返回主菜单...\n");
	getch();
	system("cls");
	main();
}

void close()
{
	exit(0);
}
void menu()
{
	int n;
	printf("\t\t*****************************************\t\t\n");//输出游戏菜单的图形
	printf("\t\t*              1、开始游戏              *\n");
	printf("\t\t*              2、游戏规则              *\n");
	printf("\t\t*              3、退出游戏              *\n");
	printf("\t\t*****************************************\n");
	printf("请输入1或2或3:[ ]\b\b");
	scanf("%d", &n);
	system("cls");
	switch (n)
	{
	case 1:
		keyDown();//游戏开始函数
		break;
	case 2:
		explation();//游戏规则函数
		break;
	case 3:
		close();//关闭游戏函数
		break;
	}
}
int main()
{
	menu();//调用主菜单函数
	while (1)
	{
		printf("\t\t*****************************************\t\t\n");//输出界面
		printf("\t\t*****************************************\n");
		printf("\t\t******************游戏开始***************\n");
		printf("\t\t*****************************************\n");
		printf("\t\t*****************************************\t\t\n");
		printf("\t\t************按“ESC”返回主菜单**********\n");
		printf("\t\t      请按方向键或W、A、S、D移动人'※'\n");//输出操作提示语句
		printf("\t\t\t---------------------\n\t\t\t");
		printf("\n\n\t\t   第【%d】关\n", cas + 1);
		drawMap();
		if (gameOver())
		{
			cas++;
			if (cas == 3)
				break;
		}
		keyDown();
		system("cls");
	}
	system("cls");
	printf(" \n");
	printf("\t\t****************************************\t\t\n");
	printf("\t\t****************************************\n");
	printf("\t\t****************恭喜你通关了************\n");
	printf("\t\t****************************************\t\t\n");
	printf("\t\t****************************************\n");
	printf(" \n");
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值