栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

飞机大战(简单版)(C/C++) (VS)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

飞机大战(简单版)(C/C++) (VS)

  这是我以前写的一款游戏(主要是用C写的),我已经忘记我是怎么写的逻辑了,在加上都是简单版本的,所以我就不讲解了,大家可以自己借鉴一下,等以后我做完整版的会发讲解的。


  学C学的差不多的,可以拿这个练手,感觉逻辑不难,挺简单的。


//定义头文件
#include
#include
#include 
#include 
#include
#pragma comment(lib,"winmm.lib")

IMAGE bei_jing;//定义背景图像
IMAGE wan_jia[2];//定义玩家生图像
IMAGE wan_jia_si[2];//定义玩家死图像
IMAGE zi_dan[2];//定义子弹图像
IMAGE di_ji[2][2];//定义子弹图像

enum bei_jing//窗口宽度与高度
{
	kuan = 480,//宽度
	gao = 700,//高度
	zi_dan_shu = 15,//玩家子弹数
	di_ji_shu = 10,//敌机数
	da,xiao,//大小敌机
};
//窗口宽度与高度设置
struct Fei_Ji//玩家飞机与子弹与敌机
{
	double x, y;//坐标
	bool sheng_si;//生死
	int kuan, gao,hp, lei_xing;
}WanJia,ZiDan[zi_dan_shu],DiJi[di_ji_shu];
//玩家飞机与子弹与敌机
bool Timer(int ms,int id)//定时器
{
	static DWORD t[10];
	if (clock() - t[id] > ms)//延时ms毫秒
	{
		t[id] = clock();//重置
		return true;
	}
	return false;
}
//定时器
void loadimage()//载入图像
{
	//载入背景图像
	loadimage(&bei_jing, "./images/background.jpg");
	//载入玩家图像
	loadimage(&wan_jia[0], "./images/planeNormal_1.jpg");
	loadimage(&wan_jia[1], "./images/planeNormal_2.jpg");
	//载入玩家死图像
	loadimage(&wan_jia_si[0], "./images/planeBoom_1.jpg");
	loadimage(&wan_jia_si[1], "./images/planeBoom_2.jpg");
	//载入子弹图像
	loadimage(&zi_dan[0], "./images/bullet1.jpg");
	loadimage(&zi_dan[1], "./images/bullet2.jpg");
	//载入敌机图像
	loadimage(&di_ji[0][0], "./images/enemy_1.jpg");
	loadimage(&di_ji[0][1], "./images/enemy_2.jpg");
	loadimage(&di_ji[1][0], "./images/enemyPlane1.jpg");
	loadimage(&di_ji[1][1], "./images/enemyPlane2.jpg");
}
//载入图像
void EnemyHp(int i)//敌机的hp
{
	if (rand() % 5 == 0)
	{
		DiJi[i].lei_xing = da;
		DiJi[i].hp = 3;
		DiJi[i].kuan = 104;
		DiJi[i].gao = 148;
	}
	else
	{
		DiJi[i].lei_xing = xiao;
		DiJi[i].hp = 1;
		DiJi[i].kuan = 52;
		DiJi[i].gao = 39;
	}

}
//敌机的hp
void GameInit()//初始化
{
	//载入图像
	loadimage();
	//初始化玩家
	WanJia.x = kuan / 2-60.0;
	WanJia.y = gao - 120.0;
	WanJia.hp = 3;
	WanJia.kuan=117;
	WanJia.gao=120;
	WanJia.sheng_si = true;
	//初始化子弹
	for (int i = 0; i < zi_dan_shu; i++)
	{
		ZiDan[i].x = 0;
		ZiDan[i].y = 0;
		ZiDan[i].sheng_si = false;
	}
	//初始化敌机
	for (int i = 0; i < di_ji_shu; i++)
	{
		DiJi[i].sheng_si = false;
		EnemyHp(i);
	}
}
//初始化
void GameDraw()//显示图像
{
	//显示背景
	putimage(0, 0, &bei_jing);
	//显示玩家
	putimage((int)WanJia.x, (int)WanJia.y, &wan_jia[0],NOTSRCERASE);
	putimage((int)WanJia.x, (int)WanJia.y, &wan_jia[1],SRCINVERT);
	//显示子弹
	for (int i = 0; i < zi_dan_shu; i++)
	{
		if (ZiDan[i].sheng_si)
		{
			putimage((int)ZiDan[i].x, (int)ZiDan[i].y, &zi_dan[0], NOTSRCERASE);
			putimage((int)ZiDan[i].x, (int)ZiDan[i].y, &zi_dan[1], SRCINVERT);
			break;
		}
	}
	//显示敌机
	for (int i = 0; i < di_ji_shu; i++)
	{
		if (DiJi[i].sheng_si)
		{
			if(DiJi[i].lei_xing == xiao)
			{
				putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[0][0], NOTSRCERASE);
				putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[0][1], SRCINVERT);
			}
			else
			{
				putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[1][0], NOTSRCERASE);
				putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[1][1], SRCINVERT);
			}
		}
	}
	if (WanJia.hp<=0)
	{
		putimage((int)WanJia.x, (int)WanJia.y, &wan_jia_si[0], NOTSRCERASE);
		putimage((int)WanJia.x, (int)WanJia.y, &wan_jia_si[1], SRCINVERT);
		Timer(1000000000,2);
	}
	//显示玩家死亡
}
//显示图像
void CreateBullet()//创建一个子弹
{
	for (int i = 0; i < zi_dan_shu; i++)
	{
		if (!ZiDan[i].sheng_si)
		{
			//子弹BGM
			mciSendString("close ZIDANBGM", 0, 0, 0);
			mciSendString("open ./images/f_gun.mp3 alias ZIDANBGM", 0, 0, 0);
			mciSendString("play ZIDANBGM", 0, 0, 0);
			ZiDan[i].x = WanJia.x+45;
			ZiDan[i].y = WanJia.y;
			ZiDan[i].sheng_si = true;
			break;
		}
	}
}
//创建一个子弹
void BulletMove()//子弹移动
{
	for (int i = 0; i < zi_dan_shu; i++)
	{
		if (ZiDan[i].sheng_si)
		{
			ZiDan[i].y -= 1;
			if (ZiDan[i].y < 0)
				ZiDan[i].sheng_si = false;
			break;
		}
	}
}
//子弹移动
void PlayerMove(double yi_dong)//玩家操作
{
#if 0
	if (_kbhit())
	{
		char ming_ling = _getch();//得到命令
		switch (ming_ling)
		{
		case 'w':
		case 'w':
			WanJia.y -= yi_dong;//上
			break;
		case 's':
		case 's':
			WanJia.y += yi_dong;//下
			break;
		case 'a':
		case 'a':
			WanJia.x -= yi_dong;//左
			break;
		case 'd':
		case 'd':
			WanJia.x += yi_dong;//右
			break;
		}
	}
#elif 1
	if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W'))//上
	{
		if (WanJia.y > 0)//上边界
			WanJia.y -= yi_dong;//上移0.1
	}
	if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S'))//下
	{
		if (WanJia.y < gao - 110.0)//下边界
			WanJia.y += yi_dong;//下移0.1
	}
	if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A'))//左
	{
		if (WanJia.x > -30)//左边界
			WanJia.x -= yi_dong;//左移0.1
	}
	if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D'))//右
	{
		if (WanJia.x < kuan - 70.0)//右边界
			WanJia.x += yi_dong;//右移0.1
	}
#endif
	if (GetAsyncKeyState(VK_SPACE)&&Timer(300,1))//延时500毫秒
	{
		//创建一个子弹
		CreateBullet();
	}
}
//玩家操作
void CreateEnemy()//产生敌机
{
	for (int i = 0; i < di_ji_shu; i++)
	{
		if (!DiJi[i].sheng_si)
		{
			DiJi[i].sheng_si = true;
			EnemyHp(i);
			DiJi[i].x = rand() % (kuan-60);
			DiJi[i].y = 0;
			break;
		}
	}
}
//产生敌机
void EnemyMove(double sheep)//敌机移动
{
	for (int i = 0; i < di_ji_shu; i++)
	{
		if (DiJi[i].sheng_si)
		{
			if (rand() % 2 == 0 && DiJi[i].x > 0)
			{
				DiJi[i].x -= 1;
			}
			if (rand() % 2 == 0 && DiJi[i].x < (int)(480 - DiJi[i].kuan))
			{
				DiJi[i].x += 1;
			}
			else
			{
			}
			DiJi[i].y += sheep;
			if (DiJi[i].y > gao)
			{
				DiJi[i].sheng_si = false;
			}
		}
	}
}
//敌机移动
void PlayPlance()//打飞机
{
	for (int i = 0; i < di_ji_shu; i++)
	{
		if (!DiJi[i].sheng_si)
			continue;
		for (int j = 0; j < zi_dan_shu; j++)
		{
			if(!ZiDan[j].sheng_si)
				continue;
			if (ZiDan[j].x > DiJi[i].x && ZiDan[j].x< DiJi[i].x + DiJi[i].gao &&
				ZiDan[j].y>DiJi[i].y && ZiDan[j].y < DiJi[i].y + DiJi[i].kuan)
			{
				//死亡BGM
				mciSendString("close SIWANGBGM", 0, 0, 0);
				mciSendString("open ./images/explode.mp3 alias SIWANGBGM", 0, 0, 0);
				mciSendString("play SIWANGBGM", 0, 0, 0);
				ZiDan[j].sheng_si = false;
				DiJi[i].hp--;
			}
		}
		if (DiJi[i].hp<=0)
		{
			DiJi[i].sheng_si = false;
		}

	}
}
//打飞机
void PlayPlayer()//打玩家
{
	for (int i = 0; i < di_ji_shu; i++)
	{
		if (!DiJi[i].sheng_si)
			continue;
		if (DiJi[i].x > WanJia.x && DiJi[i].x< WanJia.x + WanJia.gao &&
			DiJi[i].y>WanJia.y && DiJi[i].y < WanJia.y + WanJia.kuan)
		{
			//死亡BGM
			mciSendString("close SIWANGBGM", 0, 0, 0);
			mciSendString("open ./images/explode.mp3 alias SIWANGBGM", 0, 0, 0);
			mciSendString("play SIWANGBGM", 0, 0, 0);
			DiJi[i].sheng_si = false;
			WanJia.hp--;
		}
	}
}
//打玩家
int Shu()//输
{
	if (WanJia.hp <= 0)
	{
		return true;
	}
	return false;
}
//输
int main()
{
	//游戏BGM
	mciSendString("open ./images/game_music.mp3 alias GAMEBGM", 0, 0, 0);
	mciSendString("play GAMEBGM repeat", 0, 0, 0);
	//创建窗口
	initgraph(kuan, gao);
	//初始化
	GameInit();
	//双缓存
	BeginBatchDraw();
	while (1)
	{
		//打玩家
		PlayPlayer();
		//显示图像
		GameDraw();
		FlushBatchDraw();
		//玩家操作
		PlayerMove(0.1);
		//子弹移动
		BulletMove();
		//产生敌机
		if (Timer(500,0))
		{
			CreateEnemy();
		}
		//敌机移动
		EnemyMove(0.03);
		//打飞机
		PlayPlance();
		//输
		if (Shu())
			break;
	}
	EndBatchDraw();
	return 0;
}
//主函数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989590.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号