VC下的推箱子游戏!

minicaca 2011-04-19 07:51:42
下面是源代码! 可以运行 不过人物移动后会在地面上留下痕迹!求解决!
#include <graphics.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;


/*---------------------变量区--------------------------*/


/*地图变量[关数][行][列] 1为墙壁! 2为箱子! 3为目标! 5为人物!!!!*/
int m_nDiTu[5][10][10]=
{
{ /*STATE 1*/
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,0,0,0},
{0,1,5,0,1,1,1,0,0,0},
{0,1,0,2,0,0,1,0,0,0},
{1,1,1,0,1,0,1,1,0,0},
{1,3,1,0,1,0,0,1,0,0},
{1,3,2,0,0,1,0,1,0,0},
{1,3,0,0,0,2,0,1,0,0},
{1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0},
},
{ /*STATE 2*/
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,0,0},
{0,1,0,0,0,0,0,1,1,1},
{1,1,2,1,1,1,0,0,0,1},
{1,5,0,0,2,0,0,2,0,1},
{1,0,3,3,1,0,2,0,1,1},
{1,1,3,3,1,0,0,0,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
},
{ /*STATE 3*/
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,0,0,0,0},
{1,0,0,0,0,1,0,0,0,0},
{1,0,2,2,2,1,1,0,0,0},
{1,0,0,1,3,3,1,1,1,0},
{1,1,0,0,3,3,2,0,1,0},
{0,1,5,0,0,0,0,0,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
},
{ /*STATE 4*/
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,0,0,0},
{0,0,0,1,3,3,1,0,0,0},
{0,0,1,1,0,3,1,1,0,0},
{0,0,1,0,0,2,3,1,0,0},
{0,1,1,0,2,0,0,1,1,0},
{0,1,0,0,1,2,2,0,1,0},
{0,1,5,0,0,0,0,0,1,0},
{0,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
},
{ /*STATE 5*/
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,0},
{1,1,1,1,3,0,0,5,1,0},
{1,0,0,2,2,2,0,0,1,0},
{1,3,1,1,3,1,1,3,1,0},
{1,0,0,0,2,0,0,0,1,0},
{1,0,0,2,3,1,0,1,1,0},
{1,1,1,1,0,0,0,1,0,0},
{0,0,0,1,1,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0},
}
};

/*现行关的临时模板*/
int m_nLinshiDitu[10][10];

/*当前玩家属性结构体;x为横坐标,y为纵坐标*/
struct WANJIA
{
int x;
int y;
}REN;

/*当前目标属性结构体;e是否存在,1为存在,0为不存在。*/
struct MUDIDI
{
int e;
int x;
int y;
}MUBIAO[5];
/*---------------------函数区---------------------------*/

/*************************************************
Function: GRAPH
Description: 初始化图形界面
Calls: initgraph()
Called By: almost all
Input:
Output:
Return: NULL
Others:
*************************************************/
void GRAPH()
{
int gdriver = DETECT, gmode;
int gd=VGA,gm=VGAHI;
initgraph(&gd,&gm,"c:\\tc"); /*图形界面初始化*/
initgraph(&gdriver, &gmode, "");
}

/*************************************************
Function: HuaKong
Description: 为屏幕上给定坐标的位置模拟出空地
Calls: graphics.h相关函数
Called By: YiDong()、DituZairu()
Input: 坐标
Output: 在指定位置显示空地
Return: NULL
Others: 最后变量记录
*************************************************/

void HuaKong(int x,int y)
{
setcolor(LIGHTGRAY);
setfillstyle(SOLID_FILL,1);

rectangle(60+x*36+1,80+y*36+1,60+(x+1)*36,80+(y+1)*36);
floodfill(60+x*36+18,80+y*36+18,LIGHTGRAY);
m_nLinshiDitu[y][x]=0;
}

/*************************************************
Function: HuaQiang
Description: 为屏幕上给定坐标的位置模拟出墙壁
Calls: graphics.h相关函数
Called By: YiDong()、DituZairu()
Input: 坐标
Output: 在指定位置显示墙
Return: NULL
Others: 最后变量记录
*************************************************/
void HuaQiang(int x,int y)
{
setcolor(GREEN);
setfillstyle(SOLID_FILL,1);
bar(60+x*36+1,80+y*36+1,60+x*36+35,80+y*36+35);
m_nLinshiDitu[y][x]=1;
}

/*************************************************
Function: HuaXiangzi
Description: 为屏幕上给定坐标的位置模拟出箱子
Calls: graphics.h相关函数
Called By: YiDong()、DituZairu()
Input: 坐标
Output: 在指定位置显示箱子
Return: NULL
Others: 最后变量记录
*************************************************/
void HuaXiangzi(int x,int y)
{
setcolor(YELLOW);
setfillstyle(SOLID_FILL,YELLOW);
rectangle(60+x*36+1,80+y*36+1,60+x*36+35,80+y*36+35);
floodfill(60+x*36+18,80+y*36+18,YELLOW);
m_nLinshiDitu[y][x]=2;
}

/*************************************************
Function: HuaMubiao
Description: 为屏幕上给定坐标的位置模拟出目标位置
Calls: graphics.h相关函数
Called By: YiDong()、DituZairu()
Input: 坐标
Output: 在指定位置显示目标位置
Return: NULL
Others: 最后变量记录
*************************************************/
void HuaMubiao(int x,int y)
{
HuaKong(x,y);
setcolor(CYAN);
setfillstyle(1,CYAN);
circle(60+18+x*36,80+18+y*36,16);
circle(60+18+x*36,80+18+y*36,10);
floodfill(60+18+x*36,80+3+y*36,CYAN);
m_nLinshiDitu[y][x]=3;
}

/*************************************************
Function: HuaJiuwei
Description: 为屏幕上给定坐标的位置模拟出就位的箱子
Calls: graphics.h相关函数
Called By: YiDong()、DituZairu()
Input: 坐标
Output: 在指定位置显示就位的箱子
Return: NULL
Others: 最后变量记录
*************************************************/
void HuaJiuwei(int x,int y)
{
HuaKong(x,y);
setcolor(YELLOW);
setfillstyle(1,BLUE);
rectangle(60+x*36+1,80+y*36+1,60+x*36+35,80+y*36+35);
floodfill(60+18+x*36,80+18+y*36,YELLOW);
setcolor(CYAN);
setfillstyle(1,RED);
circle(60+18+x*36,80+18+y*36,16);
circle(60+18+x*36,80+18+y*36,10);
floodfill(60+18+x*36,80+3+y*36,CYAN);
m_nLinshiDitu[y][x]=4;
}

/*************************************************
Function: HuaRen
Description: 为屏幕上给定坐标的位置模拟出小人
Calls: graphics.h相关函数
Called By: YiDong()、DituZairu()
Input: 坐标
Output: 在指定位置显示小人
Return: NULL
Others: 最后变量记录
*************************************************/
void Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4){};
void HuaRen(int x,int y)
{
HuaKong(x,y);
setcolor(RED);
setfillstyle(SOLID_FILL,1);
circle(60+17+x*36,80+17+y*36,16);
floodfill(60+17+x*36,80+17+y*36,RED);
Arc(60+17+x*36-6,80+17+y*36-4,20,160,4,0,0,0);
Arc(60+17+x*36+6,80+17+y*36-4,20,160,4,0,0,0);
Arc(60+17+x*36,80+16+y*36-4,220,320,14,0,0,0);
m_nLinshiDitu[y][x]=5;
}
/*************************************************
Function: Chushihua
Description: 坐标参数初始化
Calls: NULL
Called By: main()
Input: NULL
Output: 格式化的变量
Return: NULL
Others: 将所有坐标清零,防止BUG
*************************************************/
void Chushihua()
{
int i;
REN.x=0;
REN.y=0;
for(i=0;i<5;i++)
{
MUBIAO[i].e=0;
MUBIAO[i].x=0;
MUBIAO[i].y=0;
}
}

/*************************************************
Function: DituZairu
Description: 载入地图信息到临时变量,并初始化图形
Calls: 各种画图函数
Called By: main()
Input: int 关数
Output: 记录完成的地图图形
Return: int 0/1 //0为载入失败,1为载入成功。
Others: 同时记录人物和目标的信息,可当条件用
*************************************************/
int DituZairu(int n)
{
int i,j,k;
for(i=0;i<10;i++) /*载入地图模板到临时模板*/
{
for(j=0;j<10;j++)
{
m_nLinshiDitu[i][j]=m_nDiTu[n][i][j];
}
}
for(i=0;i<10;i++) /*初始化临时模板,画出各个坐标对应的图形*/
{
for(j=0;j<10;j++)
{
if(m_nLinshiDitu[i][j]==0)
{
HuaKong(j,i);
}
else if(m_nLinshiDitu[i][j]==1)
{
HuaQiang(j,i);
}
else if(m_nLinshiDitu[i][j]==2)
{
HuaXiangzi(j,i);
}
else if(m_nLinshiDitu[i][j]==3)
{
HuaMubiao(j,i);
for(k=0;k<5;k++) /*记录目标位置到目标结构体变量*/
{
if(MUBIAO[k].e==0)
{
MUBIAO[k].e=1;
MUBIAO[k].x=j;
MUBIAO[k].y=i;
break;
}
}
}
else if(m_nLinshiDitu[i][j]==5) /*记录玩家位置到玩家结构体变量*/
{
HuaRen(j,i);
REN.x=j;
REN.y=i;
}
else
{
outtextxy(30,30,"Loading Error!"); /*载入失败时停止并报错*/
return 0;
}
}
}
setcolor(BLUE); /*在地图上显示关数信息*/
switch(n)
{
case 0:outtextxy(480,240,"stage:1");break;
case 1:outtextxy(480,240,"stage:2");break;
case 2:outtextxy(480,240,"stage:3");break;
case 3:outtextxy(480,240,"stage:4");break;
case 4:outtextxy(480,240,"stage:5");break;
default:break;
}
return 1;
}

/*************************************************
Function: ShengLi
Description: 判断玩家是否打到过关条件
Calls: NULL
Called By: main()
Input: int 关数
Output: 载入下一关的相关动作
Return: int 0/1 //1为胜利,0为没胜利
Others: 可当条件用
*************************************************/
int ShengLi()
{
int i;
for(i=0;i<5;i++)
{
if(MUBIAO[i].e==1 && m_nLinshiDitu[MUBIAO[i].y][MUBIAO[i].x]!=4)
{
return 0;
}
}
return 1;
}


...全文
145 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
minicaca 2011-04-19
  • 打赏
  • 举报
回复
/*************************************************
Function: YiDong
Description: 检查移动是否可行,若可以对地图进行刷新
Calls: 各种画图函数
Called By: DongZuo()
Input: int 关数,int 水平偏移,int 垂直偏移
Output: 各模块的新位置
Return: NULL
Others: 执行时更新地图和相关的结构体变量
*************************************************/
void YiDong(int Guan,int dx,int dy)
{
if(m_nLinshiDitu[REN.y+dy][REN.x+dx]==0) /*前面1格是空地的情况*/
{
if(m_nDiTu[Guan][REN.y][REN.x]==3) /*判断原来地面的情况*/
{
HuaMubiao(REN.x,REN.y); /*原来地面是目的地,就画目的地*/
}
else
{
HuaKong(REN.x,REN.y); /*原来地面是空地,就画空地*/
}
HuaRen(REN.x+dx,REN.y+dy);
REN.x+=dx;
REN.y+=dy; /*记录数据并更新变量*/
}
else if(m_nLinshiDitu[REN.y+dy][REN.x+dx]==2) /*前面1格是箱子的情况*/
{
if(m_nLinshiDitu[REN.y+2*dy][REN.x+2*dx]==0) /*前面2格是空地的情况*/
{
if(m_nDiTu[Guan][REN.y][REN.x]==3)
{
HuaMubiao(REN.x,REN.y);
}
else
{
HuaKong(REN.x,REN.y);
}
HuaRen(REN.x+dx,REN.y+dy);
HuaXiangzi(REN.x+2*dx,REN.y+2*dy);
REN.x+=dx;
REN.y+=dy;
}
else if(m_nLinshiDitu[REN.y+2*dy][REN.x+2*dx]==3) /*前面2格是目的地的情况*/
{
if(m_nDiTu[Guan][REN.y][REN.x]==3)
{
HuaMubiao(REN.x,REN.y);
}
else
{
HuaKong(REN.x,REN.y);
}
HuaRen(REN.x+dx,REN.y+dy);
HuaJiuwei(REN.x+2*dx,REN.y+2*dy);
REN.x+=dx;
REN.y+=dy;
}
}
else if(m_nLinshiDitu[REN.y+dy][REN.x+dx]==3) /*前面1格是目的地的情况*/
{
if(m_nDiTu[Guan][REN.y][REN.x]==3)
{
HuaMubiao(REN.x,REN.y);
}
else
{
HuaKong(REN.x,REN.y);
}
HuaRen(REN.x+dx,REN.y+dy);
REN.x+=dx;
REN.y+=dy;
}
else if(m_nLinshiDitu[REN.y+dy][REN.x+dx]==4) /*前面1格是就位的箱子的情况*/
{
if(m_nLinshiDitu[REN.y+2*dy][REN.x+2*dx]==0) /*前面2格是空地的情况*/
{
if(m_nDiTu[Guan][REN.y][REN.x]==3)
{
HuaMubiao(REN.x,REN.y);
}
else
{
HuaKong(REN.x,REN.y);
}
HuaRen(REN.x+dx,REN.y+dy);
HuaXiangzi(REN.x+2*dx,REN.y+2*dy);
REN.x+=dx;
REN.y+=dy;
}
else if(m_nLinshiDitu[REN.y+2*dy][REN.x+2*dx]==3) /*前面2格是目的地的情况*/
{
if(m_nDiTu[Guan][REN.y][REN.x]==3)
{
HuaMubiao(REN.x,REN.y);
}
else
{
HuaKong(REN.x,REN.y);
}
HuaRen(REN.x+dx,REN.y+dy);
HuaJiuwei(REN.x+2*dx,REN.y+2*dy);
REN.x+=dx;
REN.y+=dy;
}
}
}


/*************************************************
Function: DongZuo
Description: 判断按键,执行不同动作
Calls: YiDong();DituZairu()
Called By: main()
Input: char 按键值,int 当前关数
Output: 调用移动函数执行动作
Return: NULL
Others: 可以实现移动和重置功能调用
*************************************************/
void DongZuo(char dir,int Guan)
{

switch(dir)
{
case 72:YiDong(Guan,0,-1);break; /*按上键的情况*/
case 80:YiDong(Guan,0,1);break; /*按下键的情况*/
case 75:YiDong(Guan,-1,0);break; /*按左键的情况*/
case 77:YiDong(Guan,1,0);break; /*按右键的情况*/
case 32:DituZairu(Guan);break; /*按空格键的情况*/
default:break;
}

}
void far settextstyle (int font, int direction, char size){};
/*************************************************
Function: main
Description: 主函数,游戏从这里开始
Calls: GRAPH();Chushihua();画图相关函数;逻辑移动相关函数
Called By: NULL
Input: NULL
Output: 游戏各种功能的实现
Return: NULL
Others: 游戏流程函数
*************************************************/

int main()

{

int i;
char com;
GRAPH(); /*初始化图形界面*/
setbkcolor(RED);
cleardevice();
settextstyle(1,0,4);
outtextxy(120,200,"欢迎进入推箱子游戏!"); /*致欢迎词*/
outtextxy(120,360,"制作人:连梓楠,何伟燕,范婵香!");
outtextxy(200,390,"(按回车键继续~)");
getch();
setbkcolor(LIGHTGRAY);
cleardevice();
settextstyle(1,0,1);
setcolor(BLUE);
outtextxy(60,60,"游戏操作说明:"); /*游戏操作说明*/
outtextxy(60,100,"按方向键进行移动.");
outtextxy(60,140,"按空格键从新开始游戏.");
outtextxy(60,180,"按回车键进入下一关.");
outtextxy(60,220,"按ESC键退出游戏.");
outtextxy(200,390,"(按回车键继续~)");

getch();
Chushihua(); /*初始化参数*/
outtextxy(90,320,"Are you ready!?");
getch();
cleardevice();
for(i=0;i<5;i++)
{
if(DituZairu(i)) /*地图载入和变量赋值*/
{
for(;;) /*循环获得按键操作*/
{
com=getch();
if(com!=27 && com!=13) /*判断按键*/
{
DongZuo(com,i);
if(ShengLi()) /*胜利判断*/
{

setcolor(BLUE);
outtextxy(320,20,"Well Done!");
Chushihua();
getch();
cleardevice();
break; /*胜利就跳到下一关*/
}
}
else if(com==27) /*按下ESC结束游戏*/
{
setcolor(RED);
outtextxy(320,30,"The game is over!");
getch();
return 0;
}
else if(com==13) /*按下ENTER跳到下一关*/
{
Chushihua();
cleardevice();
break;
}

}
}
}
setcolor(RED); /*通关时的画面*/
outtextxy(90,50,"恭喜你通关了!");
outtextxy(90,90,"Congratulations!");
getch();
getch();
return 0;
}

求高手解决啊 扣扣:107136433

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧