#include<easyx.h>
#include<conio.h>
//推箱子项目 10行10列的图片 ,假设每一个图片是正方形(边长50)
//1、打开窗口
//2、定义图片数组,把图片加载进图片数组里
//3、通过图片数组,把图片贴在图形窗口;定义一个三维数组(作为多个地图),定义辅助数组:把当前关卡的地图装进辅助数组里面
//4、人物的移动
//5、关卡的胜利判断
IMAGE img[5];//定义图片数组
//0表示空地 1表示墙 2表示人 3表示箱子 4表示目的地 6表示人在目的地上 7表示箱子在目的地上
int arr[3][10][10] =
{
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 4, 0, 0, 0, 0, 0, 0, 1,
1, 0, 3, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 2, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
},
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 1, 0, 0, 0, 0, 1, 1,
1, 0, 4, 4, 4, 0, 4, 0, 0, 1,
1, 3, 3, 3, 0, 3, 3, 0, 1, 1,
1, 4, 3, 0, 2, 0, 3, 0, 0, 1,
1, 1, 0, 0, 0, 3, 0, 0, 1, 1,
1, 1, 0, 4, 4, 4, 0, 1, 1, 1,
1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 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,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 2, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 0, 3, 3, 3, 0, 0, 1, 1,
1, 0, 0, 4, 4, 4, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
}
};
int tempMap[10][10];//辅助数组 保存当前所在关卡的地图
int level = 0;//表示关卡//函数功能:初始化地图
void initMap()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
tempMap[i][j] = arr[level][i][j];//在这个三位数组中level,可以理解成第几个二维数组(从0开始)
}
}
}//函数功能:把图片加载进图片数组里
void picLoadArr()
{
loadimage(&img[0], "1.jpg", 50, 50);//墙
loadimage(&img[1], "2.jpg", 50, 50);//人
loadimage(&img[2], "3.jpg", 50, 50);//箱子
loadimage(&img[3], "4.jpg", 50, 50);//目的地
loadimage(&img[4], "7.jpg", 50, 50);//箱子在目的地上
}
//函数功能:把图片贴在图形界面上
void drawMap()
{
BeginBatchDraw();//开始批量绘图
//putimage(200, 300, &img[0]);//贴墙
//putimage(200, 400, &img[1]);//贴人
//putimage(300, 300, &img[2]);//贴箱子
//putimage(300, 400, &img[3]);//贴目的地
//putimage(400, 400, &img[4]);//贴箱子在目的地上 //图形窗口的x坐标:与列下标j有关,50*j
//图形窗口的y坐标:与行下标i有关,50*i for (int i = 0; i < 10; i++)//i作为二维数组的行下标
{
for (int j = 0; j < 10; j++)//j作为二维数组的列下标
{
switch (tempMap[i][j])
{
//贴墙
case 1:
putimage(j*50, i*50, &img[0]);
break; //贴人物
case 2:
case 6:
putimage(j * 50, i * 50, &img[1]);
break; //贴箱子
case 3:
putimage(j * 50, i * 50, &img[2]);
break; //贴目的地
case 4:
putimage(j * 50, i * 50, &img[3]);
break;
//贴 箱子在目的地上
case 7:
putimage(j * 50, i * 50, &img[4]);
break;
} }
} EndBatchDraw();//结束批量绘制
}
//函数功能:人物移动
void move()
{
int X = 0, Y = 0;//X用来保存人物的行下标 Y用来保存人物的列下标
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
if (tempMap[i][j] == 2 || tempMap[i][j]==6)//找到了人
{
X = i;
Y = j;
break;
}
}
}
//通过改变二维数组元素的值,来形成一个人物移动的效果
//通过按键,判断人物的移动方向 asdw
//conio.h _getch()函数:等待从键盘输入一个字符,不需要和getchar函数一样以回车结束
switch (_getch())
{
//人物往上移动
case 'w':
if (tempMap[X - 1][Y] == 0 || tempMap[X - 1][Y] == 4)//人的上面是空地,或者是目的地
{
tempMap[X - 1][Y] = tempMap[X - 1][Y] + 2;
tempMap[X][Y] = tempMap[X][Y] - 2;
}
if (tempMap[X - 1][Y] == 3 || tempMap[X - 1][Y] == 7)//如果人的上面是箱子,或者人的上面是箱子在目的地上
{
if (tempMap[X - 2][Y] == 0 || tempMap[X - 2][Y] == 4)//如果箱子的上面是空地,或者是目的地
{
tempMap[X][Y] -= 2; //完全等价 tempMap[X][Y] = tempMap[X][Y] - 2;
tempMap[X - 1][Y] -= 1;
tempMap[X - 2][Y] += 3;
}
}
break;
case 's'://人物往下移动
if (tempMap[X + 1][Y] == 0 || tempMap[X + 1][Y] == 4)//如果人的下面是空地,或者是目的地,人就可以往下走
{
tempMap[X][Y] -= 2;
tempMap[X + 1][Y] += 2;
}
if (tempMap[X + 1][Y] == 3 || tempMap[X + 1][Y] == 7)//如果人的下面是箱子,或者人的下面是箱子在目的地上
{
if (tempMap[X + 2][Y] == 0 || tempMap[X + 2][Y] == 4)//如果箱子的下面是空地,或者是目的地
{
tempMap[X][Y] -= 2;
tempMap[X + 1][Y] -= 1;
tempMap[X + 2][Y] += 3;
}
}
break;
case 'a'://人物往左移动
if (tempMap[X][Y-1] == 0 || tempMap[X][Y-1] == 4)//如果人的左面是空地,或者是目的地,人就可以往左走
{
tempMap[X][Y] -= 2;
tempMap[X][Y-1] += 2;
}
if (tempMap[X][Y-1] == 3 || tempMap[X][Y-1] == 7)//如果人的左面是箱子,或者人的左面是箱子在目的地上
{
if (tempMap[X][Y-2] == 0 || tempMap[X][Y-2] == 4)//如果箱子的左面是空地,或者是目的地
{
tempMap[X][Y] -= 2;
tempMap[X][Y-1] -= 1;
tempMap[X][Y-2] += 3;
}
}
break;
case 'd'://人物往右移动
if (tempMap[X][Y + 1] == 0 || tempMap[X][Y + 1] == 4)//如果人的右面是空地,或者是目的地,人就可以往右走
{
tempMap[X][Y] -= 2;
tempMap[X][Y + 1] += 2;
}
if (tempMap[X][Y + 1] == 3 || tempMap[X][Y + 1] == 7)//如果人的右面是箱子,或者人的右面是箱子在目的地上
{
if (tempMap[X][Y + 2] == 0 || tempMap[X][Y + 2] == 4)//如果箱子的右面是空地,或者是目的地
{
tempMap[X][Y] -= 2;
tempMap[X][Y + 1] -= 1;
tempMap[X][Y + 2] += 3;
}
} }
}
//函数功能:判断是否通过关卡
void isWin()
{
//找不到箱子(3),就是通过关卡
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
if (tempMap[i][j] == 3)//只要辅助数组里面有一个箱子(3),就继续推箱子
{
return;
}
}
}
//如果函数到这里还没有结束,表示已经通过了当前关卡 //如果到最后一关
if (level==2)//选择结束还是重新开始
{//MessageBox消息盒子:弹出一个窗口
int temp=MessageBox(GetHWnd(), "是否开始第一关", "提示", MB_YESNO);//窗口弹出两个按钮,一个是(6),一个否(7)
if (temp == IDYES)//如果我们按下的是:是
{
level = 0;//重新开始
initMap();//重新加载地图
}
else
{
exit(0);//退出程序
} }
//否则就继续下一关卡
else
{
level++;
initMap();//重新加载地图
}
} int main()
{
initgraph(500, 500);//初始化窗口
picLoadArr();//把图片加载进图片数组里
level = 2;
initMap();//把当前的关卡,装进辅助地图中 while (1)
{
isWin();//判断是否胜利
cleardevice();//清除屏幕
drawMap();//画地图
move();//人物的移动
cleardevice();//清除屏幕
drawMap();//画地图 }
closegraph();//关闭窗口
return 0;
}