#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
/*
二维数组充当游戏地图的功能
人: ♀ 5
箱子: ★ 4
目的地: ☆ 3
箱子推到目的地: ● 7
墙: ■ 1
空地: 0
人在目的上显示: 5+3:8
*/
int main()
{
//设计地图
int cas = 0;
int map[8][8] =
{
1,1,1,1,1,1,1,1,
1,3,4,0,0,4,3,1,
1,0,1,0,0,1,0,1,
1,0,1,0,0,1,0,1,
1,0,1,5,0,1,0,1,
1,0,1,0,0,1,0,1,
1,3,4,0,0,4,3,1,
1,1,1,1,1,1,1,1
};
while (1)
{
//画地图
for (int i = 0; i < 8; i++)
{
for (int j = 0;j < 8;j++)
{
switch (map[i][j])
{
case 0:
printf(" "); //汉字符号占用两个字节
break;
case 1:
printf("■");
break;
case 3:
printf("☆");
break;
case 4:
printf("★");
break;
case 5:
case 8:
printf("♀");
break;
case 7:
printf("●");
break;
}
}
printf("\n");
}
//找人的坐标---->数组的查找 5和8的值
int i, j;
for (i = 0;i < 8;i++)
{
for (j = 0;j < 8;j++)
{
if (map[i][j] == 5 || map[i][j] == 8)
{
goto next;
}
}
}
next:
;
//胜负判断,采用标记法
int flag = 1;
for (int i = 0;i < 8;i++)
{
for (int j = 0;j < 8;j++)
{
if (map[i][j] == 4)
{
flag = 0;
goto DOWN;
}
}
}
DOWN:
;
if (flag == 1)
{
printf("GameOver!\n");
break;
}
//按键控制的框架
char userKey = _getch();
switch (userKey)
{
case 'W':
case 'w':
case 72: //向上
if (map[i - 1][j] == 0 || map[i - 1][j] == 3)
{
map[i - 1][j] += 5; //向上走的时候,人来啦
map[i][j] -= 5; //原来的位置,人走啦
}
if (map[i - 1][j] == 4 || map[i - 1][j] == 7) //箱子(4) 或者 箱子和目的地在一起(7)
{
if (map[i - 2][j] == 0 || map[i - 2][j] == 3) //空地(0) 或者 目的地(3)
{
map[i][j] -= 5; // -5 人走啦
map[i - 1][j] += 1; // +5 -4 人来啦,箱子走啦
map[i - 2][j] += 4; // +4 箱子来啦
}
}
break;
case 'S':
case 's':
case 80: //向下
if (map[i + 1][j] == 0 || map[i -+ 1][j] == 3)
{
map[i + 1][j] += 5; //向下走的时候,人来啦
map[i][j] -= 5; //原来的位置,人走啦
}
if (map[i + 1][j] == 4 || map[i + 1][j] == 7) //箱子(4) 或者 箱子和目的地在一起(7)
{
if (map[i + 2][j] == 0 || map[i + 2][j] == 3) //空地(0) 或者 目的地(3)
{
map[i][j] -= 5; // -5 人走啦
map[i + 1][j] += 1; // +5 -4 人来啦,箱子走啦
map[i + 2][j] += 4; // +4 箱子来啦
}
}
break;
case 'A':
case 'a':
case 75: //向左
if (map[i][j - 1] == 0 || map[i][j - 1] == 3)
{
map[i][j - 1] += 5; //向左走的时候,人来啦
map[i][j] -= 5; //原来的位置,人走啦
}
if (map[i][j - 1] == 4 || map[i][j - 1] == 7) //箱子(4) 或者 箱子和目的地在一起(7)
{
if (map[i][j - 2] == 0 || map[i][j - 2] == 3) //空地(0) 或者 目的地(3)
{
map[i][j] -= 5; // -5 人走啦
map[i][j - 1] += 1; // +5 -4 人来啦,箱子走啦
map[i][j - 2] += 4; // +4 箱子来啦
}
}
break;
case 'D':
case 'd':
case 77: //向右
if (map[i][j + 1] == 0 || map[i][j + 1] == 3)
{
map[i][j + 1] += 5; //向右走的时候,人来啦
map[i][j] -= 5; //原来的位置,人走啦
}
if (map[i][j + 1] == 4 || map[i][j + 1] == 7) //箱子(4) 或者 箱子和目的地在一起(7)
{
if (map[i][j + 2] == 0 || map[i][j + 2] == 3) //空地(0) 或者 目的地(3)
{
map[i][j] -= 5; // -5 人走啦
map[i][j + 1] += 1; // +5 -4 人来啦,箱子走啦
map[i][j + 2] += 4; // +4 箱子来啦
}
}
break;
}
system("cls");
}
return 0;
}
**
- 运行截图:
**
**
- 总结:
**
1.使用清屏cls语句时,需要引入stdlib.h头文件;
2.使用_getch()函数时,需要引入conio.h头文件.
getch()函数:从控制台获取一个字符,但不在控制台上显示,不用按下回车键就可以读取,区别于getchar()函数得按下回车键(enter)
2.1. 上 下 左 右 键是两个字节的,getch()只能读取一个字节,所以得使用两次getch()
2.2. 键盘上的上 下 左 右键的ASKII码对照: 上(72) 下(80) 左(75) 右(77)