#include<graphics.h> //图形库
#include<iostream>
#include<string>
#include<Windows.h>
#include<conio.h>
using namespace std;
#define RATIO 61
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
//控制键 上、下、左、右控制方向,’q’退出
#define KEY_UP 'w'
#define KEY_LEFT 'a'
#define KEY_RIGHT 'd'
#define KEY_DOWN 's'
#define KEY_QUIT 'q'
#define LINE 9
#define COLUMN 12
#define START_X 100
#define START_Y 150
#define isValid(pos) pos.x >=0 && pos.x<LINE && pos.y>=0 && pos.y<COLUMN
enum _PROPS
{
WALL, //墙
FLOOR, //地板
BOX_DES, //箱子目的地
MAN, //小人
BOX, //箱子
HIT, //箱子到达目的地
ALL // 所有个数
};
//游戏控制方向
enum _DIRECTION
{
UP,
DOWN,
LEFT,
RIGHT
};
struct _POS
{
int x; //小人所在的二维数组的行
int y; //小人所在的二维数组的列
};
IMAGE images[ALL];
struct _POS man; //小人在二维数组里面的位置
//游戏地图
int map[LINE][COLUMN] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },
{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
/****************************************
*判断游戏是否结束,如果不存在任何箱子目的地,就代表游戏结束
*输入:无
* 返回值:true 游戏结束;false 游戏继续
*****************************************/
bool isGameOver()
{
for (int i = 0; i < LINE; i++)
{
for (int j = 0; j < COLUMN; j++)
{
if (map[i][j]==BOX_DES)
{
return false;
}
}
}
return true;
}
void gameOverScene(IMAGE*bg)
{
putimage(0, 0, bg);
settextcolor(WHITE);
RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };
settextstyle(20, 0, _T("宋体"));
drawtext(_T("牛逼!"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
/****************************************
*改变游戏地图视图中一格对应道具并重新显示
*输入:
* line - 道具在地图数组的行下标
* column- 道具在地图数组的列下标
* prop -道具的类型
*****************************************/
void changeMap(struct _POS*pos, enum _PROPS prop)
{
map[pos->x][pos->y] = prop;
putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}
/***************************************
*实现游戏四个方向(上、下、左、右)的控制
*输入:
*direct:-人前进方向
*输出:无
****************************************/
void gameControl(enum _DIRECTION direct)
{
struct _POS next_pos = man;
struct _POS next_next_pos = man;
switch (direct)
{
case UP:
next_pos.x--;
next_next_pos.x -= 2;
break;
case DOWN:
next_pos.x++;
next_next_pos.x += 2;
break;
case LEFT:
next_pos.y--;
next_next_pos.y -= 2;
break;
case RIGHT:
next_pos.y++;
next_next_pos.y += 2;
break;
}
if ( isValid(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR)
{
changeMap(&next_pos, MAN); //前进一格
changeMap(&man, FLOOR);
man = next_pos;
}
else if (isValid(next_next_pos) && map[next_pos.x][next_pos.y] == BOX)
{
//两种情况,箱子前面是地板或者是目的地
if (map[next_next_pos.x][next_next_pos.y] == FLOOR)
{
changeMap(&next_next_pos, BOX);
changeMap(&next_pos, MAN); //前进一格
changeMap(&man, FLOOR);
man = next_pos;
}
else if ( map[next_next_pos.x][next_next_pos.y] == BOX_DES)
{
changeMap(&next_next_pos, HIT);
changeMap(&next_pos, MAN); //前进一格
changeMap(&man, FLOOR);
man = next_pos;
}
}
}
int main()
{
IMAGE bg_img;
//搭台唱戏
initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH, SCREEN_HEIGHT,true); //_T编码转换
putimage(0, 0, &bg_img);
//加载道具图标
loadimage(&images[WALL], _T("wall_right.bmp"), RATIO, RATIO, true);
loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);
loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);
loadimage(&images[MAN], _T("man.bmp"), RATIO, RATIO, true);
loadimage(&images[BOX], _T("box.bmp"), RATIO, RATIO, true);
loadimage(&images[HIT], _T("box.bmp"), RATIO, RATIO, true);
for (int i = 0; i < LINE; i++)
{
for (int j = 0; j < COLUMN; j++)
{
if (map[i][j]==MAN)
{
man.x = i;
man.y = j;
}
putimage(START_X +j * RATIO, START_Y +i * RATIO, &images[map[i][j]]);
}
}
//游戏环节
bool quit = false;
do
{
if (_kbhit())//玩家有键盘事件
{
char ch = _getch();
if (ch == KEY_UP)
{
gameControl(UP);
}
else if (ch ==KEY_DOWN)
{
gameControl(DOWN);
}
else if (ch ==KEY_LEFT)
{
gameControl(LEFT);
}
else if (ch ==KEY_RIGHT)
{
gameControl(RIGHT);
}
else if(ch ==KEY_QUIT)
{
quit = true;
}
if (isGameOver())
{
gameOverScene(&bg_img);
quit = true;
}
}
Sleep(100);
} while (quit==false);
system("pause");
//游戏结束,释放资源
closegraph();
return 0;
}