fqy131314

用C++实现推箱子(小人和推着箱子能过地板版)

源代码:

#include <iostream>
#include <Windows.h>
#include <graphics.h>
#include <conio.h>
#include "box_man.h"


void changeMap(struct _POS *pos,enum _RES prop)
{
	map[pos->x][pos->y]=prop;
	putimage(START_X+pos->y*RATIO,START_Y+pos->x*RATIO,&pic[prop]);
}


struct _POS man;

void gameCotrol(enum _DIRECT 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)	//小人前是地板
	{
		if(hold==0)
		{
			changeMap(&next_pos,MAN);
			changeMap(&man,FLOOR);
			man=next_pos;
		}else
		{
			changeMap(&next_pos,MAN);
			changeMap(&man,BOX_DES);
			man=next_pos;
			hold=0;
		}
	}else if(isValid(next_pos)&&map[next_pos.x][next_pos.y]==BOX_DES)	//小人前是箱子目的地
	{
		changeMap(&next_pos,MAN);
		changeMap(&man,FLOOR);
		man=next_pos;
		hold=1;
	}else if(isValid(next_pos)&&map[next_pos.x][next_pos.y]==BOX)		//小人前是箱子
	{
		if(isValid(next_next_pos)&&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;
		}else if(isValid(next_next_pos)&&map[next_next_pos.x][next_next_pos.y]==FLOOR)		//箱子前面是地板
		{
			if(hold==1)
			{
				changeMap(&next_next_pos,BOX);
				changeMap(&next_pos,MAN);
				changeMap(&man,BOX_DES);
				man=next_pos;
				hold=0;
			}else
			{
				changeMap(&next_next_pos,BOX);
				changeMap(&next_pos,MAN);
				changeMap(&man,FLOOR);
				man=next_pos;
			}
		}
	}else if(isValid(next_next_pos)&&map[next_pos.x][next_pos.y]==HIT)		//小人前方箱子和目的地重合
		{
				changeMap(&next_next_pos,BOX);
				changeMap(&next_pos,MAN);
				changeMap(&man,FLOOR);
				man=next_pos;
				hold=1;
		}



}

int main(void)
{
	IMAGE bk_ground;

	initgraph(WEIGHT,HEIGHT);

	loadimage(&bk_ground,L"blackground.bmp",WEIGHT,HEIGHT,true);
	putimage(0,0,&bk_ground);

	loadimage(&pic[WALL],L"wall.bmp",RATIO,RATIO,true);
	loadimage(&pic[FLOOR],L"floor.bmp",RATIO,RATIO,true);
	loadimage(&pic[BOX_DES],L"des.bmp",RATIO,RATIO,true);
	loadimage(&pic[MAN],L"man.bmp",RATIO,RATIO,true);
	loadimage(&pic[BOX],L"box.bmp",RATIO,RATIO,true);
	loadimage(&pic[HIT],L"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,&pic[map[i][j]]);
		}
	}

	bool quit=true;

	do
	{
		if(_kbhit())
		{
			char ch=_getch();

			if(ch==KEY_UP)
			{
				gameCotrol(UP);

			}else if(ch==KEY_DOWN)
			{
				gameCotrol(DOWN);

			}else if(ch==KEY_LEFT)
			{
				gameCotrol(LEFT);

			}else if(ch==KEY_RIGHT)
			{
				gameCotrol(RIGHT);

			}else if(ch==KEY_QUIT)
			{
				quit=false;
			}
		}
	}while(quit==true);

	closegraph();
	

	system("pause");
	return 0;
}

头文件:

#define KEY_UP 'w'
#define KEY_DOWN 's'
#define KEY_LEFT 'a'
#define KEY_RIGHT 'd'
#define KEY_QUIT 'q'

#define START_X 100		//x轴偏移
#define START_Y 150		//y轴偏移

#define LINE 9		
#define COLUMN 12

#define WEIGHT 960		//舞台长
#define HEIGHT 768		//舞台宽

#define RATIO 61

#define isValid(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMN		//判断小人在地图行走后是否有效

using namespace std;

int hold=0;

enum _RES
{
	WALL,
	FLOOR,
	BOX_DES,
	MAN,
	BOX,
	HIT,
	ALL
};

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

IMAGE pic[ALL];		//资源图片

enum _DIRECT
{
	UP,
	DOWN,
	LEFT,
	RIGHT
};

struct _POS		//小人坐标
{
	int x;
	int y;
};

posted on   会飞的鱼-blog  阅读(29)  评论(0编辑  收藏  举报  

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示