#include
//#include
#include
#include
//放音乐 加上下面这个
#include
#pragma comment(lib,"WINMM.LIB")
//-----------------------------------------------------
//空地 0 墙 1 箱子 2 人物 3 目的地 4
//人可以占在目的地上-->3+4-->7
//箱子推到目的地 2+4-->6
//----------------------------------------------------
int map[6][12]={
0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 1,
1, 0, 0, 3, 6, 4, 4, 4, 2, 0, 0, 1,
1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
};//准备地图
IMAGE img[6];//需要6张图片 bmp jpg
int flag;
//----------------------------------------------------------
void drawMap()//自己写一个贴图函数 用来画地图
{
BeginBatchDraw();//防止贴图过快出现的 闪的情况
putimage(0, 0, &img[0]);//加上背景图
for (int i = 0; i < 6; ++i)//行
{
for (int j = 0; j < 12; ++j)//列
{
//单独贴图(有图片才能贴图)
//这个位置需要将图片和地图的元素对应
switch (map[i][j])
{
//case 0:break;
case 1://墙
putimage(j * 50, i * 50, &img[1]);
break;
case 2://箱子
putimage(j * 50, i * 50, &img[2]);
break;
case 3://人
putimage(j * 50, i * 50, &img[3]);
break;
case 4://目的地
putimage(j * 50, i * 50, &img[4]);
break;
case 6://箱子在目的地上
putimage(j * 50, i * 50, &img[5]);
break;
case 7://人在目的地上
putimage(j * 50, i * 50, &img[3]);
break;
default:
break;
}
}
}
EndBatchDraw();
}
void play()//让用户操作
{
//第一步 先找人的位置
int x, y;
for (int i = 0; i < 6; ++i)
{
for (int j = 0; j < 12; ++j)
{
if (map[i][j] == 3 || map[i][j] == 7)
{
x = i;
y = j;
}
}
}
//接下来等待用户操作 wasd getch()直接读取一个按键消息
switch (getch())
{
case'W':
case 'w':
//往上
if (map[x - 1][y] == 0 || map[x - 1][y] == 4)//人的上方是空地或者目的地 可以直接走上去
{
map[x - 1][y] += 3; //人走上去 +3
map[x][y] -= 3; //原位置减掉3
}
else if (map[x - 1][y] == 2 || map[x - 1][y] == 6)//上方是箱子或者箱子在目的地上
{
if (map[x - 2][y] == 0 || map[x - 2][y] == 4)//箱子上方是空地
{
//人走上去 箱子也推上去
map[x - 2][y] += 2;
map[x - 1][y] += 1; //-2 +3
map[x][y] -= 3;
}
}
break;
case 'S':
case 's':
//往下
if (map[x + 1][y] == 0 || map[x + 1][y] == 4)
{
map[x + 1][y] += 3;
map[x][y] -= 3;
}
else if (map[x + 1][y] == 2 || map[x + 1][y] == 6)
{
if (map[x + 2][y] == 0 || map[x + 2][y] == 4)
{
map[x + 2][y] += 2;
map[x + 1][y] += 1;
map[x][y] -= 3;
}
}
break;
case 'A':
case 'a':
//往左
if (map[x][y - 1] == 0 || map[x][y - 1] == 4)
{
map[x][y - 1] += 3;
map[x][y] -= 3;
}
else if (map[x][y - 1] == 2 || map[x][y - 1] == 6)
{
if (map[x][y - 2] == 0 || map[x][y - 2] == 4)
{
map[x][y - 2] += 2;
map[x][y - 1] += 1;
map[x][y] -= 3;
}
}
break;
break;
case 'D':
case 'd':
//往右
if (map[x][y + 1] == 0 || map[x][y + 1] == 4)
{
map[x][y + 1] += 3;
map[x][y] -= 3;
}
else if (map[x][y + 1] == 2 || map[x][y + 1] == 6)
{
if (map[x][y + 2] == 0 || map[x][y + 2] == 4)
{
map[x][y + 2] += 2;
map[x][y + 1] += 1;
map[x][y] -= 3;
}
}
break;
//case 'Q':
//case 'q':
// //直接结束
// exit(0);//stdlib.h
// break;
default:
break;
}
}
void judge()//判断游戏输赢
{
//1 什么情况算输
//2.什么时候算赢
//赢 -->没有箱子 说明所有的箱子全部在目的地上
//输的条件 1. 箱子推到角落上 推不出来
//计时一分钟 超时结束
//按Q 表示退出
//规定30步以内 超过步数 直接结束
flag = 2;//初值
for (int i = 0; i < 6; ++i)//行
{
for (int j = 0; j < 12; ++j)//列
{
if (map[i][j] == 2)
{
flag = 0;
//说明还没有结束
//找到一个箱子 箱子是否在死角
if (map[i - 1][j] == 1 || map[i + 1][j] == 1)//上下至少一堵墙
{
if (map[i][j - 1] == 1 || map[i][j + 1] == 1)//左右至少一堵墙
{
//死角 游戏结束
flag = 1;
return;
}
}
}
}
}
//flag 值表示几种情况
//flag=0 表示游戏可以继续
//flag=1 表示输
//flag=2 表示赢
}
//---------------------------------------------------------------
int main()
{
//while (1)
//{
// printf("%dn", getch());
//}
mciSendString(L"open music.mp3 alias bgm", 0, 0, 0);//打开音乐
mciSendString(L"play bgm repeat", 0, 0, 0);//播放音乐
//alias mp3 给音乐取个名字
//repeat 表示循环播放的意思
initgraph(600,300);//每个方块的大小50*50 窗口大小就是600*300
//加载素材
loadimage(&img[0], L"背景.jpg");
loadimage(&img[1], L"墙.jpg", 50, 50);//加载墙 大小是50*50
loadimage(&img[2], L"箱子.jpg", 50, 50);
loadimage(&img[3], L"人物.jpg", 50, 50);
loadimage(&img[4], L"目的地.jpg", 50, 50);
loadimage(&img[5], L"图片.jpg", 50, 50);//箱子在目的地上
while (1)
{
drawMap();
judge();//判断一下
if (flag != 0) break;//看一下是否结束
play();
}
if (flag == 1)
{ //Windos.h 但是加了图形库头文件 这个windows.h可以不加
MessageBox(GetHWnd(), L"抱歉 输了", L"LOSE", MB_OK);
}
else
{
MessageBox(GetHWnd(), L"YOU WIN!", L"WIN", MB_OK);
}
getchar();
closegraph();
return 0;
}



