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;
}