学习C/C++第十七天 推箱子小游戏

#include <graphics.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <conio.h>         //键盘按键头文件

#include "box_man.h"       //调用自己写的头文件  加“”

using namespace std;

IMAGE images[ALL];

_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;
}

/*
*游戏结束场景,在玩家通关后显示的背景
*输入:
*       bg   -   背景图片变量指针
*返回值:  无
*/
void gameOverScene(IMAGE *bg)
{
	putimage(0, 0, bg);
	settextcolor(WHITE);
	RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HERGHT };
	settextstyle(20, 0, _T("宋体"));
	drawtext(_T("恭喜你~在这游戏中通关!"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	//                                           水平居中    垂直居中    文字显示单行
}

/*
*改变游戏地图视图中一格对应道具并重新显示
*输入:
*       line     -  道具在地图数组的行下标
*       column   -  道具在地图数组的列下标
*       prop     -  道具类型
*输出:
*/
void changeMap(_POS *pos, _PROPS prop)
{
	map[pos->x][pos->y] = prop;
	putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);

}

/*
*实现游戏是个方向(上、下、左、右)的控制
*输入:
*       direct  -  人前进的方向
*输出:
*/
void gameControl(_DIRECTION direct)
{
	_POS next_pos = man;        //下一格的位置
	_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;
		}
	}

	//if (isValid(next_pos) && map[next_pos.x][next_pos.y] == BOX_DES)     //小人的前方是箱子目的地
	//{
	//	changeMap(&next_pos, MAN);       //小人 向上 一格
	//	changeMap(&man, FLOOR);
	//	man = next_pos;
	//}

}

int main()
{
	IMAGE bg_img;

	//搭建 游戏背景图片 及 框架大小
	initgraph(SCREEN_WIDTH, SCREEN_HERGHT);
	loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH, SCREEN_HERGHT, true);
	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);  //!puit

	system("pause");
	//游戏结束。释放资源
	closegraph();

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值