用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 2022-05-27 13:57 会飞的鱼-blog 阅读(29) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」