飞机大战小游戏——C++

1.概要设计

代码如下:

#include <iostream>
#include <string>

#include <graphics.h>           //图形库头文件
#include <mmsystem.h>           //多媒体接口
#pragma comment(lib,"winmm.lib")//加载库文件

#define High 580                  //窗口长
#define Weight 850                //窗口宽

#define bullet_NUM 100             //设定子弹数量
#define enemy_NUM  15            //设定敌机数量
using namespace std;

struct Image   //定义图形变量结构体
{
	IMAGE backgrand;                 //定义背景图片
	IMAGE player[2];                 //定义player飞机图片
	IMAGE bullet[2];                 //定义子弹图片
	IMAGE enemy[4];                  //定义敌机图片
	IMAGE explode[2];                //定义坠毁player飞机图片
}ss;                                     //IMAGE  定义一个图形变量

struct make   //定义对象数据结构体
{
	double x;                           //x坐标
	double y;                           //y坐标
	int hp;                          //生命值
	bool flag;                       //存货状态
	union MyUnion                  //联合 、使用同一块内存、节省内存
	{
		int type;                  //敌机独有属性,类型
		int score;                 //玩家独有属性,得分
	}un;

}player,bullet[bullet_NUM],enemy[enemy_NUM],explode;
enum TYPE                           //将敌机分为两种类型
{
	SMALL,
	BIG,
};

DWORD t1, t2,t3,t4;


void Init()//----------------------//初始化数据
{   
	//设定随机数种子
	srand(GetTickCount());
	t1 = t2=t3=t4  = GetTickCount();//获取系统开机到当前所经过的毫秒数
	
	
	
	//音乐播放
	mciSendString("open ./PlanePicture/game_music.mp3 alias BGM",0,0,0);   //加载音乐地址、导入音乐
	mciSendString("play BGM repeat", 0, 0, 0);                             //播放音乐

	 //加载图片地址、导入图片
	//导入背景
	loadimage(&ss.backgrand, "./PlanePicture/background.jpg");

	//导入player飞机
	loadimage(&ss.player[0], "./PlanePicture/player_2.jpg");
	loadimage(&ss.player[1], "./PlanePicture/player_1.jpg");

	//导入子弹
	loadimage(&ss.bullet[0], "./PlanePicture/bullet_1.jpg");
	loadimage(&ss.bullet[1], "./PlanePicture/bullet_2.jpg");

	//导入敌机
	loadimage(&ss.enemy[0], "./PlanePicture/enemys_1.jpg");//小敌机
	loadimage(&ss.enemy[1], "./PlanePicture/enemys_2.jpg");
	loadimage(&ss.enemy[2], "./PlanePicture/enemyb_1.jpg");//大敌机
	loadimage(&ss.enemy[3], "./PlanePicture/enemyb_2.jpg");

	//导入战毁机
	loadimage(&ss.explode[0], "./PlanePicture/Explode_1.jpg");
	loadimage(&ss.explode[1], "./PlanePicture/Explode_2.jpg");
	
	//初始化玩家
	player.flag = true;
	player.hp = 15;
	player.x = Weight / 2-200;
	player.y = High-100;
	player.un.score = 0;
	
	//初始化敌机
	for (int i = 0; i < enemy_NUM; i++)
	{
		enemy[i].flag = false;
	}



	//初始化子弹
	for (int i = 0; i < bullet_NUM; i++)
	{
		bullet[i].flag = false;
	}
	

}
void Show()//-------------------------------//输出数据
{
	//输出背景
	putimage(0, 0, &ss.backgrand);

	//输出分数、输出生命值
	settextstyle(20, 0, "华文行楷"); //设置字体样式
	settextcolor(BLUE);               //设置字体颜色
	setbkmode(TRANSPARENT);          //设置背景为透明
	TCHAR str [50] = {0};
	TCHAR sta[50] = { 0 };
	_stprintf_s(str, "经验值:%d", player.un.score);
	_stprintf_s(sta, "生命值:%d", player.hp);
    outtextxy(20, 20, str);
	outtextxy(20, 40, sta);
	if (explode.flag == true)
	{
		settextstyle(60, 0, "华文行楷"); //设置字体样式
		settextcolor(RED);
		outtextxy(160, 300, "您 已 阵 亡");
		outtextxy(140, 360, "所得");
		outtextxy(250, 360, str);
	}


	//输出飞机
	if (player.flag == true) {
		putimage(player.x, player.y, &ss.player[0], NOTSRCERASE);
		putimage(player.x, player.y, &ss.player[1], SRCINVERT);
	}
	//输出战毁机
	if (explode.flag == true)
	{
		putimage(explode.x, explode.y, &ss.explode[0], NOTSRCERASE);
		putimage(explode.x, explode.y, &ss.explode[1], SRCINVERT);
	}

	//输出子弹
	for (int i = 0; i < bullet_NUM; i++)
	{
		if (bullet[i].flag == true)
		{
			putimage(bullet[i].x, bullet[i].y, &ss.bullet[0], NOTSRCERASE);
			putimage(bullet[i].x, bullet[i].y, &ss.bullet[1], SRCINVERT);
		}
	}


	//输出敌机
	for (int i = 0; i < enemy_NUM; i++)
	{
		if (enemy[i].flag == true)
		{
			if(enemy[i].un.type==TYPE::SMALL){
				putimage(enemy[i].x, enemy[i].y, &ss.enemy[0], NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, &ss.enemy[1], SRCINVERT);
			}
			else {
				putimage(enemy[i].x, enemy[i].y, &ss.enemy[2], NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, &ss.enemy[3], SRCINVERT);
			}

			
		}
	}

}



void BulletCreat()//------------------------------生成子弹
{
	for (int i = 0; i < bullet_NUM; i++)
	{
		if (bullet[i].flag == false)
		{
			bullet[i].flag = true;
			bullet[i].x = player.x + 45;
			bullet[i].y = player.y-2;
			
			break;                               //确保每按一下空格键生成一发子弹
		}
	}

}


void BulletMove(int speed)//----------------------控制子弹移动
{
	for (int i = 0; i < bullet_NUM; i++)
	{
		if (bullet[i].flag == true)
		{
			bullet[i].y -= speed;
			if (bullet[i].y < 0)
			{
				bullet[i].flag = false;
			}
		}
	}
}


void EnemyType(int i)//------------------------------//给随机生成的敌机分类型
{
	if (rand() % 5 == 0)                   //1/5的概率生成大敌机 
	{
		enemy[i].un.type = TYPE::BIG;
		enemy[i].hp = 3;
	}
	else {
		enemy[i].un.type = TYPE::SMALL;
		enemy[i].hp = 1;
	}
}


void EnemyCreat()//---------------------------------生成敌机
{
	for (int i = 0; i < enemy_NUM; i++)
	{
		if (enemy[i].flag==0)
		{
			enemy[i].flag = true;
			enemy[i].x = rand() % (Weight - 100);
			enemy[i].y = 0;
			EnemyType(i);
			break;
		}
	}
}


void EnemyMove(double speed)//-------------------------------//控制敌机移动
{
	for (int i = 0; i < enemy_NUM; i++)
	{
		if (enemy[i].flag == true)
		{
			enemy[i].y += speed;
			if (enemy[i].y>=High+130)
			{
				enemy[i].flag = false;
			}
		}
	}
}



void Move(double speed)//-----------------------------//控制移动
{
	//控制player飞机移动
	if (GetAsyncKeyState(VK_RIGHT)&&player.x+320<=Weight)  //
	{
		player.x += speed;
	}
	if (GetAsyncKeyState(VK_LEFT) && player.x + 60 >= 0)  //
	{
		player.x -= speed;
	}
	if (GetAsyncKeyState(VK_UP) && player.y  >= 0)       //
	{
		player.y -= speed;
	}
	if (GetAsyncKeyState(VK_DOWN) && player.y-20<=High)  //
	{
		player.y += speed;
	}

	//控制子弹移动
	if (GetAsyncKeyState(VK_SPACE)&&t2-t1>=400)
	{
		BulletCreat();                                                   //生成子弹
		//播放射击音乐
		mciSendString("close hh",0,0,0);                                  //确保每次都能播放
		mciSendString("open ./PlanePicture/f_gun.mp3 alias hh", 0, 0, 0); //导入音乐
		mciSendString("play hh",0,0,0);                                   //播放音乐
		t1 = t2;
	}
	t2 = GetTickCount();
	BulletMove(speed);                                               //控制子弹移动

	//敌机的生成与移动
	if (t4 - t3 >= rand() % 600 + 600)
	{
		EnemyCreat();                                                 //生成敌机
		t3 = t4;
	}
	t4 = GetTickCount();
	EnemyMove(0.5);                                                    //控制敌机移动
}
void PlayerShot()//----------------------------------------//射中敌机/player飞机摧毁
{
	for (int i = 0; i < enemy_NUM; i++)
	{
		for (int j = 0; j < bullet_NUM; j++)
		{
			//当player飞机撞到敌机
			if (enemy[i].flag == true &&player.flag == true)
			{
				if (enemy[i].x + 50 >= player.x && enemy[i].x <= player.x + 117 && enemy[i].y + 39 >= player.y && enemy[i].y <= player.y && enemy[i].un.type == TYPE::SMALL)//当player飞机撞到小敌机
				{
					enemy[i].flag = false;
					player.hp -= 1;
				}
				if (enemy[i].x <= player.x + 117 && enemy[i].x + 148 >= player.x && enemy[i].y + 104 >= player.y && enemy[i].y <= player.y + 120 && enemy[i].un.type == TYPE::BIG)//当player飞机撞到大敌机
				{
					enemy[i].flag = false;
					player.hp -= 3;
					
				}

			}
			//当子弹射中敌机
			if (enemy[i].flag == true && bullet[j].flag == true)
			{
				if (enemy[i].x + 50 >= bullet[j].x && enemy[i].x <= bullet[j].x + 19 && enemy[i].y + 39 >= bullet[j].y && enemy[i].y <= bullet[j].y && enemy[i].un.type == TYPE::SMALL)//当击中小敌机
				{
					enemy[i].flag = false;      //小敌机消失
					bullet[j].flag = false;     //子弹消失
					player.un.score += 1;
				}
				if (enemy[i].x + 104 >= bullet[j].x && enemy[i].x <= bullet[j].x + 19 && enemy[i].y + 148 >= bullet[j].y && enemy[i].y <= bullet[j].y && enemy[i].un.type == TYPE::BIG)//当击中小敌机
				{
					bullet[j].flag = false;     //子弹消失
					enemy[i].hp -= 1;
					if (enemy[i].hp <= 0) {
						enemy[i].flag = false;      //大敌机消失
						player.un.score += 3;

					}
				}
			}
		}
	}
}

void Search()//-----------------------------//查看player飞机是否阵亡
{
	if (player.hp <= 0)
	{
		explode.flag = true;
		explode.x = player.x;
		explode.y = player.y;
		player.flag = false;                  //player飞机阵亡
		mciSendString("close hhh", 0, 0, 0);
		mciSendString("open ./PlanePicture/roledie.mp3 alias hhh", 0, 0, 0); //导入音乐
		mciSendString("play hhh", 0, 0, 0);



	}
}


int main()
{
	initgraph(High,Weight);      //设定窗口
	Init();                      //初始化数据
	BeginBatchDraw();            //开启双缓冲、防止图片频闪,在内存中存好
	
			while (1)
			{
			Show();                  //输出数据
			//Select();

			Move(1);                 //控制移动
			PlayerShot();            //射中敌机/player飞机摧毁
			FlushBatchDraw();        //打开图片
			Search();                //查看player飞机是否阵亡
		}
	
	EndBatchDraw();              //结束图片放映
	return 0;
}

头文件以及库函数:

主函数:

各函数所产生的作用:

Initgraph:设定长为Weight,宽为High的窗口

Init():初始化数据,即导入文件中的图片,给各元素赋初值

While():保证该页面不断刷新、不断更改数据,即保证游戏的流畅进行

Show():输出各项数据,如显示背景、输出飞机子弹图片

Move():控制飞机、子弹的移动

PlayerShow():子弹射中敌机/player飞机撞到敌机

Search():判断player飞机是否阵亡

BeginBatchDraw():开启双缓存、防止图片频闪,将其存储在内存中

FlushBatchDraw():打开内存中的图片

EndBatchDraw():结束图片的放映

2.实现情况:


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C语言飞机大战压缩包是一个包含有关C语言编写的飞机大战游戏的文件和资料的压缩文件。在这个压缩包中,您可以找到游戏的源代码文件、所使用的库文件、图像和声音文件以及其他相关的资源文件。 首先,游戏的源代码文件是以C语言编写的程序代码文件,其中包含了游戏的逻辑和算法。通过查看源代码文件,您可以阅读和理解游戏的实现过程,了解每个函数和变量的作用,从而可以对游戏进行修改和定制。 其次,库文件是用于支持游戏运行的文件,包含了游戏所需的外部库函数和相关的头文件。这些库文件可以帮助您简化编写代码的过程,提供了一些常用的功能和工具,例如图形绘制、碰撞检测等等。 此外,压缩包中还可能包含了游戏所使用的图像和声音文件。这些文件可以用于展示游戏中的角色、道具和场景等等。您可以根据需要对这些文件进行替换或修改,以达到个性化定制的效果。 最后,压缩包还可能包含一些说明文档和教程资料,用于帮助您了解游戏的使用方法和开发过程。这些资料可以提供给您参考,以便更好地理解和应用C语言编写飞机大战游戏的技术和方法。 总之,C语言飞机大战压缩包是一个为了方便用户学习和使用C语言编写飞机大战游戏而打包压缩的文件。通过解压和使用这个压缩包,您可以轻松地查看和了解游戏的源代码,修改和定制游戏,以及学习和应用相关的编程技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值