C语言实现【小游戏——飞机大战2】模块化设计


1.目标要求:

1.击中目标,分数加1
2.分数多20【分数梯度】分,难度增加一个等级
3.飞机碰到目标时,游戏结束


2.C语言代码:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>

#define bullets_num 15//同一屏幕可存在的子弹数量 
#define aim_num 4//同一屏幕可存在的目标数量
#define level_difference 20 //每等级的【分数梯度】 
/*
			《飞机大战_模块化》	by:你最珍贵
	 ———————————————————————
	|控制信号: | 上 | 下 | 左 | 右 | 开火 | 暂停 | 
	 ———————————————————————	 
	|    键盘: |  i |  k |  j |  l | 空格 |  z   | 
	 ———————————————————————
	 
	 1.击中目标,分数加1 
	 2.分数多20【分数梯度】分,难度增加一个等级 
	 3.飞机碰到目标时,游戏结束 

*/
int line,column;	//显示屏幕行列 
int aircraft_x,aircraft_y;	//飞机位置
 
int bullets_x[bullets_num+1]={0};
int bullets_y[bullets_num+1]; //子弹位置,同一屏幕最多可存在bullets_num个子弹{1~bullets_num else0} 
int aim_x[aim_num+1]={0};
int aim_y[aim_num+1]; //目标位置,同一屏幕最多可存在aim_num个目标{1~aim_num else0}; 

int aim_speed_num,aim_speed;//目标下落速度之变量,目标下落速度 
int scores;//分数 
int IsKnock;//是否被撞 
int level;//难度等级 

void HideCursor(){	//隐藏光标位置 ,这个函数复制代码就行 
	CONSOLE_CURSOR_INFO cursor_info={1,0}; 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void gotoxy(int x,int y){	//把光标放在(0,0)位置 ,这个函数复制代码就行
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
} 
 
void startup(){		//数据初始化
	int i;
	HideCursor();	//隐藏光标功能 
	line=22,column=78;//可移动屏幕大小 
	aircraft_x = line/2,aircraft_y = column/2;//飞机初始位置 
	for(i=1;i<=aim_num;i++){
		aim_y[i]=rand()%column+1;//4个目标位置随机取 
	}
	aim_speed=12;//目标下落初始速度,数字越大越慢 
		//此值与level、之后的速度变化、之后的等级变化代码有关 
	aim_speed_num=1;//目标下落速度之循环变量初值(循环计数的) 
	scores=0;//分数	
	level=1; //难度等级 
	IsKnock=0;  //被撞标记为0 
} 
void show(){	// 显示画面 
	int printf_i;	//是否输出 
	int i;
	gotoxy(0,0);	//刷新页面时鼠标回到(0,0)位置 
	int x,y;	//页面坐标 
	printf("  【难度等级:%2d】            游戏\
:《飞机大战》                  【分数:%3d】\n",level,scores); 
	for( x=1;x<=line;x++){	//行坐标循环 
		printf("\n");
		printf(" "); //输出使对称的空格 
		for( y=1;y<=column;y++){	//列坐标循环 
			printf_i=0; 	//输出标记重置为0(未输出状态),1是已输出状态 
			if( x==aircraft_x && y==aircraft_y){	//判断飞机位置 
				printf("M");printf_i=1; 
			}
			if( printf_i==0){
				for(i=1;i<=bullets_num;i++){	//判断子弹位置 
					if( x==bullets_x[i] && y==bullets_y[i]){
						printf("|");printf_i=1;break;
					}
				}
			} 
			if( printf_i==0){
				for(i=1;i<=aim_num;i++){	//判断目标位置 
					if( x==aim_x[i] && y==aim_y[i]){
						printf("*");printf_i=1;break;
					}
				}
			}
			if(printf_i==0){
				printf(" ");		//都不是的话输出空格	
			}
		}		
	}
} 
void update_outinput(){	//与输入无关的更新 
	int i,j; 
	aim_speed_num= (aim_speed_num==aim_speed)?1:aim_speed_num+1;//速度变量循环计数
	for(i=1;i<=bullets_num;i++){	//子弹位置更新 
		bullets_x[i]= (bullets_x[i]==0)? 0:bullets_x[i]-1;
	}
	for(i=1;i<=aim_num;i++){	//目标位置更新 
		if(aim_x[i]==line){
			aim_x[i]=0;
			aim_y[i]=rand()%column+1;
		}else{
			aim_x[i] += aim_speed_num/aim_speed;//速度值到aim_speed时目标行数+1; 
		}
	}
	for(i=1;i<=aim_num;i++){	//判断目标是否被击中 
		for(j=1;j<=bullets_num;j++){
			if(aim_x[i]==bullets_x[j] && aim_y[i]==bullets_y[j]){
				scores++;//分数加1 
				if( scores>0 && scores%level_difference==0){//分数改变了,判断要不要升级 
					aim_speed= (aim_speed<=3)? 2:aim_speed-3;//速度变化12>9>6>3>2 
					level= (level==5)? 5:level+1;//等级变化1>2>3>4>5 
					aim_speed_num=1; // aim_speed速度已改,其相关变量必须重置一下! 
				}
				printf("\a");//输出提示音 
				bullets_x[j]=0;//子弹归位 
				aim_x[i]=0;//目标归位 
				aim_y[i]=rand()%column+1;
				break;
			}
		}
	}
	for(i=1;i<=aim_num;i++){	//判断飞机是否被目标击中 
		if(aim_x[i]==aircraft_x && aim_y[i]==aircraft_y){
			IsKnock=1;break;
		}
	}	 
} 
void update_input(){	//与输入有关的更新 
	int i;
	char input;
	if(kbhit()){	//kbhit()判断有无输入,有输入为1
					//无输入则不运行(不卡在这一步,可往后运行继续刷新页面哦,棒) 
		input = getch();	//将输入的值存入input 
		if( input=='j'){
			aircraft_y = (aircraft_y==1)? 1:aircraft_y-1;//不能用aircraft_y--形式,传递的是原值不是-1的 
		}else if( input=='l'){
			aircraft_y = (aircraft_y==column)? column:aircraft_y+1;
		}else if( input=='i'){
			aircraft_x = (aircraft_x==1)? 1:aircraft_x-1;
		}else if( input=='k'){
			aircraft_x = (aircraft_x==line)? line:aircraft_x+1;
		}else if( input=='z'){
			system("pause");
		}else if( input==' '){
			for(i=1;i<=bullets_num;i++){	//找出未用子弹位置 
				if( bullets_x[i]==0) break;
			}
			if(i>=1&&i<=bullets_num){	//使用该子弹 
				bullets_x[i]=aircraft_x-1;
				bullets_y[i]=aircraft_y;
			}					
		} 
	}
}
void show_end(){	//显示失败界面 
	int i,j; 
	system("cls");//清屏  
	for( j=1; j<=8; j++) 
		putchar('\n'); 
	for( j=1; j<=30; j++)
		putchar(' ');
	printf("您的分数是:%d\n\n",scores); 
	printf("                     \
           GAME OVER!\n");
	for( j=1; j<=8; j++)//输出空白行 
		putchar('\n'); 
	system("pause");	//暂停一次      
	system("pause");	//暂停一次   
	system("pause");	//暂停一次   
}
 
int main(){
	startup();	//数据初始化
	while(!IsKnock){	//游戏循环执行 
		show();	// 显示画面 
		update_outinput();	//与输入无关的更新 
		update_input();	//与输入有关的更新 
	}
	show_end(); 
	return 0;
}

3.运行结果:

小游戏玩法:

			《飞机大战_模块化》	by:你最珍贵
	 ——————————————————————————————————————————
	|控制信号: ||||| 开火 | 暂停 | 
	 ——————————————————————————————————————————	 
	|  键盘: |  i |  k |  j |  l | 空格 |  z   | 
	 ——————————————————————————————————————————

飞机大战and飞机大战
飞机大战and飞机大战

发布了8 篇原创文章 · 获赞 1 · 访问量 179

猜你喜欢

转载自blog.csdn.net/weixin_43503632/article/details/105411441