感谢我的两位最好的队友!

我会将Funcode工程目录放在我的资源中

仅代表我们的浅见,当中或许还有不少的bug没有修复

作品简介

Q版泡泡堂是一款经典的游戏。玩家选择自己喜欢的人物,进入游戏后利用键盘来控制人物的走位并制造炸弹,来炸掉障碍物以及其他人物,在炸掉障碍物的同时会随机的掉落各种各样可以增加人物功能的道具,而游戏获胜的要求是消灭画面上的其他所有玩家或达到最高的积分。该游戏同时支持单双人游戏。

作品功能说明

①游戏开始随机产生背景画面,并且在背景中有许多的方块,在该游戏中玩家可以利用键盘上下左右来控制人物走位和键盘空格施放炸弹与道具,炸弹会在放置后3秒爆炸,可以炸掉方块为自己开辟道路。同时游戏实行积分制度,每炸掉一个方块积分加5分,吃到一个道具加100分,消灭敌人一个加1000分。

②游戏玩家控制的虚拟人物起初有一次生命值,并且每一局游戏时间限制为3分钟,在规定时间内消灭所有敌人或时间结束后积分最高可以获胜。

③在炸掉方块的同时可以随机产生一些道具,其中包括:
增加生命(可以加一次虚拟人物的生命值,可以重复拾取累加)
增加炸弹(可以增加一次性放置炸弹个数)
行动速度加快(虚拟人物移动速度加快)
增加炸弹威力(获得之后所释放炸弹的作用范围永久增加)
保护盾(可以防止一次伤害,但是身上只能拥有一个,重复拾取无法增加)
手榴弹(有两次机会,按下方向-空格该道具可以将手榴弹扔到2格外,并炸毁
面前三格,可以在墙后扔)
发射火箭(有两次机会,按下方向-空格键向一侧发射直线火箭直到碰到方块或敌人并将其炸毁)
发射火焰(有两次机会,按下方向-空格键向面前三格发射火焰,摧毁范围内的方块或敌人,遇到墙停止,火焰会持续1秒,会对自己造成伤害)
推动炸弹(按下方向键可以将一侧的炸弹往相应方向推,直到遇到方块或敌人停止并立即爆炸)
冰冻敌人(有一次机会,按下方向-空格键在面前最多三格施放冰柱,如果碰到敌人则会冻住敌人1秒,但是碰到墙作用范围会中断)
迷惑敌人(有两次机会,按下空格在空地上施放该道具,道具会隐身,如果有敌人走到则会减速敌人一段时间,可以被炸弹等炸毁)
施放地雷(有两次机会,按下空格在空地上施放该道具,道具会隐身,如果有敌人走到则会炸掉方块上的所有单位,可以被炸弹等炸毁)

Code:Code:Code:

#include <Stdio.h>
#include "CommonAPI.h"
#include "LessonX.h"const int N=2000;//音乐预处理
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")//游戏状态 0:初始界面,1:选择模式界面,2:游戏说明界面,3:道具说明界面,4:单人选人界面,5:双人选人界面,6:单人游戏界面,7:双人游戏界面,8:游戏失败界面,9:单人游戏获胜界面,10:双人游戏获胜界面
int g_iGameState=0;//声音状态 0:关闭,1:打开
int sound=1;
//play1,play2选择人物
int pick1,pick2,play1,play2,state1,state2;
//是否暂停
int Pause=0;
//"你赢了","你输了"存在3秒进入结算页面
float dtime;
//人物方向1:下,2:上,3:左,4:右
int to[5];
int guan;
//人物状态1:扔炸弹,2:扔手榴弹,3:放地雷,4:放冰柱,5:放火焰,6:放迷惑弹,7:发射火箭
int state[5];
//游戏状态0:继续,1:失败,2:成功
int flag;
int statehome;
//四个人物的分数
int s[5];
//四个人物炸弹数量
int b[5];
//四个人物生命数量
int h[5];
int kill[5],sfinal[5];
int ice[5];float icetime[5];
int slow[5];float slowtime[5];
//四个人物炸弹威力
int power[5];
int defend[5],glove[5],tools[5];
//一局游戏剩余时长
float time;
float dietime[5],speed[5];
//地图
const int lenx=15,leny=13;
const float blenx=5.4867f;
const float bleny=5.6428f;
const float startx=-30.59065f,starty=-33.6356f;/* {{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,},{,,,,,,,,,,,,}},*/
const int data[10][lenx][leny]={{{1,1,5,1,3,0,3,1,2,0,2,2,2},{2,0,1,0,1,4,0,4,5,0,5,4,2},{5,0,4,0,5,4,0,0,5,0,4,1,0},{2,1,0,0,0,0,0,1,0,0,0,2,3},{4,0,5,0,4,0,5,0,4,0,4,5,0},{3,3,4,3,2,0,4,0,0,2,0,0,2},{0,1,2,0,4,6,6,2,5,2,4,5,3},{0,5,4,3,2,6,6,0,0,1,5,0,2},{1,0,5,1,4,1,4,4,5,1,0,2,0},{0,2,1,0,2,2,4,0,2,2,5,5,0},{0,5,4,0,5,0,3,0,5,0,4,2,3},{0,1,0,0,0,3,4,3,0,0,0,3,3},{1,4,4,0,4,2,0,4,5,0,5,4,3},{1,1,2,0,2,0,4,5,2,0,0,4,3},{2,5,1,2,5,0,3,0,1,5,1,0,0}},{{1,0,2,0,0,2,4,2,2,1,4,3,1},{0,0,5,0,5,2,3,0,5,0,2,1,3},{0,4,5,0,4,1,4,4,4,0,5,5,0},{3,2,0,0,0,2,2,3,0,0,0,3,0},{2,0,5,0,5,2,5,3,4,0,4,4,0},{1,5,5,0,0,0,1,0,5,1,0,3,1},{0,0,4,4,0,6,6,3,0,0,0,5,3},{5,0,3,0,1,6,6,2,5,4,0,5,1},{3,0,5,3,4,5,2,1,2,1,1,0,3},{1,5,0,0,0,0,0,0,5,0,4,2,5},{1,4,4,0,5,5,0,4,5,0,4,1,0},{3,1,0,0,0,1,2,2,0,0,0,0,3},{1,5,5,0,4,0,5,0,5,0,5,5,1},{0,4,1,1,3,0,5,0,1,0,0,1,1},{0,0,0,1,4,0,5,2,2,4,0,5,0}},{{0,1,1,0,3,2,3,4,0,3,2,0,3},{1,3,4,2,2,5,1,0,0,0,5,1,5},{2,5,4,0,4,5,0,5,5,0,5,0,0},{0,1,0,0,0,2,0,0,0,0,0,3,0},{0,4,4,0,5,5,2,5,4,0,4,4,1},{2,1,0,2,3,1,3,0,2,2,1,3,0},{0,4,2,4,3,6,6,0,5,2,4,2,1},{3,1,2,4,4,6,6,0,4,4,4,0,4},{0,4,0,0,2,5,2,2,4,0,2,3,2},{0,1,4,2,0,1,3,0,0,2,4,0,1},{4,3,5,0,5,0,4,2,4,0,4,5,2},{3,3,0,0,0,2,0,0,0,0,0,2,2},{5,2,4,0,4,4,0,4,4,0,4,2,4},{2,0,5,2,4,0,0,5,2,2,2,3,0},{3,2,0,0,0,3,2,2,1,1,2,4,0}},{{1,2,0,0,0,0,3,1,1,0,0,2,3},{2,3,4,0,1,4,2,4,0,0,5,1,0},{1,5,5,0,5,5,0,5,5,0,5,3,5},{0,0,0,0,0,3,3,1,0,0,0,2,0},{4,3,5,0,4,2,4,5,5,0,4,4,0},{1,1,4,0,3,1,0,1,1,0,1,5,0},{5,1,0,3,4,6,6,5,0,5,1,5,0},{0,2,1,5,3,6,6,2,0,3,3,0,0},{2,4,0,2,2,1,2,2,5,1,4,2,4},{1,5,5,1,4,0,5,1,2,0,4,1,1},{3,0,5,0,5,0,4,0,4,0,5,3,2},{5,0,0,0,0,0,0,0,0,0,0,0,4},{2,0,4,0,5,4,3,5,4,0,5,1,1},{4,0,1,0,2,0,2,3,0,2,1,2,4},{1,0,5,0,5,0,5,0,5,3,4,0,2}},{{0,2,1,5,0,5,1,1,1,4,0,5,1},{1,4,0,1,0,3,4,2,1,2,0,0,1},{3,4,4,0,4,2,3,1,5,0,5,5,1},{3,0,0,0,0,0,5,2,0,0,0,3,0},{1,1,5,0,4,1,4,0,5,0,4,4,2},{5,3,3,0,3,3,1,0,2,0,2,4,2},{0,3,2,5,0,6,6,5,3,4,0,3,1},{1,4,0,4,0,6,6,1,0,5,2,4,0},{3,3,2,0,1,0,3,0,0,4,4,4,1},{3,0,4,2,4,2,2,5,3,3,0,2,2},{0,4,4,0,4,5,0,5,5,0,4,3,5},{0,0,0,0,0,0,0,3,0,0,0,2,0},{0,5,4,0,5,0,4,4,4,0,5,5,2},{3,3,2,3,2,0,0,2,4,0,1,1,3},{1,0,5,0,1,5,3,0,2,0,5,0,3}}};
//目前地图
int a[lenx][leny];
//道具分布
int c[lenx][leny],co[15],cf[lenx][leny];
//方块分布
int count[5],f[lenx][leny];
//人物位置 1:pink,2:yellow,3:blue,4:green
int gx[5],gy[5];
int hurt[lenx][leny],from[lenx][leny],dan[lenx][leny];
//炸弹延时爆炸
int head,tail,bombx[N],bomby[N],bombman[N],bombpower[N],bombnum[lenx][leny];
float bombtime[N];
//空白显示延迟
int whead,wtail;
float whitetime[N];
//bfs
int fhead,ftail,step[N],minstep,find,d[lenx][leny],bef[N],findx[N],findy[N];void GameInit();
void GameRun(float fDeltaTime);
void GameEnd();// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。//放置精灵
void MoveSpriteToBlock(const char *szName,const int iIndexX,const int iIndexY)
{float fPosX=startx+iIndexX*blenx;float fPosY=starty+iIndexY*bleny;dSetSpritePosition(szName,fPosX,fPosY);dSetSpriteLinearVelocity(szName,0,0);
}
//放置人物
void MoveSpriteToBlock1(const char *szName,const int iIndexX,const int iIndexY)
{float fPosX=startx+iIndexX*blenx;float fPosY=starty+iIndexY*bleny-2.8214f;dSetSpritePosition(szName,fPosX,fPosY);dSetSpriteLinearVelocity(szName,0,0);
}
//人物行动
void walk(int i,int iIndexX,int iIndexY)
{char *szName=NULL;if(i==1)szName="pink";elseif(i==2)szName="yellow";elseif(i==3)szName="Blue";elseif(i==4)szName="Green";float fPosX=startx+iIndexX*blenx;float fPosY=starty+iIndexY*bleny-2.8214f;dSpriteMoveTo(szName,fPosX,fPosY,speed[i],1);
}
//放置空白伤害痕迹块
void whitemake(int x,int y)
{char *szName=NULL;wtail++;szName=dMakeSpriteName("white",wtail);dCloneSprite("white",szName);whitetime[wtail]=0.5f;MoveSpriteToBlock(szName,x,y);
}
//计算炸弹威胁范围
void makedan(int pow,int x,int y,int n)
{int o,xx,yy;dan[x][y]=n;o=pow;xx=x,yy=y;while(xx>0&&o>0&&(a[xx-1][yy]==0||a[xx-1][yy]>10)){o--;xx--;dan[xx][yy]=n;}o=pow;xx=x,yy=y;while(xx<14&&o>0&&(a[xx+1][yy]==0||a[xx+1][yy]>10)){o--;xx++;dan[xx][yy]=n;}o=pow;xx=x,yy=y;while(yy>0&&o>0&&(a[xx][yy-1]==0||a[xx][yy-1]>10)){o--;yy--;dan[xx][yy]=n;}o=pow;xx=x,yy=y;while(y<12&&o>0&&(a[xx][yy+1]==0||a[xx][yy+1]>10)){o--;yy++;dan[xx][yy]=n;}
}
//(x,y)点造成伤害
void produce(int play,int x,int y)
{if(sound==1){if(play==1)mciSendString("play game/data/audio/bang1.mp3",NULL,0,NULL);if(play==2)mciSendString("play game/data/audio/bang2.mp3",NULL,0,NULL);if(play==3)mciSendString("play game/data/audio/bang3.mp3",NULL,0,NULL);if(play==4)mciSendString("play game/data/audio/bang4.mp3",NULL,0,NULL);}hurt[x][y]=0;char *szName=NULL,*sz=NULL;if(a[x][y]<=3&&a[x][y]>0){int cnt=f[x][y];sz=dMakeSpriteName("block",a[x][y]);szName=dMakeSpriteName(sz,cnt);dDeleteSprite(szName);s[play]+=5;whitemake(x,y);a[x][y]=0;int cc=c[x][y];if(cc!=0){sz=dMakeSpriteName("t",cc);szName=dMakeSpriteName(sz,cf[x][y]+10);dCloneSprite(sz,szName);MoveSpriteToBlock(szName,x,y);}}elseif(a[x][y]==0||a[x][y]==7)whitemake(x,y);elseif(a[x][y]>10){int dol=a[x][y];if(a[x][y]<17)dol-=10;else dol-=17;if((dol==play1||dol==play2)&&defend[dol]==1){defend[dol]=0;szName="defend";szName=dMakeSpriteName(szName,dol);dDeleteSprite(szName);}else h[dol]--;whitemake(x,y);if(h[dol]>0){if(a[x][y]>17)a[x][y]-=7;}else if(h[dol]==0){a[x][y]=0;s[play]+=1000;kill[play]++;szName=dMakeSpriteName("dark",dol);dCloneSprite("dark",szName);if(dol==1)dSetSpritePosition(szName,-42.f,-28.4f);elseif(dol==2)dSetSpritePosition(szName,-42.f,-16.4f);elseif(dol==3)dSetSpritePosition(szName,-42.f,-3.4f);elseif(dol==4)dSetSpritePosition(szName,-42.f,9.4f);}}
}
//获得道具图标文字显示
void maketool(int i,int n)
{char *sz=NULL,*szName=NULL;sz=dMakeSpriteName("t",n);szName=dMakeSpriteName("tool",i);if(tools[i]>0)dDeleteSprite(szName);if(n==2)tools[i]=1;else tools[i]=2;dCloneSprite(sz,szName);dSetSpriteWidth(szName,2.f);dSetSpriteHeight(szName,2.f);if(i==1){dSetSpritePosition(szName,-36.3f,-29.f);dSetSpriteVisible("pt",1);dSetTextValue("pt",tools[i]);}elseif(i==2){dSetSpritePosition(szName,-36.3f,-16.5f);dSetSpriteVisible("yt",1);dSetTextValue("yt",tools[i]);}elseif(i==3){dSetSpritePosition(szName,-36.3f,-4.f);dSetSpriteVisible("bt",1);dSetTextValue("bt",tools[i]);}elseif(i==4){dSetSpritePosition(szName,-36.3f,9.f);dSetSpriteVisible("gt",1);dSetTextValue("gt",tools[i]);}
}
//使用一次道具图标文字显示
void losetool(int i)
{char *szName=NULL;tools[i]--;if(tools[i]>0){if(i==1)dSetTextValue("pt",tools[i]);elseif(i==2)dSetTextValue("yt",tools[i]);elseif(i==3)dSetTextValue("bt",tools[i]);elseif(i==4)dSetTextValue("gt",tools[i]);}elseif(tools[i]==0){state[i]=1;szName=dMakeSpriteName("tool",i);dDeleteSprite(szName);if(i==1)dSetSpriteVisible("pt",0);elseif(i==2)dSetSpriteVisible("yt",0);else  if(i==3)dSetSpriteVisible("bt",0);elseif(i==4)dSetSpriteVisible("gt",0);}
}
//拾取道具
void toolwork(int n,int x,int y)
{char *szName=NULL,*sz=NULL;int cc=c[x][y];if(cc!=0){if(sound==1)mciSendString("play game/data/audio/ding.mp3",NULL,0,NULL);s[n]+=100;switch(cc){case 1:{defend[n]=1;szName="defend";szName=dMakeSpriteName(szName,n);dCloneSprite("t1",szName);dSetSpriteWidth(szName,2.f);dSetSpriteHeight(szName,2.f);if(n==1)dSetSpritePosition(szName,-36.3f,-31.f);elseif(n==2)dSetSpritePosition(szName,-36.3f,-18.5f);elseif(n==3)dSetSpritePosition(szName,-36.3f,-6.f);elseif(n==4)dSetSpritePosition(szName,-36.3f,7.f);break;}case 2:{state[n]=4;maketool(n,2);break;}case 3:{state[n]=3;maketool(n,3);break;}case 4:{state[n]=7;maketool(n,4);break;}case 5:{h[n]++;break;}case 6:{glove[n]=1;szName="glove";szName=dMakeSpriteName(szName,n);dCloneSprite("t6",szName);dSetSpriteWidth(szName,2.f);dSetSpriteHeight(szName,2.f);if(n==1)dSetSpritePosition(szName,-36.3f,-27.f);elseif(n==2)dSetSpritePosition(szName,-36.3f,-14.5f);elseif(n==3)dSetSpritePosition(szName,-36.3f,-2.f);elseif(n==4)dSetSpritePosition(szName,-36.3f,11.f);break;}case 7:{state[n]=2;maketool(n,7);break;}case 8:{speed[n]+=5;break;}case 9:{state[n]=6;maketool(n,9);break;}case 10:{state[n]=5;maketool(n,10);break;}case 11:{b[n]++;break;}case 12:{power[n]++;break;}default:break;}c[x][y]=0;sz=dMakeSpriteName("t",cc);szName=dMakeSpriteName(sz,cf[x][y]+10);dDeleteSprite(szName);}
}
//放置炸弹
void place(int play,int x,int y)
{char *szName=NULL;if(b[play]>0){b[play]--;a[x][y]+=7;tail++;bombtime[tail]=1.5f;bombman[tail]=play;bombx[tail]=x;bomby[tail]=y;bombnum[x][y]=tail;bombpower[tail]=power[play];szName=dMakeSpriteName("bomb",tail);dCloneSprite("bomb",szName);MoveSpriteToBlock(szName,x,y);makedan(power[play],x,y,1);}
}
//冰柱作用
void icemake(int x,int y)
{int dol=a[x][y];if(dol>10){if(dol>17)dol-=17;else dol-=10;}ice[dol]=1;icetime[dol]=5.f;
}
//按下空格/回车的处理
void workout(int play,int x,int y)
{char *szName=NULL;int xx,yy;switch(state[play]){case 1://放置炸弹{if(hurt[x][y]==0&&ice[play]==0&&Pause==0)place(play,x,y);break;}case 2://扔手榴弹{if(to[play]==1){if(y+2<=12&&(a[x][y+2]<4||a[x][y+2]>6)){xx=x;yy=y+2;losetool(play);}}elseif(to[play]==2){if(y-2>=0&&(a[x][y-2]<4||a[x][y-2]>6)){xx=x;yy=y-2;losetool(play);}}else   if(to[play]==3){if(x-2>=0&&(a[x-2][y]<4||a[x-2][y]>6)){xx=x-2;yy=y;losetool(play);}}elseif(to[play]==4){if(x+2<=14&&(a[x+2][y]<4||a[x+2][y]>6)){xx=x+2;yy=y;losetool(play);}}if(xx>=0&&xx<=14&&yy>=0&&yy<=12){produce(play,xx,yy);if(xx>1)produce(play,xx-1,yy);if(xx<14)produce(play,xx+1,yy);if(yy>1)produce(play,xx,yy-1);if(yy<12)produce(play,xx,yy+1);}break;}case 3://放地雷{losetool(play);hurt[x][y]=1;from[x][y]=play;break;}case 4://放冰柱{xx=x;yy=y;losetool(play);if(to[play]==1){yy++;while(yy<=y+3&&yy<=13&&(a[xx][yy]==0||a[xx][yy]>10)){icemake(xx,yy);whitemake(xx,yy);yy++;}}elseif(to[play]==2){yy--;while(yy>=y-3&&yy>=0&&(a[xx][yy]==0||a[xx][yy]>10)){icemake(xx,yy);whitemake(xx,yy);yy--;}}else    if(to[play]==3){xx--;while(xx>=x-3&&xx>=0&&(a[xx][yy]==0||a[xx][yy]>10)){icemake(xx,yy);whitemake(xx,yy);xx--;}}elseif(to[play]==4){xx++;while(xx<=x+3&&xx<=15&&(a[xx][yy]==0||a[xx][yy]>10)){icemake(xx,yy);whitemake(xx,yy);xx++;}}break;}case 5://放火焰{xx=x;yy=y;losetool(play);if(to[play]==1){yy++;while(yy<=y+3&&yy<=13&&(a[xx][yy]<4||a[xx][yy]>6)){produce(play,xx,yy);yy++;}}elseif(to[play]==2){yy--;while(yy>=y-3&&yy>=0&&(a[xx][yy]<4||a[xx][yy]>6)){produce(play,xx,yy);yy--;}}else   if(to[play]==3){xx--;while(xx>=x-3&&xx>=0&&(a[xx][yy]<4||a[xx][yy]>6)){produce(play,xx,yy);xx--;}}elseif(to[play]==4){xx++;while(xx<=x+3&&xx<=15&&(a[xx][yy]<4||a[xx][yy]>6)){produce(play,xx,yy);xx++;}}break;}case 6://放迷惑弹{losetool(play);hurt[x][y]=2;from[x][y]=play;break;}case 7://发射火箭{losetool(play);xx=x;yy=y;if(to[play]==1){ yy++;while(yy<=12&&a[xx][yy]==0)yy++;yy--;}elseif(to[play]==2){yy--;while(yy>=0&&a[xx][yy]==0)yy--;yy++;}elseif(to[play]==3){xx--;while(xx>=0&&a[xx][yy]==0)xx--;xx++;}elseif(to[play]==4){xx++;while(xx<=14&&a[xx][yy]==0)xx++;xx--;}produce(play,xx,yy);if(xx>1)produce(play,xx-1,yy);if(xx<14)produce(play,xx+1,yy);if(yy>1)produce(play,xx,yy-1);if(yy<12)produce(play,xx,yy+1);break;}default:break;}
}
//人物移动地图处理
void Move(int play,int x0,int x1,int x2,int x3)
{a[x0][x1]-=(play+10);a[x2][x3]+=play+10;
}
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void GameMainLoop( float fDeltaTime )
{switch(g_iGameState){// 初始化游戏,清空上一局相关数据case 0:{dSetSpriteVisible("be1",1);//初始界面开始游戏按钮dSetSpriteVisible("be2",1);//游戏介绍按钮dSetSpriteVisible("be3",0);//道具说明按钮dSetSpriteVisible("be4",0);//游戏说明按钮dSetSpriteVisible("be5",0);//单人按钮dSetSpriteVisible("be6",0);//双人按钮dSetSpriteVisible("be7",0);//游戏介绍界面开始游戏按钮dSetSpriteVisible("be8",0);//游戏失败再来一局按钮dSetSpriteVisible("be9",0);//游戏成功再来一局按钮dSetSpriteVisible("be10",0);dSetSpriteVisible("back1",1);//初始界面dSetSpriteVisible("back2",0);//游戏说明界面dSetSpriteVisible("back3",0);//道具说明界面dSetSpriteVisible("sound",1);//声音按钮dSetSpriteVisible("home",0);//主页按钮statehome=0;dSetSpriteVisible("back4",0);//单人选人界面dSetSpriteVisible("back5",0);//双人选人界面dSetSpriteVisible("pick1",0);//1p选择标志dSetSpriteVisible("pick2",0);//2p选择标志dSetSpriteVisible("back6",0);//游戏界面dSetSpriteVisible("back7",0);//暂停界面dSetSpriteVisible("back8",0);//游戏失败界面dSetSpriteVisible("back9",0);//单人游戏成功界面dSetSpriteVisible("back10",0);//双人游戏成功界面dSetSpriteVisible("m1",0);//第一张地图dSetSpriteVisible("lose",0);dSetSpriteVisible("win",0);dSetSpriteVisible("guan",0);if(sound==1){dSetSpriteVisible("ban",0);mciSendString("stop game/data/audio/begin.mp3",NULL,0,NULL);mciSendString("play game/data/audio/paopao.mp3 repeat",NULL,0,NULL);//播放音乐文件}else dSetSpriteVisible("ban",1);//禁止符号dSetSpriteVisible("minute1",0);dSetSpriteVisible("minute2",0);dSetSpriteVisible("second1",0);dSetSpriteVisible("second2",0);dSetSpriteVisible("pb",0);dSetSpriteVisible("gb",0);dSetSpriteVisible("bb",0);dSetSpriteVisible("yb",0);dSetSpriteVisible("ps",0);dSetSpriteVisible("gs",0);dSetSpriteVisible("bs",0);dSetSpriteVisible("ys",0);dSetSpriteVisible("ph",0);dSetSpriteVisible("gh",0);dSetSpriteVisible("bh",0);dSetSpriteVisible("yh",0);dSetSpriteVisible("pt",0);dSetSpriteVisible("gt",0);dSetSpriteVisible("bt",0);dSetSpriteVisible("yt",0);dSetSpriteVisible("end1",0);dSetSpriteVisible("end2",0);dSetSpriteVisible("end3",0);dSetSpriteVisible("end4",0);dSetSpriteVisible("end5",0);dSetSpriteVisible("end6",0);dSetSpriteVisible("end7",0);dSetSpriteVisible("end8",0);dSetSpriteVisible("end9",0);dSetSpriteVisible("end10",0);dSetSpriteVisible("end11",0);dSetSpriteVisible("end12",0);dSetSpriteVisible("end13",0);dSetSpriteVisible("end14",0);dSetSpriteVisible("end15",0);dSetSpriteVisible("end16",0);dSetSpriteVisible("end17",0);dSetSpriteVisible("end18",0);break;}case 1:case 2:case 3:case 4:case 5:break;case 6:case 7:{flag=2;if(h[play1]==0&&h[play2]==0)flag=1;int i;if(flag!=1)for(i=1;i<=4;i++)if(i!=play1&&i!=play2&&h[i]>0)flag=0;if(Pause==0){time-=fDeltaTime;if(time>0)GameRun(fDeltaTime);}if(time<0){int max=0;for(i=1;i<=4;i++)if(h[i]>0&&s[i]>max)max=s[i];if(max==s[play1]||max==s[play2])flag=2;else flag=1;}if(flag!=0){Pause=1;if(dtime>3){dtime=3;mciSendString("stop game/data/audio/begin.mp3",NULL,0,NULL);if(flag==1){dSetSpriteVisible("lose",1);       if(sound==1)mciSendString("play game/data/audio/fail.mp3",NULL,0,NULL);}else{dSetSpriteVisible("win",1);if(sound==1)mciSendString("play game/data/audio/win.mp3",NULL,0,NULL);}}elseif(0<dtime&&dtime<=3)dtime-=fDeltaTime;elseif(dtime<=0)GameEnd();}int Time=(int)time;int minute=Time/60,second=Time%60;int minute1=minute/10,minute2=minute%10;int second1=second/10,second2=second%10;dSetTextValue("minute1",minute1);dSetTextValue("minute2",minute2);dSetTextValue("second1",second1);dSetTextValue("second2",second2);dSetTextValue("pb",b[1]);dSetTextValue("yb",b[2]);dSetTextValue("bb",b[3]);dSetTextValue("gb",b[4]);dSetTextValue("ph",h[1]);dSetTextValue("yh",h[2]);dSetTextValue("bh",h[3]);dSetTextValue("gh",h[4]);dSetTextValue("ps",s[1]);dSetTextValue("ys",s[2]);dSetTextValue("bs",s[3]);dSetTextValue("gs",s[4]);break;}case 8:case 9:break;default:break;};
}
//改变人物朝向
void changetoward(int i,int j)
{char *szName=NULL;if(i==1){if(j==1)dAnimateSpritePlayAnimation("pink","pinkAnimation",0);elseif(j==2)dAnimateSpritePlayAnimation("pink","pinkAnimation1",0);elseif(j==3)dAnimateSpritePlayAnimation("pink","pinkAnimation3",0);elseif(j==4)dAnimateSpritePlayAnimation("pink","pinkAnimation2",0);}elseif(i==2){if(j==1)dAnimateSpritePlayAnimation("yellow","yellowAnimation",0);elseif(j==2)dAnimateSpritePlayAnimation("yellow","yellowAnimation1",0);elseif(j==3)dAnimateSpritePlayAnimation("yellow","yellowAnimation3",0);elseif(j==4)dAnimateSpritePlayAnimation("yellow","yellowAnimation2",0);}elseif(i==3){if(j==1)dAnimateSpritePlayAnimation("Blue","blueAnimation",0);elseif(j==2)dAnimateSpritePlayAnimation("Blue","blueAnimation1",0);elseif(j==3)dAnimateSpritePlayAnimation("Blue","blueAnimation3",0);elseif(j==4)dAnimateSpritePlayAnimation("Blue","blueAnimation2",0);}elseif(i==4){if(j==1)dAnimateSpritePlayAnimation("Green","greenAnimation",0);elseif(j==2)dAnimateSpritePlayAnimation("Green","greenAnimation1",0);elseif(j==3)dAnimateSpritePlayAnimation("Green","greenAnimation3",0);elseif(j==4)dAnimateSpritePlayAnimation("Green","greenAnimation2",0);}
}
// 每局开始前进行初始化,清空上一局相关数据
void GameInit()
{mciSendString("stop game/data/audio/paopao.mp3",NULL,0,NULL);if(sound==1)mciSendString("play game/data/audio/begin.mp3 repeat",NULL,0,NULL);Pause=0;dtime=5.f;time=180.f;dSetSpriteVisible("back6",1);dSetSpriteVisible("home",0);dSetSpriteVisible("m1",1);dSetSpriteVisible("minute1",1);dSetSpriteVisible("minute2",1);dSetSpriteVisible("second1",1);dSetSpriteVisible("second2",1);dSetSpriteVisible("pb",1);dSetSpriteVisible("gb",1);dSetSpriteVisible("bb",1);dSetSpriteVisible("yb",1);dSetSpriteVisible("ps",1);dSetSpriteVisible("gs",1);dSetSpriteVisible("bs",1);dSetSpriteVisible("ys",1);dSetSpriteVisible("ph",1);dSetSpriteVisible("gh",1);dSetSpriteVisible("bh",1);dSetSpriteVisible("yh",1);dSetSpriteVisible("end1",0);dSetSpriteVisible("end2",0);dSetSpriteVisible("end3",0);dSetSpriteVisible("end4",0);dSetSpriteVisible("end5",0);dSetSpriteVisible("end6",0);dSetSpriteVisible("end7",0);dSetSpriteVisible("end8",0);dSetSpriteVisible("end9",0);dSetSpriteVisible("end10",0);dSetSpriteVisible("end11",0);dSetSpriteVisible("end12",0);dSetSpriteVisible("end13",0);dSetSpriteVisible("end14",0);dSetSpriteVisible("end15",0);dSetSpriteVisible("end16",0);dSetSpriteVisible("end17",0);dSetSpriteVisible("end18",0);statehome=0;int i,j;for(i=1;i<=4;i++){h[i]=1;b[i]=1;s[i]=0;kill[i]=0;ice[i]=0;slow[i]=0;state[i]=1;icetime[i]=5.f;dietime[i]=5.f;slowtime[i]=5.f;power[i]=1;count[i]=0;speed[i]=10;defend[i]=0;glove[i]=0;tools[i]=0;}if(flag==1){guan=0;for(i=1;i<=4;i++)sfinal[i]=0;}guan++;dSetSpriteVisible("guan",1);dSetTextValue("guan",guan);//制作地图for(i=1;i<=12;i++)co[i]=0;int num=dRandomRange(0,4);for(i=0;i<lenx;i++)for(j=0;j<leny;j++){d[i][j]=0;dan[i][j]=0;hurt[i][j]=0;c[i][j]=0;a[i][j]=data[num][i][j];}char *szName=NULL,*sz=NULL;for(i=0;i<lenx;i++)for(j=0;j<leny;j++){int num=a[i][j];if(num!=0&&num!=6){count[num]++;f[i][j]=count[num];sz=dMakeSpriteName("block",num);szName=dMakeSpriteName(sz,count[num]);dCloneSprite(sz,szName);MoveSpriteToBlock(szName,i,j);}}//制作道具for(i=0;i<lenx;i++)for(j=0;j<leny;j++)if(a[i][j]==1||a[i][j]==2||a[i][j]==3){int choice=dRandomRange(1,4);if(choice==1){c[i][j]=dRandomRange(1,12);int num=c[i][j];co[num]++;cf[i][j]=co[num];}}dSetSpritePosition("block6",5.0729f,-2.6002f);gx[3]=3;gy[3]=9;a[3][9]=13;MoveSpriteToBlock1("Blue",gx[3],gy[3]);gx[1]=3;gy[1]=3;a[3][3]=11;MoveSpriteToBlock1("pink",gx[1],gy[1]);gx[2]=11;gy[2]=3;a[11][3]=12;MoveSpriteToBlock1("yellow",gx[2],gy[2]);gx[4]=11;gy[4]=9;a[11][9]=14;MoveSpriteToBlock1("Green",gx[4],gy[4]);to[1]=to[2]=to[3]=to[4]=1;changetoward(1,1);changetoward(2,1);changetoward(3,1);changetoward(4,1);head=1;tail=0;whead=1;wtail=0;
}
//队列处理
void finding(int ftail,int xx,int yy,int j)
{findx[ftail]=xx;findy[ftail]=yy;step[ftail]=step[j]+1;bef[ftail]=j;
}
// 每局游戏进行中
void GameRun(float fDeltaTime)
{int i;char *szName=NULL,*sz=NULL;int xx,yy;for(i=1;i<=4;i++){if(ice[i]==1)icetime[i]-=fDeltaTime;if(icetime[i]<0)ice[i]=0;if(slow[i]==1)slowtime[i]-=fDeltaTime;if(slowtime[i]<0){slow[i]=0;speed[i]*=2;}}//AIfor(i=1;i<=4;i++)if(i!=play1&&i!=play2&&h[i]>0&&Pause==0&&ice[i]==0){if(i==1)szName="pink";elseif(i==2)szName="yellow";elseif(i==3)szName="Blue";elseif(i==4)szName="Green";float speedx=dGetSpriteLinearVelocityX(szName);float speedy=dGetSpriteLinearVelocityY(szName);if(speedx<=0.001f&&speedy<=0.001f&&speedx>=-0.001f&&speedy>=-0.001f){int x=gx[i],y=gy[i];if(hurt[x][y]!=0&&from[x][y]!=i){if(hurt[x][y]==1){produce(from[x][y],x,y);continue;}elseif(hurt[x][y]==2){if(slow[i]==0)speed[i]/=2;slow[i]=1;slowtime[i]=7.f;}hurt[x][y]=0;}if(dan[x][y]==1)//在危险区{int j;fhead=1;ftail=1;step[1]=0;minstep=200;findx[1]=x;findy[1]=y;find=0;bef[1]=0;d[x][y]=1;for(j=fhead;j<=ftail;j++){xx=findx[j],yy=findy[j];d[xx][yy]=1;if(step[j]>=minstep)continue;if(dan[xx][yy]==0&&step[j]<minstep){minstep=step[j];find=j;continue;}if(xx>0&&d[xx-1][yy]==0&&a[xx-1][yy]==0){ftail++;finding(ftail,xx-1,yy,j);}if(xx<14&&d[xx+1][yy]==0&&a[xx+1][yy]==0){ftail++;finding(ftail,xx+1,yy,j);}if(yy>0&&d[xx][yy-1]==0&&a[xx][yy-1]==0){ftail++;finding(ftail,xx,yy-1,j);}                 if(yy<12&&d[xx][yy+1]==0&&a[xx][yy+1]==0){ftail++;finding(ftail,xx,yy+1,j);}}for(j=1;j<=ftail;j++)d[findx[j]][findy[j]]=0;while(step[find]!=1&&find>0)find=bef[find];if(find>0){xx=findx[find],yy=findy[find];if(xx==x+1)to[i]=4;elseif(xx==x-1)to[i]=3;elseif(yy==y-1)to[i]=2;elseif(yy==y+1)to[i]=1;changetoward(i,to[i]);Move(i,x,y,xx,yy);walk(i,xx,yy);gx[i]=xx;gy[i]=yy;}}elseif(dan[x][y]==0)//不在危险区{if((x>0&&a[x-1][y]<=3&&a[x-1][y]>0)||(x<14&&a[x+1][y]<=3&&a[x+1][y]>0)||(y>0&&a[x][y-1]<=3&&a[x][y-1]>0)||(y<12&&a[x][y+1]<=3&&a[x][y+1]>0)){place(i,x,y);continue;}int j;fhead=1;ftail=1;step[1]=0;minstep=200;findx[1]=x;findy[1]=y;find=0;bef[1]=0;d[x][y]=1;for(j=fhead;j<=ftail;j++){xx=findx[j],yy=findy[j];d[xx][yy]=1;if(step[j]>=minstep)continue;if(((xx>0&&a[xx-1][yy]<=3&&a[xx-1][yy]>0)||(xx<14&&a[xx+1][yy]<=3&&a[xx+1][yy]>0)||(yy>0&&a[xx][yy-1]<=3&&a[xx][yy-1]>0)||(yy<12&&a[xx][yy+1]<=3&&a[xx][yy+1]>0))&&step[j]<minstep){minstep=step[j];find=j;continue;}if(step[j]>=7&&dan[xx][yy]==0){minstep=step[j];find=j;continue;}if(xx>0&&d[xx-1][yy]==0&&a[xx-1][yy]==0&&dan[xx-1][yy]==0){ftail++;finding(ftail,xx-1,yy,j);}if(xx<14&&d[xx+1][yy]==0&&a[xx+1][yy]==0&&dan[xx+1][yy]==0){ftail++;finding(ftail,xx+1,yy,j);}if(yy>0&&d[xx][yy-1]==0&&a[xx][yy-1]==0&&dan[xx][yy-1]==0){ftail++;finding(ftail,xx,yy-1,j);}                   if(yy<12&&d[xx][yy+1]==0&&a[xx][yy+1]==0&&dan[xx][yy+1]==0){ftail++;finding(ftail,xx,yy+1,j);}                   }for(j=1;j<=ftail;j++)d[findx[j]][findy[j]]=0;while(step[find]!=1&&find>0)find=bef[find];if(find>0){xx=findx[find],yy=findy[find];if(xx==x+1)to[i]=4;elseif(xx==x-1)to[i]=3;elseif(yy==y-1)to[i]=2;elseif(yy==y+1)to[i]=1;changetoward(i,to[i]);Move(i,x,y,xx,yy);walk(i,xx,yy);gx[i]=xx;gy[i]=yy;}}}}//人物死亡动画for(i=1;i<=4;i++){if(i==1)szName="pink";elseif(i==2)szName="yellow";elseif(i==3)szName="Blue";elseif(i==4)szName="Green";if(h[i]<=0){h[i]=0;if(dietime[i]>1){dietime[i]=1;dSetSpritePosition(szName,100.f,100.f);szName=dMakeSpriteName("die",i);dCloneSprite("die",szName);MoveSpriteToBlock1(szName,gx[i],gy[i]);a[gx[i]][gy[i]]=0;}elseif(dietime[i]<=1&&dietime[i]>0)dietime[i]-=fDeltaTime;elseif(dietime[i]<=0){szName=dMakeSpriteName("die",i);dDeleteSprite(szName);}}}//炸弹延时爆炸for(i=head;i<=tail;i++){if(bombtime[i]>-3)bombtime[i]-=fDeltaTime;if(bombtime[i]<=-5&&head==i)head++;if(bombtime[i]<0&&bombtime[i]>=-3){if(i==head)head++;if(bombtime[i]<=-3)bombtime[i]=-5;int x=bombx[i],y=bomby[i];makedan(bombpower[i],x,y,0);int play=bombman[i];b[play]++;szName=dMakeSpriteName("bomb",i);dDeleteSprite(szName);//中心produce(play,x,y);if(a[x][y]==7)a[x][y]=0;//左int o=bombpower[i];while(x>0&&o>0&&(a[x-1][y]==0||a[x-1][y]>10)){o--;x--;produce(play,x,y);}if(x>0&&o>0)produce(play,x-1,y);//右x=bombx[i],y=bomby[i];o=bombpower[i];while(x<14&&o>0&&(a[x+1][y]==0||a[x+1][y]>10)){o--;x++;produce(play,x,y);}if(x<14&&o>0)produce(play,x+1,y);//上x=bombx[i],y=bomby[i];o=bombpower[i];while(y>0&&o>0&&(a[x][y-1]==0||a[x][y-1]>10)){o--;y--;produce(play,x,y);}if(y>0&&o>0)produce(play,x,y-1);//下x=bombx[i],y=bomby[i];o=bombpower[i];while(y<12&&o>0&&(a[x][y+1]==0||a[x][y+1]>10)){o--;y++;produce(play,x,y);}if(y<12&&o>0)produce(play,x,y+1);}}//空白显示延迟for(i=whead;i<=wtail;i++){whitetime[i]-=fDeltaTime;if(whitetime[i]<0){szName=dMakeSpriteName("white",i);dDeleteSprite(szName);whead++;}}
}
// 本局游戏结束
void GameEnd()
{if(sound==1)mciSendString("play game/data/audio/paopao.mp3 repeat",NULL,0,NULL);dSetSpriteVisible("win",0);dSetSpriteVisible("lose",0);dSetSpriteVisible("minute1",0);dSetSpriteVisible("minute2",0);dSetSpriteVisible("second1",0);dSetSpriteVisible("second2",0);dSetSpriteVisible("pb",0);dSetSpriteVisible("gb",0);dSetSpriteVisible("bb",0);dSetSpriteVisible("yb",0);dSetSpriteVisible("ps",0);dSetSpriteVisible("gs",0);dSetSpriteVisible("bs",0);dSetSpriteVisible("ys",0);dSetSpriteVisible("ph",0);dSetSpriteVisible("gh",0);dSetSpriteVisible("bh",0);dSetSpriteVisible("yh",0);dSetSpriteVisible("pt",0);dSetSpriteVisible("gt",0);dSetSpriteVisible("bt",0);dSetSpriteVisible("yt",0);dSetSpriteVisible("guan",0);dSetSpriteVisible("back6",0);dSetSpriteVisible("m1",0);dSetSpritePosition("block6",100.f,100.f);dSetSpritePosition("pink",100.f,100.f);dSetSpritePosition("yellow",100.f,100.f);dSetSpritePosition("Blue",100.f,100.f);dSetSpritePosition("Green",100.f,100.f);//清除方块char *szName=NULL,*sz=NULL;int i,j;for(i=1;i<=5;i++){sz=dMakeSpriteName("block",i);for(j=1;j<=count[i];j++){szName=dMakeSpriteName(sz,j);dDeleteSprite(szName);}}//清除道具for(i=1;i<=12;i++){sz=dMakeSpriteName("t",i);for(j=1;j<=co[i];j++){szName=dMakeSpriteName(sz,j+10);dDeleteSprite(szName);}}//清除死亡、手套、防护盾图片for(i=1;i<=4;i++){szName=dMakeSpriteName("die",i);dDeleteSprite(szName);szName=dMakeSpriteName("glove",i);dDeleteSprite(szName);  szName=dMakeSpriteName("defend",i);dDeleteSprite(szName);szName=dMakeSpriteName("tool",i);dDeleteSprite(szName);szName=dMakeSpriteName("dark",i);dDeleteSprite(szName);}//清除炸弹for(i=head;i<=tail;i++){szName=dMakeSpriteName("bomb",i);dDeleteSprite(szName);}//清除空白for(i=whead;i<=wtail;i++){szName=dMakeSpriteName("white",i);dDeleteSprite(szName);}if(g_iGameState==6){if(flag==1){dSetSpriteVisible("back8",1);dSetSpriteVisible("be8",1);g_iGameState=8;}elseif(flag==2){dSetSpriteVisible("back9",1);dSetSpriteVisible("be9",1);dSetSpriteVisible("end1",1);dSetSpriteVisible("end2",1);dSetSpriteVisible("end3",1);dSetSpriteVisible("end4",1);dSetSpriteVisible("end5",1);dSetSpriteVisible("end6",1);dSetTextValue("end1",kill[play1]*1000);dSetTextValue("end2",s[play1]-kill[play1]*1000);dSetTextValue("end3",(int)(time*10));dSetTextValue("end4",1000);dSetTextValue("end5",s[play1]+(int)(time*10)+1000);sfinal[play1]+=s[play1]+(int)(time*10)+1000;dSetTextValue("end6",sfinal[play1]);g_iGameState=9;}}elseif(g_iGameState==7){if(flag==1){dSetSpriteVisible("back8",1);dSetSpriteVisible("be8",1);g_iGameState=8;}elseif(flag==2){dSetSpriteVisible("back10",1);dSetSpriteVisible("be9",1);//play1int Time=(int)(time*10);dSetSpriteVisible("end7",1);dSetSpriteVisible("end8",1);dSetSpriteVisible("end9",1);dSetSpriteVisible("end10",1);dSetSpriteVisible("end11",1);dSetSpriteVisible("end12",1);dSetTextValue("end7",kill[play1]*1000);dSetTextValue("end8",s[play1]-kill[play1]*1000);if(h[play1]==0)Time=0;dSetTextValue("end9",Time);dSetTextValue("end10",1000);dSetTextValue("end11",s[play1]+Time+1000);sfinal[play1]+=s[play1]+Time+1000;dSetTextValue("end12",sfinal[play1]);//play2Time=(int)(time*10);dSetSpriteVisible("end13",1);dSetSpriteVisible("end14",1);dSetSpriteVisible("end15",1);dSetSpriteVisible("end16",1);dSetSpriteVisible("end17",1);dSetSpriteVisible("end18",1);dSetTextValue("end13",kill[play2]*1000);dSetTextValue("end14",s[play2]-kill[play2]*1000);if(h[play2]==0)Time=0;dSetTextValue("end15",Time);dSetTextValue("end16",1000);dSetTextValue("end17",s[play2]+Time+1000);sfinal[play2]+=s[play2]+Time+1000;dSetTextValue("end18",sfinal[play2]);g_iGameState=10;}}
}
// 鼠标移动
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void OnMouseMove( const float fMouseX, const float fMouseY )
{if(g_iGameState==0)//初始界面{//鼠标移动到开始游戏上if(fMouseX>=20&&fMouseX<=40&&fMouseY>=9.9995&&fMouseY<=16.8845)dAnimateSpritePlayAnimation( "be1", "P1Animation1", 0 );elsedAnimateSpritePlayAnimation( "be1", "P1Animation", 0 );//鼠标移动到游戏介绍上if(fMouseX>=20&&fMouseX<=40&&fMouseY>=21.1945&&fMouseY<=28.0795)dAnimateSpritePlayAnimation( "be2", "P2Animation1", 0 );elsedAnimateSpritePlayAnimation( "be2", "P2Animation", 0 );}elseif(g_iGameState==1)//选择模式界面{//鼠标移动到单人上if(fMouseX>=20&&fMouseX<=40&&fMouseY>=9.9995&&fMouseY<=16.8845)dAnimateSpritePlayAnimation( "be5", "P5Animation1", 0 );elsedAnimateSpritePlayAnimation( "be5", "P5Animation", 0 );//鼠标移动到双人上if(fMouseX>=20&&fMouseX<=40&&fMouseY>=21.1945&&fMouseY<=28.0795)dAnimateSpritePlayAnimation( "be6", "P6Animation1", 0 );elsedAnimateSpritePlayAnimation( "be6", "P6Animation", 0 );}elseif(g_iGameState==2)//游戏说明界面{//鼠标移动到道具说明上if(fMouseX>=-40&&fMouseX<=-20&&fMouseY>=24.9995&&fMouseY<=31.8845)dAnimateSpritePlayAnimation( "be3", "P3Animation1", 0 );elsedAnimateSpritePlayAnimation( "be3", "P3Animation", 0 );//鼠标移动到开始游戏上if(fMouseX>=20&&fMouseX<=40&&fMouseY>=24.9995&&fMouseY<=31.8845)dAnimateSpritePlayAnimation( "be7", "P1Animation1", 0 );elsedAnimateSpritePlayAnimation( "be7", "P1Animation", 0 );}elseif(g_iGameState==3)//道具说明界面{//鼠标移动到游戏说明上if(fMouseX>=-40&&fMouseX<=-20&&fMouseY>=24.9995&&fMouseY<=31.8845)dAnimateSpritePlayAnimation( "be4", "P4Animation1", 0 );elsedAnimateSpritePlayAnimation( "be4", "P4Animation", 0 );//鼠标移动到开始游戏上if(fMouseX>=20&&fMouseX<=40&&fMouseY>=24.9995&&fMouseY<=31.8845)dAnimateSpritePlayAnimation( "be7", "P1Animation1", 0 );elsedAnimateSpritePlayAnimation( "be7", "P1Animation", 0 );}elseif(g_iGameState==8){if(fMouseX>=-10&&fMouseX<=10&&fMouseY>=5.0005&&fMouseY<=11.8855)dAnimateSpritePlayAnimation( "be8", "be7Animation1", 0 );elsedAnimateSpritePlayAnimation( "be8", "be7Animation", 0 );}elseif(g_iGameState==9||g_iGameState==10){if(fMouseX>=-10&&fMouseX<=10&&fMouseY>=28.1155&&fMouseY<=35.0005)dAnimateSpritePlayAnimation( "be9", "be8Animation1", 0 );elsedAnimateSpritePlayAnimation( "be9", "be8Animation", 0 );}
}
//1p选择标志移动
void Move1(int pick1)
{if(pick1==1)dSpriteMoveTo("pick1",(float)-24.795,(float)-21.674,(float)999999999,1);elseif(pick1==2)dSpriteMoveTo("pick1",(float)-8.161,(float)-21.674,(float)999999999,1);elseif(pick1==3)dSpriteMoveTo("pick1",(float)8.381,(float)-21.674,(float)999999999,1);elsedSpriteMoveTo("pick1",(float)25.205,(float)-21.674,(float)999999999,1);
}
//2p选择标志移动
void Move2(int pick2)
{if(pick2==1)dSpriteMoveTo("pick2",(float)-24.795,(float)-21.674,(float)999999999,1);elseif(pick2==2)dSpriteMoveTo("pick2",(float)-8.161,(float)-21.674,(float)999999999,1);elseif(pick2==3)dSpriteMoveTo("pick2",(float)8.381,(float)-21.674,(float)999999999,1);elsedSpriteMoveTo("pick2",(float)25.205,(float)-21.674,(float)999999999,1);
}
// 鼠标点击
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{//鼠标点击主页按钮if(fMouseX>=45&&fMouseX<=50&&fMouseY>=-37.5&&fMouseY<=-32.5&&statehome==1){g_iGameState=0;return;}//鼠标点击声音按钮if(fMouseX>=-44.5&&fMouseX<=-39.5&&fMouseY>=31.5&&fMouseY<=36.5){if(sound==1){dSetSpriteVisible("ban",1);mciSendString("pause game/data/audio/begin.mp3",NULL,0,NULL);mciSendString("pause game/data/audio/paopao.mp3",NULL,0,NULL);sound=0;}else{dSetSpriteVisible("ban",0);if(g_iGameState==6||g_iGameState==7)mciSendString("play game/data/audio/begin.mp3 repeat",NULL,0,NULL);elsemciSendString("play game/data/audio/paopao.mp3 repeat",NULL,0,NULL);sound=1;}}if(g_iGameState==0)//初始界面{//鼠标点击游戏介绍if(fMouseX>=20&&fMouseX<=40&&fMouseY>=21.1945&&fMouseY<=28.0795){g_iGameState=2;dSetSpriteVisible("back1",0);dSetSpriteVisible("back2",1);dSetSpriteVisible("be2",0);dSetSpriteVisible("be1",0);dSetSpriteVisible("be3",1);dSetSpriteVisible("be7",1);dSetSpriteVisible("home",1);statehome=1;}//鼠标点击开始游戏if(fMouseX>=20&&fMouseX<=40&&fMouseY>=9.9995&&fMouseY<=16.8845){g_iGameState=1;dSetSpriteVisible("be1",0);dSetSpriteVisible("be2",0);dSetSpriteVisible("be5",1);dSetSpriteVisible("be6",1);dSetSpriteVisible("home",1);statehome=1;}return;}elseif(g_iGameState==2)//游戏说明界面{//鼠标点击开始游戏if(fMouseX>=20&&fMouseX<=40&&fMouseY>=24.9995&&fMouseY<=31.8845){g_iGameState=1;dSetSpriteVisible("back1",1);dSetSpriteVisible("back2",0);dSetSpriteVisible("be3",0);dSetSpriteVisible("be7",0);dSetSpriteVisible("be5",1);dSetSpriteVisible("be6",1);}//鼠标点击道具说明if(fMouseX>=-40&&fMouseX<=-20&&fMouseY>=24.9995&&fMouseY<=31.8845){g_iGameState=3;dSetSpriteVisible("back3",1);dSetSpriteVisible("back2",0);dSetSpriteVisible("be3",0);dSetSpriteVisible("be4",1);}return;}elseif(g_iGameState==3)//道具说明界面{//鼠标点击开始游戏if(fMouseX>=20&&fMouseX<=40&&fMouseY>=24.9995&&fMouseY<=31.8845){g_iGameState=1;dSetSpriteVisible("back1",1);dSetSpriteVisible("back3",0);dSetSpriteVisible("be4",0);dSetSpriteVisible("be7",0);dSetSpriteVisible("be5",1);dSetSpriteVisible("be6",1);}//鼠标点击游戏说明if(fMouseX>=-40&&fMouseX<=-20&&fMouseY>=24.9995&&fMouseY<=31.8845){g_iGameState=2;dSetSpriteVisible("back2",1);dSetSpriteVisible("back3",0);dSetSpriteVisible("be4",0);dSetSpriteVisible("be3",1);}return;}elseif(g_iGameState==1)//选择模式界面{//鼠标点击双人if(fMouseX>=20&&fMouseX<=40&&fMouseY>=21.1945&&fMouseY<=28.0795){          state1=0;state2=0;g_iGameState=5;dSetSpriteVisible("be5",0);dSetSpriteVisible("be6",0);dSetSpriteVisible("back1",0);dSetSpriteVisible("back5",1);dSetSpriteVisible("pick1",1);dSetSpriteVisible("pick2",1);pick1=1;pick2=2;Move1(pick1);Move2(pick2);}//鼠标点击单人if(fMouseX>=20&&fMouseX<=40&&fMouseY>=9.9995&&fMouseY<=16.8845){g_iGameState=4;dSetSpriteVisible("be5",0);dSetSpriteVisible("be6",0);dSetSpriteVisible("back1",0);dSetSpriteVisible("back4",1);dSetSpriteVisible("pick1",1);pick1=1;Move1(pick1);}return;}elseif(g_iGameState==8)//游戏失败界面{if(fMouseX>=-10&&fMouseX<=10&&fMouseY>=5.0005&&fMouseY<=11.8855){dSetSpriteVisible("back8",0);dSetSpriteVisible("be8",0);g_iGameState=0;}return;}elseif(g_iGameState==9||g_iGameState==10)//游戏成功界面{if(fMouseX>=-10&&fMouseX<=10&&fMouseY>=28.1155&&fMouseY<=35.0005){dSetSpriteVisible("back9",0);dSetSpriteVisible("back10",0);dSetSpriteVisible("be9",0);g_iGameState=g_iGameState-3;flag=2;GameInit();}return;}
}
// 鼠标弹起
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{}
//手套推动炸弹功能实现
void glovemake(int play,int x,int y,int nx,int ny)
{int xx=x,yy=y;int n=bombnum[nx][ny];bombtime[n]=-3;a[nx][ny]-=7;if(to[play]==1){    yy++;while(yy<=12&&a[xx][yy]==0)yy++;yy--;}elseif(to[play]==2){yy--;while(yy>=0&&a[xx][yy]==0)yy--;yy++;}elseif(to[play]==3){xx--;while(xx>=0&&a[xx][yy]==0)xx--;xx++;}elseif(to[play]==4){xx++;while(xx<=15&&a[xx][yy]==0)xx++;xx--;}bombx[n]=xx;bomby[n]=yy;a[xx][yy]+=7;char *szName=NULL;szName=dMakeSpriteName("bomb",n);MoveSpriteToBlock(szName,xx,yy);
}
// 键盘按下
// 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义
// 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下)
void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{if(iKey==KEY_P&&(g_iGameState==6||g_iGameState==7)&&(h[play1]>0||h[play2]>0)){if(Pause==0)//游戏界面{dSetSpriteVisible("back7",1);Pause=1;return;}elseif(Pause==1)//暂停界面{dSetSpriteVisible("back7",0);Pause=0;return;}}elseif(g_iGameState==4)//单人选人界面{if(iKey==KEY_LEFT)pick1--;if(iKey==KEY_RIGHT)pick1++;if(pick1==5)pick1=1;if(pick1==0)pick1=4;Move1(pick1);if(iKey==KEY_SPACE){play1=pick1;play2=play1;g_iGameState=6;dSetSpriteVisible("back4",0);dSetSpriteVisible("pick1",0);flag=1;GameInit();return;}}elseif(g_iGameState==5)//双人选人界面{if((iKey==KEY_A||iKey==KEY_D)&&state1==0){if(iKey==KEY_A){pick1--;if(pick1==0)pick1=4;if(pick1==pick2)pick1--;if(pick1==0)pick1=4;}if(iKey==KEY_D){pick1++;if(pick1==5)pick1=1;if(pick1==pick2)pick1++;if(pick1==5)pick1=1;}Move1(pick1);}elseif((iKey==KEY_LEFT||iKey==KEY_RIGHT)&&state2==0){if(iKey==KEY_LEFT){pick2--;if(pick2==0)pick2=4;if(pick1==pick2)pick2--;if(pick2==0)pick2=4;}if(iKey==KEY_RIGHT){pick2++;if(pick2==5)pick2=1;if(pick1==pick2)pick2++;if(pick2==5)pick2=1;}Move2(pick2);}if(iKey==KEY_SPACE)state1=1;if(iKey==KEY_ENTER)state2=1;if(state1==1&&state2==1){play1=pick1;play2=pick2;g_iGameState=7;dSetSpriteVisible("back5",0);dSetSpriteVisible("pick1",0);dSetSpriteVisible("pick2",0);flag=1;GameInit();return;}}elseif(g_iGameState==6&&h[play1]>0&&Pause==0)//单人游戏界面{//play1char *szName=NULL;if(play1==1)szName="pink";elseif(play1==2)szName="yellow";elseif(play1==3)szName="Blue";elseif(play1==4)szName="Green";float speedx=dGetSpriteLinearVelocityX(szName);float speedy=dGetSpriteLinearVelocityY(szName);if(speedx<=0.001f&&speedy<=0.001f&&speedx>=-0.001f&&speedy>=-0.001f){int cnt;if(iKey==KEY_LEFT){to[play1]=3;cnt=a[gx[play1]-1][gy[play1]];if(gx[play1]>0){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1]-1,gy[play1]);gx[play1]--;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1]-1,gy[play1]);}}elseif(iKey==KEY_RIGHT){to[play1]=4;cnt=a[gx[play1]+1][gy[play1]];if(gx[play1]<14){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1]+1,gy[play1]);gx[play1]++;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1]+1,gy[play1]);}}elseif(iKey==KEY_UP){to[play1]=2;cnt=a[gx[play1]][gy[play1]-1];if(gy[play1]>0){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1],gy[play1]-1);gy[play1]--;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1],gy[play1]-1);}}elseif(iKey==KEY_DOWN){to[play1]=1;cnt=a[gx[play1]][gy[play1]+1];if(gy[play1]<12){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1],gy[play1]+1);gy[play1]++;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1],gy[play1]+1);}}elseif(iKey==KEY_SPACE)workout(play1,gx[play1],gy[play1]);walk(play1,gx[play1],gy[play1]);changetoward(play1,to[play1]);toolwork(play1,gx[play1],gy[play1]);}}elseif(g_iGameState==7&&(h[play1]>0||h[play2]>0)&&Pause==0)//双人游戏界面{//play1char *szName=NULL;if(play1==1)szName="pink";elseif(play1==2)szName="yellow";elseif(play1==3)szName="Blue";elseif(play1==4)szName="Green";float speedx=dGetSpriteLinearVelocityX(szName);float speedy=dGetSpriteLinearVelocityY(szName);if(speedx<=0.001f&&speedy<=0.001f&&speedx>=-0.001f&&speedy>=-0.001f&&ice[play1]==0&&h[play1]>0){int cnt;if(iKey==KEY_A){to[play1]=3;cnt=a[gx[play1]-1][gy[play1]];if(gx[play1]>0){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1]-1,gy[play1]);gx[play1]--;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1]-1,gy[play1]);}}elseif(iKey==KEY_D){to[play1]=4;cnt=a[gx[play1]+1][gy[play1]];if(gx[play1]<14){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1]+1,gy[play1]);gx[play1]++;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1]+1,gy[play1]);}}elseif(iKey==KEY_W){to[play1]=2;cnt=a[gx[play1]][gy[play1]-1];if(gy[play1]>0){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1],gy[play1]-1);gy[play1]--;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1],gy[play1]-1);}}elseif(iKey==KEY_S){to[play1]=1;cnt=a[gx[play1]][gy[play1]+1];if(gy[play1]<12){if(cnt==0){Move(play1,gx[play1],gy[play1],gx[play1],gy[play1]+1);gy[play1]++;}elseif(cnt==7&&glove[play1]==1)glovemake(play1,gx[play1],gy[play1],gx[play1],gy[play1]+1);}}elseif(iKey==KEY_SPACE)workout(play1,gx[play1],gy[play1]);walk(play1,gx[play1],gy[play1]);changetoward(play1,to[play1]);toolwork(play1,gx[play1],gy[play1]);}//play2if(play2==1)szName="pink";elseif(play2==2)szName="yellow";elseif(play2==3)szName="Blue";elseif(play2==4)szName="Green";speedx=dGetSpriteLinearVelocityX(szName);speedy=dGetSpriteLinearVelocityY(szName);if(speedx<=0.001f&&speedy<=0.001f&&speedx>=-0.001f&&speedy>=-0.001f&&ice[play2]==0&&h[play2]>0){int cnt;if(iKey==KEY_LEFT){to[play2]=3;cnt=a[gx[play2]-1][gy[play2]];if(gx[play2]>0){if(cnt==0){Move(play2,gx[play2],gy[play2],gx[play2]-1,gy[play2]);gx[play2]--;}elseif(cnt==7&&glove[play2]==1)glovemake(play2,gx[play2],gy[play2],gx[play2]-1,gy[play2]);}}elseif(iKey==KEY_RIGHT){to[play2]=4;cnt=a[gx[play2]+1][gy[play2]];if(gx[play2]<14){if(cnt==0){Move(play2,gx[play2],gy[play2],gx[play2]+1,gy[play2]);gx[play2]++;}elseif(cnt==7&&glove[play2]==1)glovemake(play2,gx[play2],gy[play2],gx[play2]+1,gy[play2]);}}elseif(iKey==KEY_UP){to[play2]=2;cnt=a[gx[play2]][gy[play2]-1];if(gy[play2]>0){if(cnt==0){Move(play2,gx[play2],gy[play2],gx[play2],gy[play2]-1);gy[play2]--;}elseif(cnt==7&&glove[play2]==1)glovemake(play2,gx[play2],gy[play2],gx[play2],gy[play2]-1);}}elseif(iKey==KEY_DOWN){to[play2]=1;cnt=a[gx[play2]][gy[play2]+1];if(gy[play2]<12){if(cnt==0){Move(play2,gx[play2],gy[play2],gx[play2],gy[play2]+1);gy[play2]++;}elseif(cnt==7&&glove[play2]==1)glovemake(play2,gx[play2],gy[play2],gx[play2],gy[play2]+1);}}elseif(iKey==KEY_ENTER)workout(play2,gx[play2],gy[play2]);walk(play2,gx[play2],gy[play2]);changetoward(play2,to[play2]);toolwork(play2,gx[play2],gy[play2]);}}
}
// 键盘弹起
// 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义
void OnKeyUp( const int iKey )
{}
// 精灵与精灵碰撞
// 参数 szSrcName:发起碰撞的精灵名字
// 参数 szTarName:被碰撞的精灵名字
void OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{}
// 精灵与世界边界碰撞
// 参数 szName:碰撞到边界的精灵名字
// 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边
void OnSpriteColWorldLimit( const char *szName, const int iColSide )
{}

Funcode-Q版泡泡堂相关推荐

  1. 【Python游戏】Python实现一个Q版泡泡堂小游戏 | 附带源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复泡泡堂 Python ...

  2. 【Python游戏】Python各大游戏合集(2):开心消消乐、坦克大战、Q版泡泡堂、愤怒的小鸟、拼图 | 附带源码

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 公众号:Python日志 可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!! 源码领取:加Pyth ...

  3. 大家记忆中的Q版泡泡堂是不是这个样子的呀!Python实现简易Q版泡泡堂小游戏!!!

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些P ...

  4. 回忆杀,pythonQ版泡泡堂

    导语: 哈喽,要说起小时候玩过的经典游戏,QQ堂和泡泡堂是不能被忽略的.双堂作为小时候​炸弹人网络游戏的典范,承载了一代人的童年回忆,下面看看小编用python做的Q版泡泡堂吧! pythonQ版泡泡 ...

  5. 基于JAVA实现简易版泡泡堂小游戏

    一.简介--童年记忆 <泡泡堂>是由韩国游戏公司Nexon开发的一款休闲游戏(Casual Game),于2003年在中国大陆上线,由盛大网络运营.游戏讲述了在哈巴森林的一个村落的村民们利 ...

  6. [源码和文档分享]基于JAVA实现简易版泡泡堂小游戏

    一.简介--童年记忆 <泡泡堂>是由韩国游戏公司Nexon开发的一款休闲游戏(Casual Game),于2003年在中国大陆上线,由盛大网络运营.游戏讲述了在哈巴森林的一个村落的村民们利 ...

  7. C#版 泡泡堂 1.0

    泡泡堂 1.0 测试版 终于开发成功 申明: 本游戏所用素材版权归盛大所有,本人无任何版权,任意翻版 ,仅为大家娱乐之用. 相关算法保留 半开源 开发工具:C#+DX9+Winsock 开发时间: 3 ...

  8. C/C++项目:编译最爱的童年回忆泡泡堂小游戏教程

    <Q版泡泡堂>,是一款经典的flash小游戏,主要以多吃道具,躲避危险,放泡泡把别的人物炸死,才能获得胜利作为游戏目标. 今天我就用C语言带大家一步步去完成好玩有趣学会没网也能玩的属于自己 ...

  9. JAVA 实现《泡泡堂基础版》游戏

    前言 <泡泡堂基础版>是一个基于java的自制游戏,游戏设计为双人pk积分赛模式,在这个模式里面,玩家只要率先达到一定分数既可以赢得比赛.玩家可以通过炸箱子可以得到少量的分数,也可以通过炸 ...

最新文章

  1. vin端口是什么意思_端口有无开启
  2. 233网校java_java辅导:使用java模拟登陆考试大
  3. ABP 基础设施层——集成 Entity Framework
  4. NoneBot2插件——打印系统状态
  5. 按键驱动的思路分析和代码实现
  6. JavaWeb学习之路——SpringBoot整合Mybatis(二)
  7. python os模块方法_python os模块的常用方法
  8. 【洛谷1361】 小M的作物(最小割)
  9. 微软4年后重登市值第一,纳德拉如何做到的?
  10. modbus调试工具 linux,linux libmodbus的移植
  11. P4721 【模板】分治 FFT
  12. 数据科学家编程能力需要多好_我们不需要这么多的数据科学家
  13. vc6项目-vc8项目 转换日志
  14. CVPR2018_主干网络系列(3)_SE-Net及其衍生的网络[SE-XX-Net]
  15. mysql数据库怎么md5加密解密_mysql数据库中md5加密解密
  16. MAC电脑新建TXT文档快捷键的设置技巧
  17. iOS根据ts文件路径封装成m3u8文件及m3u8播放
  18. 小区同步、LTE的时间结构(FDD/TDD)
  19. ΣCO时间:华为联合亚控筑基制造业数字化转型
  20. 使用ndp.view标注大型医学图像

热门文章

  1. 软件工程——理论与实践(第二版)课后习题整理
  2. 神武3进不去 服务器响应,windows7系统玩神武2卡机的解决方法
  3. 文心一言对于宣传文案理解
  4. leelen可视对讲怎么接线_楼道对讲门铃怎么接线
  5. 初识Grad-CAM
  6. 记一次计算机课作文,记一次课堂活动作文500字
  7. c语言知道ascII码求字母,c语言的ascii代码
  8. ASCII表 ASCII 非打印控制字符 扩展 ASCII 打印字符
  9. 【Ubuntu20安装aria2以及配置web端】
  10. 数学与计算机科学虎扑,数学发展到今天还有继续研究的必要吗?