#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//1.绘制游戏地图
void DrawMap(int Map[8][8]) //函数封装,方便使用
{
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 6:printf("♀"); break;//人物
case 7:printf("□"); break;//箱子与目的地重合,显示箱子
case 9:printf("♀"); break;//人和目的地重合,显示人
}
}
printf("\n");
}
}
int main()
{ //要设置多个关卡,需要用到多维数组
int Map[8][8] = {
0,0,1,1,1,0,0,0,
0,0,1,3,1,0,0,0,
0,0,1,0,1,1,1,1,
1,1,1,4,0,4,3,1, //3,4向上
1,3,0,4,6,1,1,1, //4,4人 4,3向左,4,5向右
1,1,1,1,4,1,0,0, //5,4向下
0,0,0,1,3,1,0,0,
0,0,0,1,1,1,0,0,
};
//多次输入,用循环
while (1) {
//清屏
system("cls"); //清屏,需要头文件stdlib.h
DrawMap(Map);
int count = 0;//计算分数
//2.移动角色
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
if (Map[i][j] == 6 || Map[i][j] == 9)//只会退出j循环
break;
}
if (Map[i][j] == 6 || Map[i][j] == 9)//9表示人物与目的地重合
break;
}
printf("角色坐标:(%d,%d)\n", i, j);
//3.从键盘获取字符,确定人物移动的方位
int input = getch();//从键盘那获取字符存储到input中
switch (input)
{
case 'w':
//判断角色前方是空地0或者是目的地3,表示人物可以向上移动
if (Map[i - 1][j] == 0 || Map[i - 1][j] == 3) //行变列不变,即i-1
{
//移动角色
Map[i - 1][j] += 6;//0+6=6,3+6=9
Map[i][j] -= 6;
}
//判断角色的前方是箱子,或者箱子在目的地
else if (Map[i - 1][j] == 4 || Map[i - 1][j] == 7)
{
//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
if (Map[i - 2][j] == 0 || Map[i - 2][j] == 3)
{
Map[i - 2][j] += 4;//0+4=4 3+4=7
Map[i - 1][j] += 2;//4+2=6 7+2=9
Map[i][j] -= 6;//6-6=0 9-6=3
}
}
break;
case 's':
//判断角色后面是空地0或者是目的地3,表示人物可以向下移动
if (Map[i + 1][j] == 0 || Map[i + 1][j] == 3) //行变列不变,即i-1
{
//移动角色
Map[i + 1][j] += 6;//0+6=6,3+6=9
Map[i][j] -= 6;
}
//判断角色的前方是箱子,或者箱子在目的地
else if (Map[i + 1][j] == 4 || Map[i + 1][j] == 7)
{
//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
if (Map[i + 2][j] == 0 || Map[i + 2][j] == 3)
{
Map[i + 2][j] += 4;//0+4=4 3+4=7
Map[i + 1][j] += 2;//4+2=6 7+2=9
Map[i][j] -= 6;//6-6=0 9-6=3
}
}break;
case 'a':
//判断角色左边是空地0或者是目的地3,表示人物可以向左移动
if (Map[i][j - 1] == 0 || Map[i][j - 1] == 3) //行变列不变,即i-1
{
//移动角色
Map[i][j - 1] += 6;//0+6=6,3+6=9
Map[i][j] -= 6;
}
//判断角色的左边是箱子,或者箱子在目的地
else if (Map[i][j - 1] == 4 || Map[i][j - 1] == 7)
{
//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
if (Map[i][j - 2] == 0 || Map[i][j - 2] == 3)
{
Map[i][j - 2] += 4;//0+4=4 3+4=7
Map[i][j - 1] += 2;//4+2=6 7+2=9
Map[i][j] -= 6;//6-6=0 9-6=3
}
}break;
case 'd':
//判断角色右边是空地0或者是目的地3,表示人物可以向右移动
if (Map[i][j + 1] == 0 || Map[i][j + 1] == 3) //行变列不变,即i-1
{
//移动角色
Map[i][j + 1] += 6;//0+6=6,3+6=9
Map[i][j] -= 6;
}
//判断角色的左==右边是箱子,或者箱子在目的地
else if (Map[i][j + 1] == 4 || Map[i][j + 1] == 7)
{
//箱子前面的内容i-2,若为空地0或者目的地3,表示人物可以箱子推着走
if (Map[i][j + 2] == 0 || Map[i][j + 2] == 3)
{
Map[i][j + 2] += 4;//0+4=4 3+4=7
Map[i][j + 1] += 2;//4+2=6 7+2=9
Map[i][j] -= 6;//6-6=0 9-6=3
}
}
break;
}
for (int m = 0; m < 8; m++)
{
for (int n = 0; n < 8; n++)
{
if (Map[m][n] == 7)
count++;
}
}
if (count == 4) {
system("cls");
DrawMap(Map);
printf("你过关!!!\n");
return 0;
}
//DrawMap(Map);
}//}为while的循环
return 0;
}
注:以上代码为推箱子小游戏的最初代码,未配图.