C语言飞机大战,老师说:创新度高

废话不多说,直接上代码

相关音乐 图片资源文件我放在下方评论区,百度云自己提取。


#pragma once


#pragma warning(disable : 4996)
#include<stdio.h>
#include<conio.h>
#include<graphics.h>//图形库头文件easyx
#include<mmsystem.h>//音乐头文件
#include <windows.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 591
#define WIN_HEIGHT 864     
#define BULLET_NUM 15//最大子弹数量
#define ENEMYPLANE_NUM 10  //敌机最大数量
#define BULLET_ENEMY_NUM ENEMYPLANE_NUM*2//敌机最大子弹数
/*隐藏光标函数*/
void startmenu();
void startgame();
void startmenu_options();
void choices_1(int a);					//选择按钮的设置。
void EnemyMove(int speed);  //飞机移动过程中随机生成子弹。
void PlayEnemyP();//用来判断子弹是否打中敌机
void EnemyHP(int i);					//随机产生飞机。大小随机
void GameInit();						//初始化easyx图形的设计
void CreateBullet();						//四发子弹的产生原理。
void BulletMove(int speed);
void PlayerDie();		//赵永林板砖
void read_file();  //读取最高分数。
void write_file();
void  enemyBulletMove(int speed);				//敌军子弹的移动
void GameControl(int speed);					//飞机移动的控制
struct Image
{
	IMAGE bakcGround;//背景图片
	IMAGE player[4];
	IMAGE bullet[2];
	IMAGE enemy[4];//飞机
}image;
enum TYPE
{
	SMALL,
	BIG,
};
struct Plane
{
	int x;
	int y;
	bool flag;//是否存活  true flase
	union
	{
		int type;//敌机独有属性
		int score;//玩家独有属性,
	}un;
	int hp;//血量
	int count;//每打中一次飞机加一,如果打中十辆辆飞机就回五滴血。
	int width;//飞机宽度(即图片宽度)
	int height;
}player, bullet[BULLET_NUM], bullet2[BULLET_NUM], bullet3[BULLET_NUM], bullet4[BULLET_NUM], enemy[ENEMYPLANE_NUM];
struct Plane enemyBullet[BULLET_ENEMY_NUM], enemyBullet2[BULLET_ENEMY_NUM];
DWORD t1, t2, t3, t4, t5, t6, t7, t8 = GetTickCount(); //用来计时判断游戏物品出现的速率。
int count;					//用来进入第三关卡。
int count2;//用于变换关卡
int h = 0;//用于记录最高得分。
int m = 700;//用来加速生产敌机。
int a[3] = { 1,2,3 };//播放哪个音乐
int main()
{

	startmenu();





	return 0;
}
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = FALSE;
	cursor.dwSize = sizeof(cursor);
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &cursor);
}
/*显示光标函数*/
void ShowCursor()
{
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = TRUE;
	cursor.dwSize = 100;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &cursor);
}
/*控制光标位置(方便指定打印位置)*/
void gotoxy(int x, int y)
{
	COORD c;
	c.X = x;
	c.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
/*改变字体颜色(具体颜色请参照十进制颜色对照表)*/
int changecolor(int a)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
	return 0;
}
void laotie()
{
	gotoxy(25, 15);
	changecolor(15);
	printf("      ●●●●●●●●●●●●●●●                     \n");
	gotoxy(25, 16);
	printf("      ●●●●●●●●●●●●●●●                       \n");
	gotoxy(25, 17);
	printf("      ●●           \n");
	gotoxy(25, 18);
	printf("      ●●     \n");
	gotoxy(25, 19);
	printf("      ●●                                  ●●●●●●●●●●●●●   \n");
	gotoxy(25, 20);
	printf("      ●●                                  ●\n");
	gotoxy(25, 21);
	printf("      ●●                                  ●  \n");
	gotoxy(25, 22);
	printf("      ●●                                  ●                           ●●●●●●●●   \n");
	gotoxy(25, 23);
	printf("      ●●●●●●●●●●●●●●●●      ●                           ●\n");
	gotoxy(25, 24);
	printf("      ●●●●●●●●●●●●●●●●      ●●●●●●●●●●●●●   ●  \n");
	gotoxy(25, 25);
	printf("      ●●                        ●●      ●                      ●   ● \n");
	gotoxy(25, 26);
	printf("      ●●                        ●●      ●                      ●   ●\n");
	gotoxy(25, 27);
	printf("      ●●                        ●●      ●                      ●   ●●●●●●●● \n");
	gotoxy(25, 28);
	printf("      ●●                        ●●      ●                      ●   ●            ●\n");
	gotoxy(25, 29);
	printf("      ●●                        ●●      ●                      ●   ●            ●\n");
	gotoxy(25, 30);
	printf("      ●●                        ●●      ●                      ●   ●            ●\n");
	gotoxy(25, 31);
	printf("      ●●●●●●●●●●●●●●●●      ●                      ●   ●            ●\n");
	gotoxy(25, 32);
	printf("      ●●●●●●●●●●●●●●●●      ●●●●●●●●●●●●●   ●●●●●●●●\n");


}
void ZHTsnake()
{
	changecolor(11);
	printf("                                                                        \n");
	printf("    @@@         @@        @            @        ●         ●           \n");
	printf(" @@@@@@@@@@@@@@@@@@@     @@     ◆      @@   @@@@@@@@@@@@@@@@@@@@       \n");
	printf("            @  @@      @@    &     &   @@            @@                 \n");
	printf("   ~    ~    @@        @@    #    #     @@            @@                \n");
	printf("   #    #  @@          @@             @@            @@                  \n");
	printf("         @@ @           @@@@@@@@@@@@@@@@@            @@                 \n");
	printf("    @  @@              @@   @     @    @@           @@                  \n");
	printf("     @@ @               @@              @@            @@                \n");
	printf("   @@                  @@              @@            @@                 \n");
	printf(" @@@@@@@@@@@@@@@@@@@     @@             @@            @@                \n");
	printf("      @@     @@           @              @                              \n");
	printf("                                                                        \n");
	gotoxy(64, 2);
	changecolor(5);
	printf("               @ @@@@@@                           \n");
	gotoxy(64, 3);
	printf("             @          @                         \n");
	gotoxy(64, 4);
	printf("            @            @                        \n");
	gotoxy(64, 5);
	printf("           @     @@@@  ## @                       \n");
	gotoxy(64, 6);
	printf("           @    @@   @    @                       \n");
	gotoxy(64, 7);
	printf("           @     @@   @@@@                        \n");
	gotoxy(64, 8);
	printf("            @      @@                             \n");
	gotoxy(64, 9);
	printf("              @      @@                           \n");
	gotoxy(64, 10);
	printf("               @      @@                          \n");
	gotoxy(64, 11);
	printf("  @@@@@@       @     @@                           \n");
	gotoxy(64, 12);
	printf(" @      @@@     @     @@                          \n");
	gotoxy(64, 13);
	printf("@     @@       @      @ @@@@@@    @    @   @ @@@@@\n");
	gotoxy(64, 14);
	printf("@      @@@@@ @       @  @    @   @ @   @  @  @    \n");
	gotoxy(64, 15);
	printf(" @                 @@   @    @  @@@@@  @@    @@@@ \n");
	gotoxy(64, 16);
	printf("  @              @@     @    @ @     @ @  @  @    \n");
	gotoxy(64, 17);
	printf("     @ @@@@@@@@@        @    @@       @@   @ @@@@@\n");
}
/*游戏说明及规则*/
void instruction()
{
	system("cls");
	changecolor(3);
	printf("----------------------Hi,Snake!~o(*= ▽=*)ブ----------------------\n"); //上边框
	gotoxy(0, 17);
	changecolor(3);
	printf("------------------------------------------------------------------\n"); //下边框 
	gotoxy(2, 2);
	changecolor(14);
	printf("◇ 操作说明 ◇\n");
	gotoxy(2, 4);
	changecolor(3);
	printf("※按↑↓←→键分别控制飞机向上、下、左、右移动\n");
	gotoxy(2, 6);
	printf("※按空格键暂停游戏\n");
	gotoxy(2, 8);
	printf("※按ESC键于游戏暂停游戏\n");
	changecolor(14);
	gotoxy(2, 10);
	printf("◇ 游戏规则 ◇\n");
	gotoxy(2, 12);
	changecolor(3);
	printf("※肥肠简单,只要还有HP值就可以了(笑)\n");
	//增加一个按回车键返回主菜单
	gotoxy(1, 16);
	printf("Press space back to the menu......");
	gotoxy(35, 16);
	int cha = _getch();
	while (cha == 0x0d)
	{
		system("cls");
		startmenu();
	}
}
DWORD WINAPI PlayGun(LPVOID lparamter);
void enemyCreateBullet(Plane belong);
void enemyBulletMove(int speed);
//分模块处理,专门的事情,专门的函数做
//确定飞机的类型
void EnemyHP(int i)
{
	if (rand() % 10 == 0) //十分之一的概率产生一个大飞机
	{
		if (count2 == 15)
			enemy[i].hp = 4;
		else
			enemy[i].hp = 3;
		enemy[i].un.type = BIG;
		enemy[i].width = 100;
		enemy[i].height = 130;
	}
	else
	{
		if (count2 == 15)
			enemy[i].hp = 3;
		else
			enemy[i].hp = 1;
		enemy[i].un.type = SMALL;
		enemy[i].width = 70;
		enemy[i].height = 60;
	}
}
//加载图片
void GameInit()
{
	//设置随机数种子
	srand(GetTickCount());
	//播放音乐
	mciSendString("open ./images/game_music.mp3 alias BGM", 0, 0, 0);//向多媒体设备接口发送字符串 media device interface 
	mciSendString("play BGM repeat", 0, 0, 0);
	//加载背景图片
	loadimage(&image.bakcGround, "./images/b.jpg");//把图片加载并保存
	loadimage(&image.player[0], "./images/planeNormal_1.jpg");
	loadimage(&image.player[1], "./images/planeNormal_2.jpg");
	loadimage(&image.player[2], "./images/boom_1.jpg");
	loadimage(&image.player[3], "./images/boom_2.jpg");
	loadimage(&image.bullet[0], "./images/bullet1.jpg");
	loadimage(&image.bullet[1], "./images/bullet2.jpg");
	loadimage(&image.enemy[0], "./images/enemy_1.jpg");
	loadimage(&image.enemy[1], "./images/enemy_2.jpg");
	loadimage(&image.enemy[2], "./images/enemyPlane1.jpg");
	loadimage(&image.enemy[3], "./images/enemyPlane2.jpg");
	//初始化玩家数据
	player.x = WIN_WIDTH / 2;
	player.y = WIN_HEIGHT - 120;
	player.flag = true;
	player.hp = 50;
	player.un.score = 0;
	player.width = 117;
	player.height = 120;

	//初始化子弹数据
	for (int i = 0; i < BULLET_NUM; i++)
	{
		bullet[i].flag = false;
		bullet2[i].flag = false;
		bullet3[i].flag = false;
		bullet4[i].flag = false;
	}
	//初始化敌机
	for (int i = 0; i < ENEMYPLANE_NUM; i++)
	{
		enemy[i].flag = false;
		EnemyHP(i);
	}
	//初始化敌机子弹
	for (int i = 0; i < BULLET_ENEMY_NUM; i++)
	{
		enemyBullet[i].flag = false;
		enemyBullet2[i].flag = false;
	}
}
//游戏界面绘制
void Gamedraw()
{
	//绘制背景
	putimage(0, 0, &image.bakcGround);
	//绘制玩家
	if (player.flag == true)
	{
		putimage(player.x, player.y, &image.player[0], NOTSRCERASE);
		putimage(player.x, player.y, &image.player[1], SRCINVERT);
	}
	else//玩家死亡,游戏结束
	{
		settextcolor(RED);
		settextstyle(50, 0, "黑体");
		char arr[] = "游戏结束~";
		int tsize = WIN_WIDTH / 2 - textwidth(arr) / 2;
		outtextxy(tsize, WIN_HEIGHT / 3, arr);
		putimage(player.x, player.y, &image.player[2], NOTSRCERASE);
		putimage(player.x, player.y, &image.player[3], SRCINVERT);
	}
	//绘制子弹
	for (int i = 0; i < BULLET_NUM; i++)
	{
		if (bullet[i].flag == true)
		{

			putimage(bullet[i].x, bullet[i].y, &image.bullet[0], NOTSRCERASE);
			putimage(bullet[i].x, bullet[i].y, &image.bullet[1], SRCINVERT);
		}
	}
	for (int i = 0; i < BULLET_NUM; i++)
	{
		if (bullet2[i].flag == true)
		{
			putimage(bullet2[i].x, bullet2[i].y, &image.bullet[0], NOTSRCERASE);
			putimage(bullet2[i].x, bullet2[i].y, &image.bullet[1], SRCINVERT);
		}
	}
	if (count2 == 15)
	{
		for (int i = 0; i < BULLET_NUM; i++)
		{
			if (bullet4[i].flag == true)
			{
				putimage(bullet4[i].x, bullet4[i].y, &image.bullet[0], NOTSRCERASE);
				putimage(bullet4[i].x, bullet4[i].y, &image.bullet[1], SRCINVERT);
			}
		}
		for (int i = 0; i < BULLET_NUM; i++)
		{
			if (bullet3[i].flag == true)
			{
				putimage(bullet3[i].x, bullet3[i].y, &image.bullet[0], NOTSRCERASE);
				putimage(bullet3[i].x, bullet3[i].y, &image.bullet[1], SRCINVERT);
			}
		}
	}
	//绘制敌机
	for (int i = 0; i < ENEMYPLANE_NUM; i++)
	{
		if (enemy[i].flag)
		{
			if (enemy[i].un.type == TYPE::SMALL)
			{
				putimage(enemy[i].x, enemy[i].y, &image.enemy[0], NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, &image.enemy[1], SRCINVERT);
			}
			else if (enemy[i].un.type == TYPE::BIG)
			{

				putimage(enemy[i].x, enemy[i].y, &image.enemy[2], NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, &image.enemy[3], SRCINVERT);
			}
		}
	}
	//绘制敌机子弹
	for (int i = 0; i < BULLET_ENEMY_NUM; i++)
	{
		if (enemyBullet[i].flag == true)
		{
			putimage(enemyBullet[i].x, enemyBullet[i].y, &image.bullet[0], NOTSRCERASE);
			putimage(enemyBullet[i].x, enemyBullet[i].y, &image.bullet[1], SRCINVERT);
			if (count && count2 == 15)
			{
				putimage(enemyBullet2[i].x, enemyBullet2[i].y, &image.bullet[0], NOTSRCERASE);
				putimage(enemyBullet2[i].x, enemyBullet2[i].y, &image.bullet[1], SRCINVERT);
			}
		}
	}
	//显示分数
	char score[20];
	settextcolor(RED);
	settextstyle(20, 0, "黑体");
	sprintf_s(score, "分数:%d,HP:%d", player.un.score, player.hp);
	setbkmode(TRANSPARENT);
	outtextxy(10, 10, score);
	if (count && count2 == 15)
		outtextxy(40, 30, "第三关");
	else if (count2 == 15)
	{
		outtextxy(40, 30, "第二关");
	}
	else
		outtextxy(40, 30, "第一关");
}
//产生一颗子弹
void CreateBullet()
{
	for (int i = 0; i < BULLET_NUM; i++)
	{
		if (count2 == 15)				//count2来判断是否进入第三关卡。//如果满足生成四发子弹。
		{
			if (bullet3[i].flag == false)
			{
				bullet3[i].flag = true;
				bullet3[i].x = player.x + 10;
				bullet3[i].y = player.y - 30;
			}
			if (bullet4[i].flag == false)
			{
				bullet4[i].flag = true;
				bullet4[i].x = player.x + 70;
				bullet4[i].y = player.y - 30;
			}
		}
		if (bullet[i].flag == false)
		{
			bullet[i].flag = true;
			bullet[i].x = player.x + 30;
			bullet[i].y = player.y - 10;
		}
		if (bullet2[i].flag == false)
		{
			bullet2[i].flag = true;
			bullet2[i].x = player.x + 50;
			bullet2[i].y = player.y - 10;
			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;
			}
		}
		if (bullet2[i].flag == true)
		{
			bullet2[i].y -= speed;
			if (bullet2[i].y <= 0)
			{
				bullet2[i].flag = false;
			}
		}
		if (count2 == 15)

		{
			if (bullet3[i].flag == true)
			{
				bullet3[i].y -= speed;
				if (bullet3[i].y <= 0)
				{
					bullet3[i].flag = false;
				}
			}
			if (bullet4[i].flag == true)
			{
				bullet4[i].y -= speed;
				if (bullet4[i].y <= 0)
				{
					bullet4[i].flag = false;
				}
			}
		}
	}

}
//产生敌机
void CreateEnemy()
{
	for (int i = 0; i < ENEMYPLANE_NUM; i++)
	{
		if (enemy[i].flag == 0)
		{
			enemy[i].flag = true;
			enemy[i].x = rand() % (WIN_WIDTH - 100);
			enemy[i].y = 0;
			EnemyHP(i);
			break;
		}
	}
}
//敌机移动
void EnemyMove(int speed)
{
	for (int i = 0; i < ENEMYPLANE_NUM; i++)
	{
		if (enemy[i].flag)
		{

			enemy[i].y += speed;
			if (rand() % 10 == 0 && enemy[i].x > 3 && enemy[i].y < WIN_WIDTH)
				enemy[i].x += 10;
			if (rand() % 11 == 0 && enemy[i].x >= 0 && enemy[i].y < WIN_WIDTH)
				enemy[i].x -= 15;
			if (enemy[i].y >= WIN_HEIGHT)
			{
				enemy[i].flag = false;
			}
			if ((rand() % 100) == 1)
			{
				enemyCreateBullet(enemy[i]);			//百分之一的几率产生敌机子弹
			}
		}
	}
}
//游戏控制
void GameControl(int speed)
{
	//_getch();GetAnsyncKeyState();
	if (GetAsyncKeyState(VK_UP) && player.y >= 0)
	{
		player.y -= speed;
	}
	if (GetAsyncKeyState(VK_DOWN) && player.y + 120 <= WIN_HEIGHT)
	{
		player.y += speed;
	}
	if (GetAsyncKeyState(VK_LEFT) && player.x + 50 >= 0)
	{
		player.x -= speed;
	}
	if (GetAsyncKeyState(VK_RIGHT) && player.x + 55 <= WIN_WIDTH)
	{
		player.x += speed;
	}
	if (GetAsyncKeyState(VK_ESCAPE))
	{
		while (1)
		{
			Sleep(300);
			if (GetAsyncKeyState(VK_ESCAPE))
				break;
		}
	}
	//发射子弹
	if (GetAsyncKeyState(VK_SPACE) && t2 - t1 > 100)
	{
		CreateBullet();
		HANDLE threadID = CreateThread(NULL, 0, PlayGun, a, 0, 0);
		CloseHandle(threadID);
		t1 = t2;
	}
	t2 = GetTickCount();
	if (count2 == 15)
		m = 200;
	if (t4 - t3 > rand() % 500 + m)
	{
		CreateEnemy();
		t3 = t4;
	}
	t4 = GetTickCount();
	t7 = GetTickCount();
	if (t7 - t8 > 25000)
		count = 1;
	if (t6 - t5 > 10 || t7 - t8 == 10000)
	{
		if (count2 == 15)
			EnemyMove(3);
		else
		{
			EnemyMove(1);
		}
		if (count)
			enemyBulletMove(7);
		else if (count2 == 15)
			enemyBulletMove(5);
		else
			enemyBulletMove(2);
		t5 = t6;
	}
	t6 = GetTickCount();
	if (count == 10)
		BulletMove(7);
	else
		BulletMove(4);
}
void PlayEnemyP()
{
	//1,遍历敌机数组  判断是否存活
	for (int i = 0; i < ENEMYPLANE_NUM; i++)
	{
		if (enemy[i].flag == 0)
		{
			continue;
		}
		//2,遍历子弹数组
		for (int k = 0; k < BULLET_NUM; k++)
		{
			if (bullet[k].flag == 0)
			{
				continue;
			}
			//3,判断子弹是否击中敌机
			if (bullet[k].x + 19 > enemy[i].x &&
				bullet[k].x < enemy[i].x + 52 && bullet[k].y + 24>enemy[i].y
				&& bullet[k].y < enemy[i].y + 39 || bullet2[k].x + 19 > enemy[i].x &&
				bullet2[k].x < enemy[i].x + 52 && bullet2[k].y + 24>enemy[i].y
				&& bullet2[k].y < enemy[i].y + 39 || bullet3[k].x + 19 > enemy[i].x &&
				bullet3[k].x < enemy[i].x + 52 && bullet3[k].y + 24>enemy[i].y
				&& bullet3[k].y < enemy[i].y + 39 || bullet4[k].x + 19 > enemy[i].x &&
				bullet4[k].x < enemy[i].x + 52 && bullet4[k].y + 24>enemy[i].y
				&& bullet4[k].y < enemy[i].y + 39)
				//4,打到了,属性改变,血量--,存活状态,玩家分数++
			{
				if (bullet[k].x + 19 > enemy[i].x &&
					bullet[k].x < enemy[i].x + 52 && bullet[k].y + 24>enemy[i].y
					&& bullet[k].y < enemy[i].y + 39)

				{
					enemy[i].hp--;
					bullet[k].flag = 0;
				}
				if (bullet2[k].x + 19 > enemy[i].x &&
					bullet2[k].x < enemy[i].x + 52 && bullet2[k].y + 24>enemy[i].y
					&& bullet2[k].y < enemy[i].y + 39 && enemy[i].hp>0)

				{
					enemy[i].hp--;
					bullet2[k].flag = 0;
				}
				/*if (bullet3[k].x + 19 > enemy[i].x &&
					bullet3[k].x < enemy[i].x + 52 && bullet3[k].y + 24>enemy[i].y
					&& bullet3[k].y < enemy[i].y + 39 && enemy[i].hp>0)

				{
					enemy[i].hp--;
					bullet3[k].flag = 0;
				}
				if (bullet4[k].x + 19 > enemy[i].x &&
					bullet4[k].x < enemy[i].x + 52 && bullet2[k].y + 24>enemy[i].y
					&& bullet4[k].y < enemy[i].y + 39 && enemy[i].hp>0)

				{
					enemy[i].hp--;
					bullet4[k].flag = 0;*/
					//}
				if (enemy[i].hp <= 0)
				{
					player.count++;
					player.un.score++;
				}
				if (player.un.score > 0 && player.un.score % 31 == 0 && player.un.score % 2 != 0)
				{
					HANDLE threadID = CreateThread(NULL, 0, PlayGun, a + 1, 0, 0);
					CloseHandle(threadID);
				}
				if (player.un.score % 40 == 0)
				{
					HANDLE threadID = CreateThread(NULL, 0, PlayGun, a + 2, 0, 0);
					CloseHandle(threadID);
				}

			}
			//5,如果血量为0,敌机死亡
			if (enemy[i].hp <= 0)
			{
				enemy[i].flag = 0;
				if (enemy[i].un.type == TYPE::BIG)
				{
					int count1 = 0;
					for (int h = 0; h < ENEMYPLANE_NUM; h++)
					{
						if (enemy[h].flag == 0)
						{
							enemy[h].flag = true;
							enemy[h].x = enemy[i].x + rand() % 40;
							enemy[h].y = enemy[i].y + rand() % 40;
							EnemyHP(h);
							if (enemy[h].un.type == TYPE::SMALL)
								count1++;
							else
								enemy[h].flag = false;
							if (count1 == 2)
								break;
						}
					}
				}
			}
			if (player.count == 15)
			{
				player.hp += 5; count2 = player.count;
				player.count = 0;
			}
		}
	}
}
void PlayerDie()
{
	//退出,写在前面是为了让,死亡画面和文字显示(让程序在运行一次)
	if (player.flag == false)
	{
		if (player.un.score > h)
			write_file();
		MessageBox(GetHWnd(), "挂掉了哦·", "Over", MB_OKCANCEL);
		mciSendString("close BGM ", 0, 0, 0);
		startmenu();
	}
	if (player.hp <= 0)
	{
		player.flag = false;
	}
	//玩家和敌机是否相撞
	for (int i = 0; i < ENEMYPLANE_NUM; i++)
	{
		if (enemy[i].flag)			//这句话不能少,不然会出现BUG
			if (player.x + 50 >= enemy[i].x && player.x + 50 <= enemy[i].x + enemy[i].width
				&& player.y > (enemy[i].y - enemy[i].height) && player.y < enemy[i].y + enemy[i].height)
			{
				player.hp -= 5;
				enemy[i].flag = false;
			}
	}
	//是否被子弹击中
	for (int i = 0; i < BULLET_ENEMY_NUM; i++)
	{

		if (enemyBullet[i].flag)
		{
			if (enemyBullet[i].x > player.x && enemyBullet[i].x <= player.x + player.width
				&& enemyBullet[i].y >= player.y && enemyBullet[i].y < player.y + player.height)
			{
				player.hp--;
				enemyBullet[i].flag = false;
				break;
			}
		}
	}

}

void menu_word2()
{
	gotoxy(3, 18);
	changecolor(14);
	printf("  请做出你的选择!");

}

void read_file()
{
	FILE* fp;
	fp = fopen("Desktop.txt", "a+");       //打开文件Desktop.txt
	fscanf_s(fp, "%d", &h);       //把文件中的最高分读出来
	fclose(fp);                         //关闭文件
}
void write_file()
{
	FILE* fp;
	fp = fopen("Desktop.txt", "w+");       //以读写的方式建立一个名为Desktop.txt的文件
	fprintf(fp, "%d", player.un.score);           //把分数写进文件中
	fclose(fp);
}
void startmenu()
{
	mciSendString("open ./images/a.mp3 alias BGM", 0, 0, 0);//向多媒体设备接口发送字符串 media device interface 
	mciSendString("play BGM repeat", 0, 0, 0);
	system("cls");
	ShowCursor();
	char chCmd[32];   //这三行用于控制 主菜单 窗口大小 
	sprintf_s(chCmd, "mode con cols=%d lines=%d", 117, 34);
	system(chCmd);
	read_file();
	ZHTsnake();
	menu_word2();
	laotie();
	startmenu_options();
}
void highestscore()
{
	system("cls");
	char chCmd[32];
	sprintf_s(chCmd, "mode con cols=%d lines=%d", 50, 25);
	system(chCmd);
	changecolor(14);
	gotoxy(5, 5);
	printf("Your highest score is %d.\n\n", h);
	gotoxy(1, 9);
	printf("Press space back to the menu......");
	gotoxy(35, 9);
	int cha = _getch();
	while (cha != 0x0d || cha == 0xE0)
	{
		cha = _getch();

	}
	system("cls");
	startmenu();
}
void startgame()
{
	t8 = t7;
	count2 = 0; count = 0;
	mciSendString("close BGM ", 0, 0, 0);//播放音乐
	initgraph(WIN_WIDTH, WIN_HEIGHT, SHOWCONSOLE);//创建一个图形窗口
	GameInit();

	BeginBatchDraw();//开启双款冲绘图,现在内存里面画好,在显示给你看
	while (1)
	{
		Gamedraw();
		FlushBatchDraw();
		if (count2 == 15)
			GameControl(3);
		else
			GameControl(1);
		PlayEnemyP();
		PlayerDie();
		FlushBatchDraw();
	}
	EndBatchDraw();//结束
	startmenu();
}
void choices_1(int a) //a为行坐标(15,17,19,21),注意开始时光标本来就是在startgame前面的 
{

	int ch = _getch();
	//控制光标的移动
	while (ch != 0x0d || ch == 0xE0) //如果按下回车,则跳出循环 
	//0x0d表示回车,0XE0表示上下左右等键的键码 
	{
		//再判断是哪个键
		ch = _getch();
		if (ch == 0x48 && a > 20)
		{
			a -= 2;
			gotoxy(6, a);
		}
		if (ch == 0x50 && a < 26)
		{
			a += 2;
			gotoxy(6, a);
		}
	}
	switch (a)
	{
	case 20:startgame(); break;
	case 22:instruction(); break;
	case 24:highestscore();  break;
	case 26: gotoxy(2, 30);  exit(0); break;
	}
}
void startmenu_options()
{
	changecolor(9);
	gotoxy(6, 20);
	printf("◆开始游戏◆\n");
	gotoxy(6, 22);
	printf("◆游戏介绍◆\n");
	gotoxy(6, 24);
	printf("◆得分记录◆\n");
	gotoxy(6, 26);
	printf("◆退出游戏◆\n");
	gotoxy(6, 20); //光标起始位置 
	choices_1(20);
}

//播放音乐
DWORD WINAPI PlayGun(LPVOID lparamter)
{
	int* choose = (int*)lparamter;
	printf("%d  \n", *choose);
	if (*choose == 1)
	{
		mciSendString("close f_gun", NULL, 0, NULL); // 先把前面一次的音乐关闭
		mciSendString("open ./images/f_gun.mp3 alias f_gun", NULL, 0, NULL);//打开背景音乐
		mciSendString("play f_gun", NULL, 0, NULL);  // 循环播放
	}
	else if (*choose == 2)
	{
		mciSendString("close 5music", NULL, 0, NULL); // 先把前面一次的音乐关闭
		mciSendString("open ./images/5.mp3 alias 5music", NULL, 0, NULL); // 打开音乐
		mciSendString("play 5music", NULL, 0, NULL); // 仅播放一次
	}
	else if (*choose == 3)
	{
		mciSendString("close 10music", NULL, 0, NULL); // 先把前面一次的音乐关闭
		mciSendString("open ./images/10.mp3 alias 10music", NULL, 0, NULL); // 打开音乐
		mciSendString("play 10music", NULL, 0, NULL); // 仅播放一次
	}

	return 0;
}

void enemyCreateBullet(Plane belong)
{
	for (int i = 0; i < BULLET_ENEMY_NUM; i++)
	{
		if (enemyBullet[i].flag == false)
		{
			enemyBullet[i].flag = true;
			enemyBullet[i].x = belong.x + belong.width / 2 - 10;
			enemyBullet[i].y = belong.y;
			if (count && count2 == 15)
			{
				enemyBullet2[i].flag = true;
				enemyBullet2[i].x = belong.x + belong.width / 2 + 10;
				enemyBullet2[i].y = belong.y;
			}
			break;
		}
	}
}
void  enemyBulletMove(int speed)
{
	//敌机子弹的移动速度要加上敌机的移动速度(速度一样会保持相对静止)
	int tspeed = speed * 2;
	for (int i = 0; i < BULLET_ENEMY_NUM; i++)
	{
		if (enemyBullet[i].flag == true)
		{
			enemyBullet[i].y += tspeed;
			if (enemyBullet[i].y > WIN_HEIGHT)
			{
				enemyBullet[i].flag = false;
			}
		}
		if (count && count2 == 15)
			if (enemyBullet2[i].flag == true)
			{
				enemyBullet2[i].y += tspeed;
				if (enemyBullet2[i].y > WIN_HEIGHT)
				{
					enemyBullet2[i].flag = false;
				}
			}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值