飞机大战 c语言

作业要求:
1.游戏多种类型的敌人(boss,简单敌人等)
2.游戏使用结构体
3.游戏能否进行写档读档
4.游戏画面颜色
//system(“color 5f”);
//0 = 黑色 8 = 灰色
//1 = 蓝色 9 = 淡蓝色
//2 = 绿色 a = 淡绿色
//3 = 湖蓝色 b = 淡浅绿色
//4 = 红色 c = 淡红色
//5 = 紫色 d = 淡紫色
//6 = 黄色 e = 淡黄色
//7 = 白色 f = 亮白色
5.游戏声效
在这里插入图片描述

注意:mp3要转成wav型文件!!!(刚在桌面!)
//PlaySound(“C://Users//Administrator//Desktop//1.wav”, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //格式工厂
6.游戏难度变化是否合理
7.飞机是否帅气
8.游戏bug多不多
9.游戏是否设置边框
10.其他个性化设定

成效:
在这里插入图片描述
代码 :

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#define high 28 
#define width 41 
#define EnemyNum 5	//敌机数目
#define BossNum 2
#include <mmsystem.h>//导入声音头文件
#pragma comment(lib,"Winmm.lib")

int position_x, position_y;		  			//飞机位置

int bullet_x,   bullet_y;         			//子弹位置

int flag;          // 飞机的生命条

struct enemy{
	int x;
	int y;
	int life;
}enemy[EnemyNum], boss[BossNum];

int score;           //成绩

int canvas[high][width] = {0}; 	// 二维数组存储游戏画布中对应的元素
// 0为空格,1为飞机Ж,2为子弹!,3为敌机o,4为Boss M

int BulletWidth;	//子弹宽度
int EnemyMoveSpeed; //敌机移动速度
int BossMoveSpeed; //Boss移动速度


void gotoxy(int x,int y) {			//光标移动到(x,y)位置
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
	
}
void HideCursor() { // 用于隐藏光标b 
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};  // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void startup() {
	int k;
	PlaySound("C://Users//Administrator//Desktop//1.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //格式工厂
	position_x = high-3;
	position_y = width/2;
	canvas[position_x][position_y] = 1;	
	canvas[position_x+1][position_y-1] = 1;	
	canvas[position_x+1][position_y+1] = 1;	
	
	for (k=0;k<EnemyNum;k++){
		enemy[k].x = rand() % 3 +1;
		enemy[k].y = 2+ (rand()%(width-2));
		canvas[enemy[k].x][enemy[k].y] = 3;
	}
	
	for (k=0;k<BossNum;k++){
		boss[k].x = rand() % 3 +1;
		boss[k].y = 2+ (rand()%(width-2));
		canvas[boss[k].x][boss[k].y] = 4;
		boss[k].life = 2;
	}
	
	BulletWidth = 3;
	bullet_x = 0;
	bullet_y = position_y;
	
	
	
	score = 0;
	flag = 3;
	EnemyMoveSpeed = 25;
}
void show1() {
	
    for(int i=0; i<high; i++) 
	{
		for(int j=0; j<width; j++) 
		{
			if(flag) 
			{
				if (canvas[i][j]==1)
					printf("o");   //   输出飞机*
				else if (canvas[i][j]==2)
					printf("!");   		//输出子弹
				else if (canvas[i][j]==3)
					printf("Y");   		//输出敌机Y 
				else if (canvas[i][j]==4)
					printf("M");   		//输出敌机Y 
				
				else if ( (j == width-1 ) || (i == high-1) || (j==0) || (i==0))
					printf("#");
				else
					printf(" ");		//输出空格
			}
		}
		printf("\n");
	}
	
	if(flag<=0) {
		gotoxy(44,2);
		printf("您的得分%d",score);
		gotoxy(44,4);
		printf("飞机生命值:%d\n",flag);
		gotoxy(44,6);
		printf("游戏结束");
		Sleep(300000);
	}
	else {
		gotoxy(44,2);
		printf("您的得分%d",score);
		gotoxy(44,4);
		printf("飞机生命值:%d\n",flag);
		gotoxy(44,8);
		printf("//说明:");
		gotoxy(44,10);
		printf("Space:发射子弹");
		gotoxy(44,12);
		printf("用W.S.A.D控制飞机");
		gotoxy(44,14);
		printf("//个性化设计:");
		gotoxy(44,16);
		printf("Enter:暂停");
		gotoxy(44,18);
		printf("ESC:退出游戏");
		gotoxy(44,20);
		printf("//Boss M需要打两次~");
		gotoxy(44,22);
		printf("//难度变化:");
		gotoxy(44,24);
		printf("当score超过20分后");
		gotoxy(44,26);
		printf(" 子弹数减少");
	}
}

void FileWrite()
{
	FILE* fp;  
    //int score=20;  
    fp = fopen("myfile.bin" , "wb"); 
    int i,j;
	for (i=0;i<EnemyNum;i++)
	{
		fwrite(&enemy[i], sizeof(struct enemy), 1, fp);//27字节大小
	}
	for (j=0;j<BossNum;j++)
	{
		fwrite(&boss[j], sizeof(struct enemy), 1, fp);//27字节大小
	}	
	fwrite(&position_x, sizeof(int),1,fp);
	fwrite(&position_y, sizeof(int),1,fp);
	fwrite(&score, sizeof(int),1,fp);
    fclose(fp);
	printf("\n保存成功\n");
}


void FileRead()
{
    for(int i=0; i<high; i++) 
	{
		for(int j=0; j<width; j++) 
		{
			canvas[i][j]=0;
		}
		printf("\n");
	}

	FILE *fp;
	fp = fopen("myfile.bin","rb");	//打开文件 "w": write写入文件;"r":read读取文件
//C://Users//Administrator//Desktop//419450238秦祉尉.data
	if(fp == NULL)
		startup();
	else
	{
		int i,j;
		for (i=0;i<EnemyNum;i++)
		{
			fread(&enemy[i], sizeof(struct enemy), 1, fp);//27字节大小
		}
		for (j=0;j<BossNum;j++)
		{
			fread(&boss[j], sizeof(struct enemy), 1, fp);//27字节大小
		}	
		fread(&position_x, sizeof(int ), 1, fp);
		fread(&position_y, sizeof(int), 1, fp);
	    fread(&score, sizeof(int), 1, fp);
		//printf("%d",score);
	}
	fclose(fp); // 关闭文件	
	canvas[position_x][position_y] = 1;	
	canvas[position_x+1][position_y-1] = 1;	
	canvas[position_x+1][position_y+1] = 1;	
	int k;
	for (k = 0; k < EnemyNum; k++)
	{
		canvas[enemy[k].x][enemy[k].y] = 3;
	}	
	for (k = 0; k < BossNum; k++)
	{
		canvas[boss[k].x][boss[k].y] = 4;
		boss[k].life=2;
	}
    //设置子弹宽度、敌机的速度 
	BulletWidth = 3;
	EnemyMoveSpeed = 25;
    HideCursor();
}


void withoutInpute() {	
	int k;
	static int speed =15;	//敌机自动下落
	if (speed<EnemyMoveSpeed)
		speed++;
	//if (speed<BossMoveSpeed)
		//speed++;
	if (speed==EnemyMoveSpeed ){
		speed=0;
		for(k=0;k<EnemyNum;k++)
		{
			canvas[enemy[k].x][enemy[k].y] = 0;	//残影问题
			(enemy[k].x)++;
			canvas[enemy[k].x][enemy[k].y] = 3;
		}
		
		for(k=0;k<BossNum;k++)
		{
			canvas[boss[k].x][boss[k].y] = 0;	//残影问题
			(boss[k].x)++;
			canvas[boss[k].x][boss[k].y] = 4;
		}
		
	}
	
	
	
	
	for (int i=0;i<high;i++){
		for (int j=0;j<width;j++){
			if (canvas[i][j]==2) {
				for(k=0;k<EnemyNum;k++){
					if(i==enemy[k].x && j==enemy[k].y){	//子弹击中敌机
						
						if (score%5==0 && EnemyMoveSpeed>3)   // 达到一定积分后,敌机变快
							EnemyMoveSpeed--;
						if(score>=20)
						{
							BulletWidth=1;
						}
						
						canvas[enemy[k].x][enemy[k].y] = 0;	//残影问题
						enemy[k].x = 0;
						enemy[k].y =2+ (rand()%(width-2));
						canvas[enemy[k].x][enemy[k].y] = 3;
						score++;
					}
				}
				
				// 改boss
				for(k=0;k<BossNum;k++){
					if(i==boss[k].x && j==boss[k].y){	//子弹击中BOss
						boss[k].life--;
						if(boss[k].life==0)
						{
							
							if (score%5==0 && BossMoveSpeed>3)   // 达到一定积分后,Boss变快
								BossMoveSpeed--;
							if(score>=20)
							{
								BulletWidth=1;
							}
							
							canvas[boss[k].x][boss[k].y] = 0;	//残影问题
							boss[k].x = 0;
							boss[k].y =2+ (rand()%(width-2));
							canvas[boss[k].x][boss[k].y] = 4;
							score++;
							boss[k].life=2;
						}
					}
				}
				
				
				
				//子弹向上移动
				canvas[i][j] = 0;
				if (i>0)
					canvas[i-1][j] = 2;
			}
		}
	}
	//飞机与敌机相撞 
	for(k=0;k<EnemyNum;k++)
	{
		if(position_x==enemy[k].x && position_y==enemy[k].y)
		{	//子弹击中敌机
			canvas[enemy[k].x][enemy[k].y] = 0;	//残影问题
			enemy[k].x = 0;
			enemy[k].y =2+ (rand()%(width-2));
			canvas[enemy[k].x][enemy[k].y] = 3;
			
			canvas[enemy[k].x][enemy[k].y] = 0;	//残影问题
			position_x = high-2;
			position_y = width/2;
			canvas[enemy[k].x][enemy[k].y] = 1;	
			flag--;
		}
	}
	for(k=0;k<BossNum;k++){
		if(position_x==boss[k].x && position_y==boss[k].y){	//子弹击中Boss
			canvas[boss[k].x][boss[k].y] = 0;	//残影问题
			boss[k].x = 0;
			boss[k].y =2+ (rand()%(width-2));
			canvas[boss[k].x][boss[k].y] = 4;
			
			canvas[boss[k].x][boss[k].y] = 0;	//残影问题
			position_x = high-2;
			position_y = width/2;
			canvas[boss[k].x][boss[k].y] = 1;	
			flag--;
		}
	}
	
	for(k=0;k<EnemyNum;k++){
		if (enemy[k].x>high){	//敌机跑出下边界
			canvas[enemy[k].x][enemy[k].y] = 0;	//残影问题
			enemy[k].x = 0;
			enemy[k].y = 2+ (rand()%(width-2));
			canvas[enemy[k].x][enemy[k].y] = 3;
			flag--;
		}
	}
	for(k=0;k<BossNum;k++){
		if (boss[k].x>high){	//Boss跑出下边界
			canvas[boss[k].x][boss[k].y] = 0;	//残影问题
			boss[k].x = 0;
			boss[k].y = 2+ (rand()%(width-2));
			canvas[boss[k].x][boss[k].y] = 4;
			flag--;
		}
	}
}

void withInpute() 
{
	char input;//需要导入 #include<conio.h> 头文件
	if(kbhit()) 
	{
		input = getch();
		if(  (input == 'w' ||input == 'W') &&  position_x > 1 )
		{
			canvas[position_x][position_y] = 0;	//解决拖影问题
			canvas[position_x+1][position_y-1] = 0;	
			canvas[position_x+1][position_y+1] = 0;	
			position_x--;  // 位置上移
		}
		if(   (input == 's' ||input == 'S') && position_x < high-2)
		{
			canvas[position_x][position_y] = 0;	//解决拖影问题
			canvas[position_x+1][position_y-1] = 0;	
			canvas[position_x+1][position_y+1] = 0;	
			position_x++;  // 位置下移
		}
		if(   (input == 'a' ||input == 'A') && position_y > 1)
		{
			canvas[position_x][position_y] =0;	//解决拖影问题
			canvas[position_x+1][position_y-1] = 0;	
			canvas[position_x+1][position_y+1] = 0;	
			position_y--;  // 位置左移
		}
		if(   (input == 'd' ||input == 'D') && position_y  < width-2)
		{
			canvas[position_x][position_y] = 0;	//解决拖影问题
			canvas[position_x+1][position_y-1] = 0;	
			canvas[position_x+1][position_y+1] = 0;	
			position_y++;  // 位置右移
		}
		canvas[position_x][position_y] = 1;	//解决拖影问题
		canvas[position_x+1][position_y-1] = 1;	
		canvas[position_x+1][position_y+1] = 1;	
		if( input == ' ')
		{
			int left, right;
			left  =  position_y - BulletWidth;
			right =  position_y + BulletWidth;
			
			for (int k=left; k<=right; k++)
			{
				if(k>0 || k<width)
				{
					canvas[position_x-1][k] = 2;
				}
			}
		
		}
		if (input == 'k' ||input == 'K')
		{
			FileWrite();
		}
		if (input == 'l' ||input == 'L')
		{
			system("cls");
			FileRead();
		}
		if(GetAsyncKeyState(VK_RETURN))
		{
			while(1)
			{
				Sleep(100);
				if(GetAsyncKeyState(VK_RETURN))
				{    
					break;
				}
			}
		}
        if(GetAsyncKeyState(VK_ESCAPE))
		{
			flag=0;
		}
	}
	
}


int main() 
{
	system("color 5f");
	//0 = 黑色    8 = 灰色
    //1 = 蓝色    9 = 淡蓝色
    //2 = 绿色    a = 淡绿色
    //3 = 湖蓝色    b = 淡浅绿色
    //4 = 红色    c = 淡红色
    //5 = 紫色    d = 淡紫色
    //6 = 黄色    e = 淡黄色
    //7 = 白色    f = 亮白色
	HideCursor();
	startup();					// 数据初始化
	while(1) 
	{					//  游戏循环执行
		gotoxy(0,0);			//光标移动到(x,y)位置
		show1();					// 显示画面
		
		withoutInpute();		// 与用户输入无关的更新
		withInpute();			// 与用户输入有关的更新
		
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值