|
#include <graphics.h>
#include <time.h>
#include<bits/stdc++.h>
using namespace std;
void loadImage();
void draw();
key_msg keyMsg;
//数据文件
//const char* recordFile = "game_m.txt";
//图片文件位置
PIMAGE pimg_man[7];
PIMAGE pimg_board[11];
PIMAGE pimg_back;
PIMAGE pimg_over;
int mvx=5;
int cnt;
int step;
int bvy=-2;
struct man
{
int state;//状态
int act;//动作 图片选择
int score;//分数
int blood;//血量
float vx,vy;//x,y方向速度
float vx1;//传送带加成的速度
float g;//加速度
float x,y;//位置坐标
}m;
struct boards
{
int type;//障碍的类型 0-2小 3-5大 6-8 h鸟/m鸟/l鸟
int act;
int step;//踩板 0未踩中
float x,y;//位置坐标
float vy;//上升速度
}board[9];
const char* imgFiles[20] =
{
"resource\\SonicFall1.png",//0
"resource\\SonicFall2.png",
"resource\\SonicLeft1.png",
"resource\\SonicLeft2.png",
"resource\\SonicRight1.png",
"resource\\SonicRight2.png",
"resource\\SonicStand.png",//6
"resource\\Stone.png",//0
"resource\\TanHuang.png",//1
"resource\\TanHuang2.png",
"resource\\TanHuang3.png",
"resource\\ChiPingTai.png",//4
"resource\\ChuanSongDaiLeft1.png",//5
"resource\\ChuanSongDaiLeft2.png",
"resource\\ChuanSongDaiRight1.png",//7
"resource\\ChuanSongDaiRight2.png",
"resource\\Float1.png",//9
"resource\\Float2.png",
"resource\\zhongli.png"
};
int topScore, score, maxNum;//最高分 ,当前分,最大合成数
void loadImage()//图片载入
{
//图 初始化
for (int i = 0; i < 7; i++)
{
pimg_man[i] = newimage();
getimage(pimg_man[i], imgFiles[i]);
}
for (int i = 0; i < 12; i++)
{
pimg_board[i] = newimage();
getimage(pimg_board[i], imgFiles[i+7]);
}
pimg_back = newimage();
getimage(pimg_back, "resource\\1000.png");
pimg_over = newimage();
getimage(pimg_over, "resource\\gameover2.png");
}
void start()//初始化
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
// setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
m.state=0;
m.g=0.3;
m.vx=0;
m.vy=0;
m.x=90;
m.y=0;
m.score=0;
m.blood=50;
initgraph(400,600);//图形初始化
setbkcolor(WHITE);
srand(time(0));//随机数初始化
loadImage();//图片载入
setcolor(DARKGRAY);
setfont(20,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
setcaption("是男人就下100层");//设置标题
for (int i = 0; i < 9; i++)
{
if(i==0)
{
board[i].x = 100;
board[i].type = 0;
}
else
{
board[i].x = rand()%300;
board[i].type = rand()%6;
}
board[i].y = 100*i+200;
board[i].step = 0;
//board[i].vy = -2;
}
}
void draw()//图形绘制
{
int temp=0;
putimage_withalpha(NULL, pimg_back, 0, 0);//绘制背景
for(int i=0;i<9;i++)//障碍物
{
if(board[i].act==2) temp=4;
else if(board[i].act==3) temp=-6;
else if(board[i].act==10) temp=-10;
else temp=0;
putimage_withalpha(NULL, pimg_board[board[i].act], board[i].x, board[i].y+temp);
}
//putimage_withalpha(NULL, pimg_board[0], 200, 200);
putimage_withalpha(NULL, pimg_man[m.act], m.x, m.y);//绘制,最后绘制防遮挡
//游戏分数
xyprintf(300,5,"血量:%d",m.blood);
xyprintf(300,20,"分数:%d",m.score);
}
void man_kb_check()//按键检测
{
while(kbmsg())
{
keyMsg = getkey();
if(keyMsg.key == 's') m.vy=5;
if(keyMsg.key == 'w') m.vy=-10;
if(keyMsg.key == 'd') m.vx=mvx;
if(keyMsg.key == 'a') m.vx=-mvx;
if((keyMsg.key == key_left)&&(keyMsg.msg == key_msg_down)) m.vx=-mvx;
else if((keyMsg.key == key_right)&&(keyMsg.msg == key_msg_down)) m.vx=mvx;
else if(keyMsg.msg == key_msg_up) m.vx=0;
}
}
void man_update()//数据更新
{
//动作
m.x+=(m.vx+m.vx1);
m.y+=m.vy;
m.vy+=m.g;
if(cnt%10==0) m.score++;
//if((cnt%20==0)&&(m.blood<100)) m.blood++;
for (int i = 0; i < 9; i++)
{
if (m.x>board[i].x-32 && m.x<board[i].x+96 && //在板的上方
m.y>=board[i].y-32 && m.y < board[i].y)
{
board[i].step=1;//踩中
step=1;
if(board[i].type == 0) //普通板
{
m.y = board[i].y-32;
m.vy = 0;
}
else if(board[i].type == 1) //弹簧板
{
m.vy = -10;
}
else if(board[i].type == 2) //尖刺板
{
m.y = board[i].y-32;
m.vy = 0;
if(cnt%5==0) m.blood--; //受伤
}
else if(board[i].type == 3) //左传送
{
m.y = board[i].y-32;
m.vy = 0;
m.vx1 = -2;
}
else if(board[i].type == 4) //右传送
{
m.y = board[i].y-32;
m.vy = 0;
m.vx1 = 2;
}
else if(board[i].type == 5) //翻板
{
m.y = board[i].y-32;
m.vy = 0;
}
else if(board[i].type == 7)
{
m.y = board[i].y-32;
m.vy = 0;
mvx=1;
}
break;
}
else
{
board[i].step=0;//未踩中
m.vx1=0;
step=0;
mvx=5;
}
}
switch(m.state)
{
case 0://站立
m.act=6; //动作
if(step==0) m.state=3;
else if(m.vx<0) m.state=1;//状态
else if(m.vx>0) m.state=2;
break;
case 1://向左
if(cnt%10<5) m.act=2;
else m.act=3;
if(step==0) m.state=3;
else if(m.vx==0) m.state=0;//状态
else if(m.vx>0) m.state=2;
break;
case 2://向右
if(cnt%10<5) m.act=4;
else m.act=5;
if(step==0) m.state=3;
else if(m.vx==0) m.state=0;//状态
else if(m.vx<0) m.state=1;
break;
case 3://空中
if(cnt%10<5) m.act=0;
else m.act=1;
if(step==1) m.state=0;
break;
default:break;
}
}
void boardmove()
{
for (int i = 0; i < 9; i++)
{
board[i].y += bvy;
//如果已经超过边界,重新从屁股后面来
if (board[i].y < 0)
{
board[i].x = rand() %300;
board[i].y = 9*100;
//board[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
int y=rand()%100;
board[i].type=6;
/* if(y<80) board[i].type=1;
else if(y<84) board[i].type=0;
else if(y<88) board[i].type=5;
else if(y<92) board[i].type=3;
else if(y<96) board[i].type=4;
else if(y<100) board[i].type=2;*/
board[i].step = 0;
bvy = -2-m.score/100;
}
}
}
void board_update()//挡板数据更新
{
boardmove();
for (int i = 0; i < 9; i++)
{
switch(board[i].type)
{
case 0://普通板
board[i].act=0; //动作
break;
case 1://弹簧板
if(board[i].step==1)
{
if(cnt%10<5) board[i].act=2;
else board[i].act=3;
}
else board[i].act=1;
break;
case 2://尖刺板
board[i].act=4; //动作
break;
case 3://左传送带
if(cnt%10<5) board[i].act=5;
else board[i].act=6;
break;
case 4://右传送带
if(cnt%10<5) board[i].act=7;
else board[i].act=8;
break;
case 5://翻板 1
board[i].act=9;
if(board[i].step==1)
{
board[i].type=7;
}
break;
case 7://翻板 2
board[i].act=10;
break;
case 6:
board[i].act=11;
break;
default:break;
}
//board[i].step=0;//踩中
}
}
//坐标范围 与 障碍物坐标范围 重叠
bool gameover()//失败判定
{
if(m.blood<=0 || m.y>700) return true;
return false;
}
void loadRecord()
{
// FILE* fp = fopen(recordFile, "r");
//
// fscanf(fp, "topScore:%d",&topScore);
// fclose(fp);
}
void gameSave()
{
// //数据写入
// FILE* fp = fopen(recordFile, "w");
// if (fp == NULL)
// return;
// fprintf(fp, "topScore:%d",topScore);
// fclose(fp);
}
int main()
{
start();//初始化
while(1)
{
man_kb_check();
man_update();
board_update();
cleardevice();
draw();
delay_fps(60);
cnt++;
if(gameover()) break;
}
Sleep(500);
// setcolor(RED);
// setfont(50,0,"幼圆");
// xyprintf(100,200,"GAME OVER");
putimage_withalpha(NULL, pimg_over, 75, 200);
getch();
return 0;
} |
|