c语言+Easy X图形库实现飞机大战,源码加素材

最近学习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;
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值