#include
#include
#include
#include
void loadMenu();
void homeMenu();
void choice();
void introduce();
void createMap();
void enterNext();
void roleMove();
void mstMove();
void dieOver();
void crashJudge();
void showScore();
void gameOver();
//记录人物坐标重置坐标
//(row,col)
int row=0;
int col=0;
//记录怪物坐标
//(mstrow,mstcol)
int mstrow=0;
int mstcol=0;
//记录血量
int roleBlood=0;
//记录分数
int score=0;
//判断关卡
int lvFlag=0;
int TOTAL=0;
#define t1 20
#define t2 12
#define t3 10
#define WIDTH 10
#define LENGTH 10
#define BLR 9
#define BLC1 0
#define BLC2 1
#define BLC3 2
int pMap[WIDTH][LENGTH]={0};
const int pMap1[WIDTH][LENGTH]=
{
1,1,1,1,1,1,1,1,1,1,
1,9,0,0,0,0,0,0,9,1,
1,4,9,2,9,9,2,9,9,1,
1,0,2,9,9,9,9,2,0,1,
1,9,9,9,3,9,9,9,9,1,
1,0,2,9,9,9,9,2,0,1,
1,0,9,2,9,9,2,9,0,1,
1,0,0,0,0,0,0,0,0,1,
1,9,1,1,9,9,1,1,9,1,
10,10,10,9,9,9,9,9,9,9
};
const int pMap2[WIDTH][LENGTH]=
{
1,1,1,1,1,1,1,1,1,1,
1,0,0,2,0,0,0,0,0,1,
1,0,9,2,9,9,9,2,2,1,
1,0,9,2,9,9,9,9,0,1,
1,0,9,9,3,9,9,9,0,1,
1,9,9,9,9,9,2,9,9,1,
1,2,2,9,4,9,2,9,9,1,
1,9,9,9,9,9,2,9,9,1,
1,1,1,1,1,1,1,1,1,1,
10,10,10,9,9,9,9,9,9,9
};
const int pMap3[WIDTH][LENGTH]=
{
1,1,1,1,1,1,1,1,1,1,
1,0,0,2,0,0,2,0,0,1,
1,0,2,9,9,9,9,2,0,1,
1,0,2,9,9,9,9,2,0,1,
1,9,9,9,3,9,9,9,9,1,
1,2,9,9,9,9,9,9,2,1,
1,4,9,2,9,9,2,9,9,1,
1,9,9,2,9,9,2,9,9,1,
1,1,1,1,1,1,1,1,1,1,
10,10,10,9,9,9,9,9,9,9
};
int main()
{
initgraph(500, 550);
loadMenu();
delay_ms(800);
homeMenu();
cleardevice();
closegraph();
return 0;
}
//加载界面
void loadMenu()
{
PIMAGE pLoad = newimage();
getimage(pLoad, "img\\load.png",0,0);
putimage(0, 0, pLoad);
delimage(pLoad);
}
//主界面
void homeMenu()
{
PIMAGE istart = newimage();
getimage(istart, "img\\start.bmp",0,0);
putimage(0, 0, istart);
delimage(istart);
// 画帧率文字
char str[20];
sprintf(str, "fps %.02f", getfps()); //调用getfps取得当前帧率
setcolor(WHITE);
outtextxy(0, 0, str);
//鼠标点击
mouse_msg mMsg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
while(mousemsg())
{
mMsg = getmouse();
}
//选择关卡
if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>140&&mMsg.x<335&&mMsg.y>260&&mMsg.y<300)
{
choice();
}
//游戏说明
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>140&&mMsg.x<335&&mMsg.y>340&&mMsg.y<370)
{
introduce();
}
//退出
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>140&&mMsg.x<335&&mMsg.y>400&&mMsg.y<435)
{
cleardevice();
closegraph();
}
}
getch();
}
//选择关卡界面
void choice()
{
PIMAGE pChioce = newimage();
getimage(pChioce, "img\\choice.bmp",0,0);
putimage(0, 0, pChioce);
delimage(pChioce);
mouse_msg mMsg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
while(mousemsg())
{
mMsg = getmouse();
}
//选择关卡01
if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>40&&mMsg.x<155&&mMsg.y>180&&mMsg.y<335)
{
lvFlag=1;
TOTAL=t1;
for(int i=0;ifor(int j=0;j//02
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>215&&mMsg.x<335&&mMsg.y>270&&mMsg.y<420)
{
lvFlag=2;
TOTAL=t2;
for(int i=0;ifor(int j=0;j//03
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>375&&mMsg.x<500&&mMsg.y>340&&mMsg.y<500)
{
lvFlag=3;
TOTAL=t3;
for(int i=0;ifor(int j=0;j//游戏介绍
void introduce()
{
PIMAGE pIntro = newimage();
getimage(pIntro, "img\\introduce.bmp",0,0);
putimage(0, 0, pIntro);
delimage(pIntro);
mouse_msg mMsg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
while(mousemsg())
{
mMsg = getmouse();
}
//选择关卡01
if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>0&&mMsg.x<500&&mMsg.y>0&&mMsg.y<550)
{
cleardevice();
homeMenu();
}
}
getch();
}
//进入下一关卡
void enterNext()
{
PIMAGE pNext = newimage();
getimage(pNext, "img\\next.bmp",0,0);
putimage(0, 0, pNext);
delimage(pNext);
mouse_msg mMsg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
while(mousemsg())
{
mMsg = getmouse();
}
//选择下一关卡
if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>185&&mMsg.x<310&&mMsg.y>370&&mMsg.y<430)
{
cleardevice();
choice();
}
//退出
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>380&&mMsg.x<470&&mMsg.y>350&&mMsg.y<450)
{
cleardevice();
closegraph();
}
//进入到
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>50&&mMsg.x<135&&mMsg.y>350&&mMsg.y<450)
{
gameOver();
}
}
}
//死亡游戏结束界面
void dieOver()
{
delay_ms(600);
PIMAGE pOver = newimage();
getimage(pOver, "img\\dieover.bmp",0,0);
putimage(0, 0, pOver);
delimage(pOver);
mouse_msg mMsg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
while(mousemsg())
{
mMsg = getmouse();
}
//重新开始
if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>190&&mMsg.x<310&&mMsg.y>420&&mMsg.y<480)
{
//判断在第几关重新开始???
if(lvFlag==1)
{
for(int i=0;ifor(int j=0;jelse if (lvFlag==2)
{
for(int i=0;ifor(int j=0;jelse if (lvFlag==2)
{
for(int i=0;ifor(int j=0;j//退出
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>365&&mMsg.x<465&&mMsg.y>390&&mMsg.y<520)
{
cleardevice();
closegraph();
}
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>40&&mMsg.x<140&&mMsg.y>390&&mMsg.y<520)
{
gameOver();
}
}
}
//游戏结束界面
void gameOver()
{
PIMAGE pgover = newimage();
getimage(pgover, "img\\gover.bmp",0,0);
putimage(0, 0, pgover);
delimage(pgover);
//显示分数
char s[5];
sprintf(s, "%d", score);
setfont(-30, 0, "宋体");
outtextxy(145, 355, s);
mouse_msg mMsg = {0};
for ( ; is_run(); delay_fps(60))
{
//获取鼠标消息,这个函数会等待,等待到有消息为止
while(mousemsg())
{
mMsg = getmouse();
}
//重新开始
if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>180&&mMsg.x<290&&mMsg.y>470&&mMsg.y<510)
{
homeMenu();
}
//退出
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>365&&mMsg.x<445&&mMsg.y>440&&mMsg.y<520)
{
cleardevice();
closegraph();
}
//
else if(mMsg.is_up()&&mMsg.is_left()&&mMsg.x>35&&mMsg.x<115&&mMsg.y>450&&mMsg.y<530)
{
}
}
}
//生成地图+移动后的重绘
void createMap()
{
PIMAGE img = newimage();
getimage(img, "img\\di.bmp",0,0);
putimage(0, 0, img);
delimage(img);
int x =0;
int y =0;
PIMAGE imgMap;
//记录豆子的数目
int cntFood;
int cntJudge;
//记录血量
int cntBlood;
//while(1)
//{
//每次重置地图都将数据归零
cntFood=0;
cntBlood=0;
for(int i=0;i55;
for(int j=0;j50;
imgMap=newimage();
//豆子
if(pMap[i][j]==0)
{
getimage(imgMap,"img\\food.bmp",0,0);
putimage(x,y,imgMap);
//遍历后剩余总数,计数豆子总数
cntFood++;
}
//cntJudge=cntFood;
//树
else if(pMap[i][j]==1)
{
getimage(imgMap,"img\\shu.bmp",0,0);
putimage(x,y,imgMap);
}
//墙
else if(pMap[i][j]==2)
{
getimage(imgMap,"img\\wall.bmp",0,0);
putimage(x,y,imgMap);
}
//怪物
else if(pMap[i][j]==3)
{
getimage(imgMap,"img\\guaiwu1.bmp",0,0);
putimage(x,y,imgMap);
//传出怪物所在的位置
mstrow=i;
mstcol=j;
//怪物随机移动后的坐标就是(i,j)==(mstrow,mstcol)
//每次遍历都通过怪物坐标pMap[mstrow][mstcol]的值贴图并把坐标(i,j)传给(mstrow,mstcol)
//所以不需要修改pMap[mstrow][mstcol]的横纵坐标
}
else if(pMap[i][j]==5) //左
{
getimage(imgMap,"img\\renL.bmp",0,0);
putimage(x,y,imgMap);
}
else if(pMap[i][j]==6) //右
{
getimage(imgMap,"img\\renR.bmp",0,0);
putimage(x,y,imgMap);
}
else if(pMap[i][j]==7) //上
{
getimage(imgMap,"img\\renU.bmp",0,0);
putimage(x,y,imgMap);
}
else if(pMap[i][j]==8) //下
{
getimage(imgMap,"img\\renD.bmp",0,0);
putimage(x,y,imgMap);
}
else if(pMap[i][j]==9) //空
{
}
//血量
else if(pMap[i][j]==10)
{
getimage(imgMap,"img\\blood.bmp",0,0);
putimage(x,y,imgMap);
//遍历后剩余血量
cntBlood++;
}
//人物
else if(pMap[i][j]==4)
{
getimage(imgMap,"img\\ren.bmp",0,0);
putimage(x,y,imgMap);
row=i;
col=j;
/*pMap[i][j]==6;------->置空,不贴图,实现更新后原位置的图片消失
重新生成地图
row=i;
col=j;
左 pMap[row][col-1] 将上一个位置置为 pMap[row][col]==9 ,调用重新生成地图的函数updMap
将此位置置为 pMap[row][col-1]==5
右 pMap[row][col+1] 置为6
上 pMap[row-11][col] 7
下 pMap[row+1][col] 8
*/
}
delimage(imgMap);
}
//遍历数组之后的剩余豆子数目
cntJudge=cntFood;
//传出数据
roleBlood=cntBlood;
//在这里计算分数
score=(TOTAL-cntJudge)*50;
}
//判断是否吃完所有豆子,吃完进入下一关卡
if(cntJudge==0)
{
showScore();
//进入下一关卡
delay_ms(600);
enterNext();
}
if(roleBlood==0)
{
//cleardevice();
dieOver();
}
for ( ; is_run(); delay_fps(60))
{
showScore();
//人物移动
roleMove();
//判断是否相撞
crashJudge();
//怪物随机移动
mstMove();
}
//}
}
//人物移动
void roleMove()
{
PIMAGE pUpd = newimage();
key_msg kMsg ={0};
//for ( ; is_run(); delay_fps(60))
//{
while(kbmsg())
{
kMsg = getkey();
}
//左
if(kMsg.key==65&&kMsg.msg==key_msg_up&&(pMap[row][col-1]==0||pMap[row][col-1]==9||pMap[row][col-1]==3))
{
//outtextxy(50, 0, "A左");
//将上一个位置的图片处理了
//人物移动
pMap[row][col-1]=5;
pMap[row][col]=9;
col=col-1;
createMap();
}
//右
else if(kMsg.key==68&&kMsg.msg==key_msg_up&&(pMap[row][col+1]==0||pMap[row][col+1]==9||pMap[row][col+1]==3))
{
//outtextxy(150, 0, "D右");
pMap[row][col+1]=6;
pMap[row][col]=9;
col=col+1;
createMap();
}
//上
else if(kMsg.key==87&&kMsg.msg==key_msg_up&&(pMap[row-1][col]==0||pMap[row-1][col]==9||pMap[row-1][col]==3))
{
//outtextxy(0, 0, "W上");
pMap[row-1][col]=7;
pMap[row][col]=9;
row=row-1;
createMap();
}
//下
else if(kMsg.key==83&&kMsg.msg==key_msg_up&&(pMap[row+1][col]==0||pMap[row+1][col]==9||pMap[row+1][col]==3))
{
//outtextxy(100, 0, "S下");
pMap[row+1][col]=8;
pMap[row][col]=9;
row=row+1;
createMap();
}
//}
delimage(pUpd);
}
//怪物移动
//怪物坐标pMap[mstrow][mstcol]
void mstMove()
{
//showScore();
delay_ms(600);
srand((unsigned) time(NULL));
int inum=(rand()%4)+1;
//左
if(inum==1&&(pMap[mstrow][mstcol-1]==9
||pMap[mstrow][mstcol-1]==5||pMap[mstrow][mstcol-1]==6||pMap[mstrow][mstcol-1]==7||pMap[mstrow][mstcol-1]==8))
{
pMap[mstrow][mstcol-1]=3;
pMap[mstrow][mstcol]=9;
createMap();
}
//右
else if(inum==2&&(pMap[mstrow][mstcol+1]==9
||pMap[mstrow][mstcol+1]==5 ||pMap[mstrow][mstcol+1]==6||pMap[mstrow][mstcol+1]==7||pMap[mstrow][mstcol+1]==8))
{
pMap[mstrow][mstcol+1]=3;
pMap[mstrow][mstcol]=9;
createMap();
}
//上
else if(inum==3&&(pMap[mstrow-1][mstcol]==9
||pMap[mstrow-1][mstcol]==5||pMap[mstrow-1][mstcol]==6||pMap[mstrow-1][mstcol]==7||pMap[mstrow-1][mstcol]==8))
{
pMap[mstrow-1][mstcol]=3;
pMap[mstrow][mstcol]=9;
createMap();
}
//下
else if(inum==4&&(pMap[mstrow+1][mstcol]==9
||pMap[mstrow+1][mstcol]==5 ||pMap[mstrow+1][mstcol]==6||pMap[mstrow+1][mstcol]==7||pMap[mstrow+1][mstcol]==8))
{
pMap[mstrow+1][mstcol]=3;
pMap[mstrow][mstcol]=9;
createMap();
}
}
//碰撞判断
void crashJudge()
{
if(pMap[row][col]==3&&roleBlood==3)
{
pMap[BLR][BLC3]=9;
}
else if (pMap[row][col]==3&&roleBlood==2)
{
pMap[BLR][BLC2]=9;
}
else if (pMap[row][col]==3&&roleBlood==1)
{
pMap[BLR][BLC1]=9;
}
}
//输出分数
void showScore()
{
char s[5];
sprintf(s, "%d", score);
setfont(-30, 0, "宋体");
outtextxy(430, 510, s);
}