最近学习c语言,看了Mooc上童晶老师的课,用c和Easy x图形库写了一个简单的飞机大战,练练手,第一次写出完整的,虽然还有好多功能没有实现,但是也是有点成就感的,大家看看就好,不喜勿喷!!注:我是用vs2019写的,素材好像传不上,需要的私。
简单效果图如下:
#include<graphics.h>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
#define high 640//定义画布大小
#define width 480
IMAGE img_bk;//背景图片
IMAGE img_planeNormal_1, img_planeNormal_2;//飞机图片显示
IMAGE img_bullet_1, img_bullet_2;//飞机子弹
IMAGE img_enemyPlane_1, img_enemyPlane_2;//敌机
IMAGE img_planeBoom_1, img_planeBoom_2;//飞机相撞
int position_x, position_y;//飞机坐标
int bullet_x, bullet_y;//子弹坐标
int enemyPlane_x, enemyPlane_y;//敌机坐标
int planBoom_x, planBoom_y;//爆炸坐标
int isExplode = 0;//飞机是否爆炸
int score = 0;
void startup()//数据初始化
{
mciSendString(_T("open E:\\游戏素材\\飞机大战\\game_music.mp3 alias bkmusic"), NULL, 0, NULL);
mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL);
initgraph(width, high);
loadimage(&img_bk, "E:\\游戏素材\\飞机大战\\background.jpg");//背景
loadimage(&img_planeNormal_1, "E:\\游戏素材\\飞机大战\\planeNormal_1.jpg");//我方飞机
loadimage(&img_planeNormal_2, "E:\\游戏素材\\飞机大战\\planeNormal_2.jpg");
loadimage(&img_bullet_1, "E:\\游戏素材\\飞机大战\\bullet_1.jpg");
loadimage(&img_bullet_2, "E:\\游戏素材\\飞机大战\\bullet_2.jpg");//子弹
loadimage(&img_enemyPlane_1, "E:\\游戏素材\\飞机大战\\enemyPlane_1.jpg");
loadimage(&img_enemyPlane_2, "E:\\游戏素材\\飞机大战\\enemyPlane_2.jpg");//敌机
loadimage(&img_planeBoom_1, "E:\\游戏素材\\飞机大战\\planeBoom_1.jpg");
loadimage(&img_planeBoom_2, "E:\\游戏素材\\飞机大战\\planeBoom_2.jpg");//碰撞
position_x = width * 0.4;
position_y = high * 0.7;
bullet_x = position_x+45;
bullet_y = -85;
enemyPlane_x = 0.5 * width;
enemyPlane_y = 0;
planBoom_x =-100;
planBoom_y = -100;
BeginBatchDraw();
}
void show()//显示画面
{
putimage(0, 0, &img_bk);//显示背景
if (isExplode == 0)
{
putimage(position_x, position_y, &img_planeNormal_1, NOTSRCERASE);
putimage(position_x, position_y, &img_planeNormal_2, SRCINVERT);//显示飞机
putimage(bullet_x, bullet_y, &img_bullet_1, NOTSRCERASE);
putimage(bullet_x, bullet_y, &img_bullet_2, SRCINVERT);//显示子弹
putimage(enemyPlane_x, enemyPlane_y, &img_enemyPlane_1, NOTSRCERASE);
putimage(enemyPlane_x, enemyPlane_y, &img_enemyPlane_2, SRCINVERT);//显示敌机
}
else
{
putimage(planBoom_x, planBoom_y, &img_planeBoom_1, NOTSRCERASE);
putimage(planBoom_x, planBoom_y, &img_planeBoom_2, SRCINVERT);
outtextxy(width * 0.48, high * 0.48, _T("小辣鸡,这都能死!"));
}
TCHAR s[] = _T("得分:");
outtextxy(width * 0.48, high*0.8 , s);
char a[5];
sprintf(a,"%d", score);
outtextxy(width * 0.55, high*0.8, a);
Sleep(20);
FlushBatchDraw();
}
void updateWithoutInput()//与用户输入无关的更新
{
if(bullet_y>-30)//子弹上升
bullet_y = bullet_y - 5;
if (enemyPlane_y < high)//敌机下落
enemyPlane_y+=2;
else
{
srand(time(NULL));
enemyPlane_x =rand() % width;//随机生成新敌机
enemyPlane_y = 0;
}
if (abs(enemyPlane_x - bullet_x) + abs(enemyPlane_y - bullet_y) < 70)//子弹击中敌机
{
srand(time(NULL));
enemyPlane_x = rand() % width;
enemyPlane_y = 0;
score++;
}
if (abs(enemyPlane_x - position_x) + abs(enemyPlane_y - position_y) < 70)//敌机与我机碰撞
{
mciSendString("close boo", NULL, 0, NULL);
mciSendString("open E:\\游戏素材\\飞机大战\\explode.mp3 alias boo", NULL, 0, NULL);//子弹爆炸音效
mciSendString("play boo ", NULL, 0, NULL);
planBoom_x = position_x;
planBoom_y = position_y;
isExplode = 1;
}
}
void updateWithInput()//与用户输入有关的更新
{
MOUSEMSG m;//记录鼠标消息
while (MouseHit())
{
m = GetMouseMsg();
if (m.uMsg == WM_MOUSEMOVE)//鼠标移动时,飞机坐标变化
{
position_x = m.x;
position_y = m.y;
}
else if (m.uMsg==WM_LBUTTONDOWN)
{
mciSendString("close pi", NULL, 0, NULL);
mciSendString("open E:\\游戏素材\\飞机大战\\f_gun.mp3 alias pi", NULL, 0, NULL);//子弹发射音效
mciSendString("play pi ", NULL, 0, NULL);
mciSendString("close ps", NULL, 0, NULL);
mciSendString("open E:\\游戏素材\\飞机大战\\5.mp3 alias ps", NULL, 0, NULL);
mciSendString("play ps ", NULL, 0, NULL);
bullet_x = position_x+45;
bullet_y = position_y - 50;
}
}
}
int main()
{
startup();//数据初始化
while (1)
{
show();//显示画面
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
EndBatchDraw();
return 0;
}