#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <time.h> 
#define N 35
 #define up 72
  #define left 75 
  #define right 77  
  void run();//游戏控制函数 
   void yn();//设置是否继续游戏函数 
   void print(int [][N]);//输出函数  
   void movebul(int [][N]);//子弹移动函数 
   void movepla(int [][N]);//敌机移动函数 
   void setting(void);//设置函数 
   void menu(void);//菜单函数 

int scr[22][N]={0},pl=9,width=24,speed=3,density=30,score=0,death=0;
int main()
{ 
  menu();     run();     
   }  
   void print(int a[][N])//输出函数 
   {   system("cls");   int i,j;  for(i=0;i<22;i++)  {   a[i][width-1]=4;   for(j=0;j<width;j++)    {     if(a[i][j]==0)printf(" ");     if(a[i][j]==1)printf("\5");//输出我机的符号   
     if(a[i][j]==2)printf("^");//子弹     
	 if(a[i][j]==3)printf("\3"); //输出敌机符号   
	   if(a[i][j]==4)printf("\2");     if(i==1&&j==width-1)printf("您成功杀敌:%d 架",score);//右上角显示得分     
	               if(i==2&&j==width-1)                                     printf("设置:Esc")

    if(i==4&&j==width-1);
	printf("您已经死亡了:%d 次",death)//右上角显示死亡次数        
	  if(i==9&&j==width-1)
	  printf("  你还剩余 %d 条命!",3-death);     
	  if(i==18&&j==width-1)                    
	  printf("制作人:XXX");                 
	  if(i==19&&j==width-1)                                
	  printf("班级:信息10-3班");                 
	  if(i==20&&j==width-1)                              
	   printf("学  号:20100302xxxx");   
	    }   
		printf("\n");   } } 
		 void movebul(int a[][N]) 
		 { 
		   int i,j;  for(i=0;i<22;i++) 
		    for(j=0;j<width;j++)   { 
			   if(i==0&&a[i][j]==2)     a[i][j]=0;    if(a[i][j]==2)  
			     {     if(a[i-1][j]==3)    
				 {      score+=1;      printf("\7");     }    
				  a[i][j]=0,a[i-1][j]=2;    }   }  }    
				  void movepla(int a[][N]) { 
				   int i,j;   for(i=21;i>=0;i--)//从最后一行往上是为了避免把敌机直接冲出数组。  for(j=0;j<width;j++) 
 {   if(i==21&&a[i][j]==3)  
  a[i][j]=0;
   if(a[i][j]==3)a[i][j]=0,a[i+1][j]=3;
    }   if(a[20][pl]==3&&a[21][pl]==1)death++;
	 }  void yn() {   
	 system("cls");  
	 system("color 2e");  
	 printf("\n");  
	 printf("\n");  
	 printf("\t\t\t\t *****GAME OVER*****\n\a"); 
	  printf("\n"); 
	   printf("\n");  
	   printf("\t\t      *****游***戏***结***束*****     \n\n\n");   
	     printf("\t\t\t按y键继续游戏,n键退出游戏(y/n)?\n");   
		   printf("\t\t\t");   switch(getch())
		    {  case 'y':  case 'Y':death=0,score=0,run();break;  case 'n':  case 'N':break;  default :exit(0);break;  } } 
			 void setting(void) { 
			  int sw=0,i,j; 
			  system("cls");
			   do { sw=0;
			     printf("\n 游戏界面的大小:1.大2.小>> ");
				  switch(getche()) {
				    case '1':width=34;
					break; 
					case '2':width=24;
					break; 
					 default:printf("\n 错误,请重新选择...\n"); sw=1; 
}  }
while(sw);
 do { sw=0;  
 printf("\n 请选择敌机密度:1.大2.中3.小>> "); 
 switch(getche()) { 
  case '0':density=10;
  break; 
  case '1':density=20;break; 
  case '2':density=30;break; case '3':density=40;break;
    default:printf("\n 错误,请重新选择...\n"); sw=1; }  }
	while(sw); do { sw=0;  printf("\n 敌机的飞行速度:1.快2.中3.慢>> ");
	 switch(getche()) {  case '1':speed=2;break; 
	 case '2':speed=3;break; 
	 case '3':speed=4;break; 
	  default:printf("\n 错误,请重新选择...\n"); sw=1; }  }
	  while(sw);  for(i=0;i<22;i++) for(j=0;j<45;j++) scr[i][j]=0; 
	   scr[21][pl=9]=1;  
	   printf("\n 按任意键保存...");
	    getch(); 
		} 
		 void run() {  system("color 2e");
		   int i=0,j=0;
		     scr[21][pl]=1;
			    scr[0][5]=3;     
				 while(death<3) //限制死亡次数 
 {    if(kbhit())   switch(getch())//控制左右移动   
  {         case left:    case 'a':    case 'A':if(pl>0)    scr[21][pl]=0,scr[21][--pl]=1;break;  
    case  right:    case 'd':    case 'D':if(pl<width-2)    scr[21][pl]=0,scr[21][++pl]=1;break;  
	  case up:    case 'W':    case 'w':scr[20][pl]=2;break;  
	    case 27 :exit(0);break;   }  if(++j%density==0)//控制生产敌机的速度  
		 {    j=0;    srand(time(NULL));//产生随机数   
		  scr[0][rand()%width]=3;//生成随机敌方飞机  
		   }  if(++i%speed==0)//控制敌机移动速度,相对于子弹移动速度 
		     movepla(scr);//飞机移动  
			  movebul(scr);//子弹移动   
			  print(scr);//绘制游戏画面    
			  }    yn(); }  void menu(void)  {system("color 2e");//设置背景颜色 
			   printf("说明:按N M 控制我机左右飞行,Z 发射子弹\n 设置:请按Esc\n 开始游戏:任意键");  if(getch()==27)setting();  }      
 
                                           
  while(1);
  return 0;
}