項目使用Easy-X庫.
效果圖:

項目中使用到的圖檔素材請添加本人q3492625357 擷取
完整源碼:
// 推箱子.cpp : 此檔案包含 "main" 函數。程式執行将在此處開始并結束。
//
//author:See QQ3492625357 圖檔素材請添加QQ
#include <iostream>
#include<graphics.h>
#include<conio.h>
#define BX 140
#define BY 150
#define WIDTH 60
IMAGE imgs[5];
typedef struct MAN //人物坐标
{
int x, y;
}Man;
Man man;
int map[5][5] =
{
0,0,0,0,0,
0,2,1,1,0,
0,1,4,1,0,
0,0,1,3,0,
0,0,0,0,0
};
enum Flag
{
UP,
DOWN,
LEFT,
RIGHT
};
void change(int x,int y,int img) //更改地圖
{
map[x][y] = img;
putimage(BX + y * WIDTH, BY + x * WIDTH, &imgs[img]);
}
void ManMove(enum Flag flag)
{
if (flag == UP)
{
if (man.x - 1 > 0 && map[man.x - 1][man.y] == 1)
{
change(man.x, man.y, 1);
change(--man.x, man.y, 3);
}
if (man.x - 1 > 0 && map[man.x - 1][man.y] == 4 && map[man.x - 2][man.y]==1)
{
change(man.x, man.y, 1);
change(--man.x, man.y, 3);
change(man.x - 1, man.y, 4);
}
if (man.x - 1 > 0 && map[man.x - 1][man.y] == 4 && map[man.x - 2][man.y] == 2)
{
change(man.x, man.y, 1);
change(--man.x, man.y, 3);
change(man.x - 1, man.y, 4);
}
}
if (flag == DOWN)
{
if (map[man.x + 1][man.y] == 1)
{
change(man.x, man.y, 1);
change(++man.x, man.y, 3);
}
if (map[man.x + 1][man.y] == 4 && map[man.x + 2][man.y] == 1)
{
change(man.x, man.y, 1);
change(++man.x, man.y, 3);
change(man.x +1, man.y, 4);
}
if (map[man.x + 1][man.y] == 4 && map[man.x + 2][man.y] == 2)
{
change(man.x, man.y, 1);
change(++man.x, man.y, 3);
change(man.x + 1, man.y, 4);
}
}
if (flag == LEFT)
{
if (man.y-1>0&&map[man.x][man.y-1] == 1)
{
change(man.x, man.y, 1);
change(man.x, --man.y, 3);
}
if (man.y - 1 > 0&&map[man.x ][man.y-1] == 4 && map[man.x ][man.y-2] == 1)
{
change(man.x, man.y, 1);
change(man.x, --man.y, 3);
change(man.x, man.y-1, 4);
}
if (man.y - 1 > 0 && map[man.x][man.y - 1] == 4 && map[man.x][man.y - 2] == 2)
{
change(man.x, man.y, 1);
change(man.x, --man.y, 3);
change(man.x , man.y - 1, 4);
}
}
if (flag == RIGHT)
{
if ( map[man.x][man.y + 1] == 1)
{
change(man.x, man.y, 1);
change(man.x, ++man.y, 3);
}
if ( map[man.x][man.y + 1] == 4 && map[man.x][man.y + 2] == 1)
{
change(man.x, man.y, 1);
change(man.x, ++man.y, 3);
change(man.x , man.y + 1, 4);
}
if (map[man.x][man.y + 1] == 4 && map[man.x][man.y + 2] == 2)
{
change(man.x, man.y, 1);
change(man.x, ++man.y, 3);
change(man.x, man.y + 1, 4);
}
}
}
int main()
{
IMAGE bk,img_win;
initgraph(600, 600);
loadimage(&bk, L"blackground.bmp", 600, 600, 1);
loadimage(&img_win, L"win.png", 600, 600, 1);
putimage(0, 0, &bk);
settextstyle(18, 0, L"楷體");
settextcolor(RGB(255,255,0));
outtextxy(150, 75, L"控制:a:左 w:上 s:下 d:右 q:退出");
loadimage(&imgs[0], L"wall_right.bmp", WIDTH, WIDTH, 1);
loadimage(&imgs[1], L"floor.bmp", WIDTH, WIDTH, 1);
loadimage(&imgs[2], L"des.bmp", WIDTH, WIDTH, 1);
loadimage(&imgs[3], L"man.bmp", WIDTH, WIDTH, 1);
loadimage(&imgs[4], L"box.bmp", WIDTH, WIDTH, 1);
for (int i=0; i < 5 ; i++)
for (int j = 0; j < 5; j++)
{
if (map[i][j] == 3)
{
man.x = i;
man.y = j;
}
putimage(BX + j * WIDTH, BY + i * WIDTH, &imgs[map[i][j]]);
}
bool quit = false;
do
{
bool win = true;
if (_kbhit())
{
switch (_getch())
{
case 'a':
ManMove(LEFT);
break;
case 'w':
ManMove(UP);
break;
case 's':
ManMove(DOWN);
break;
case 'd':
ManMove(RIGHT);
break;
case 'q':
quit = true;
break;
default:
break;
}
}
for (int i=0;i<5;i++)
for (int j = 0; j < 5; j++)
{
if (map[i][j] == 2) //隻要還有目标 說明沒有通關
win = false;
}
if (win)
{
putimage(0,0, &img_win);
system("pause");
quit = true;
}
} while (!quit);
closegraph();
}