VC下的推箱子游戏!
下面是源代码! 可以运行 不过人物移动后会在地面上留下痕迹!求解决!
#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;
}