C++飞机大战(控制台版)

代码:

#include<iostream>
#include<stdlib.h> 
#include<conio.h>
#include<windows.h>
#include<cmath>

using namespace std;
//函数外全局变量定义
int position_x1, position_y1;  //飞机位置 
int position_x2, position_y2;  //飞机位置
int position_x3, position_y3;  //飞机位置
int bullet_x, bullet_y; //子弹位置 
int high=35, width=55;     //游戏画面尺寸 
int enemy_x[40],enemy_y[40];
int enemy_x2[40],enemy_y2[40];
int enemy_xb[40],enemy_yb[40];   //敌机子弹位置 
int score=1;
int a[100][100]={0};
int number;  //敌机数量 
int ew=1;
int bw=2;  //子弹宽度 
int k=0;
int j=1;
int je=1;
void startup()   //数据初始化 
{

	position_x1 = high-3;
	position_y1 = width/2;
	
	position_x2 = high-2;
	position_y2 = width/2-1;
	
	position_x3 = high-1;
	position_y3 = width/2;

    a[position_x1][position_y1]=1;  //1表示飞机 
	bullet_x = -1;
	bullet_y = position_y1;
	
	a[position_x2][position_y2]=5;  //5表示飞机 
	a[position_x3][position_y3]=6;  //6表示飞机 
	
	number=3;   //初始飞机数量 
    for(int i=0;i<number;i++)
	{   //if(i>=1)
	    /*for(int j=0;j<number;j++)
		{
			if(i!=j)
			{
				enemy_x[i]= 0;
				enemy_y[i]=rand()%(width-3)+1;
				a[enemy_x[i]][enemy_y[i]]=3;   //3表示敌机
				if(abs(enemy_x[i]-enemy_x[j])<2&&abs(enemy_y[i]-enemy_y[j])<3)
				{
					i--;
					break; 
				}
			}
			else
	        {
	        	enemy_x[i]= 0;
				enemy_y[i]=rand()%(width-3)+1;
				a[enemy_x[i]][enemy_y[i]]=3;   //3表示敌机
			}
	    }*/
		//else
		//{
		enemy_x[i]= 0;
		enemy_y[i]=rand()%(width/number-2)+(width/number-2)*i+3;
		a[enemy_x[i]][enemy_y[i]]=3;   //3表示敌机 
		
		enemy_xb[i]=enemy_x[i];
		enemy_yb[i]=enemy_y[i]+1;
		a[enemy_xb[i]][enemy_yb[i]]=7;   //7表示敌机子弹 
	    //}
		enemy_x2[i]= -1;
		enemy_y2[i]=enemy_y[i]-1;
		a[enemy_x2[i]][enemy_y2[i]]=4;   //4表示敌机 
		//j=j+width/number;
	 } 
}
void gotoXY(int x, int y) //光标移动到(x,y)位置
{
COORD pos = { x,y };
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两参数分别是指定哪个窗体,具体位置
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };//第二个值为0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void show()    //显示画面 
{
	HideCursor();
	gotoXY(0,0);   //光标移动到原点位置,以下重画清屏; 
	int i, j;
	//system("cls");  //清屏 
	for (i = 0; i <= high; i++) {
		for (j = 0; j <= width; j++) {
			if(a[i][j]==6)
			{
				k=2;
				cout<<"* *";
			}
			else if(a[i][j]==1)
			{
				k=2;
				cout<<"/="<<'\\';
			}
			else if(a[i][j]==5)
			{
				k=4;
				cout<<"<<*>>";
			}
			else if((i<high)&&(j==width))
			 cout<<"|";           //右边界 
			else if((i<high)&&(j==1))
			 cout<<"|";           //左边界 
			else if(i==high)
			 cout<<"-";
			else if(a[i][j]==2)
			cout<<"|";     //输出子弹 
			else if(a[i][j]==3)
			 cout<<"|";
			else if(a[i][j]==4)
			{
				k=2;
				cout<<'\\'<<"+/";
			}
			else if(a[i][j]==7)
			cout<<".";
			else if(a[i][j]==0)
			{
				if(!k)
				cout<<" ";
				else 
				k--;
			}
		}
		cout << endl;
	}
	cout << "得分:" << score<<"\n";
	cout<<"不要尝试使飞机飞出边界!"; 
}
void updateWithoutInput()   //与用户输入无关的更新
{
	if(score<1)
	{
		cout<<"失败!\n"; 
		for(int i=0;i<200000000;i++){;}
		system("pause");
		exit(0);
	 }      //得分<0游戏结束 
	for(int i=0;i<=high;i++)
	{
		for(int j=0;j<=width;j++)
		{   
			if(a[i][j]==2){
				for(int m=0;m<number;m++)
				{
					if((i<=enemy_x[m]+1)&&(i>=enemy_x[m]-1)&&(j==enemy_y[m])){
						a[enemy_x[m]][enemy_y[m]]=0;
						enemy_x[m]=0;
						enemy_y[m]=rand()%(width/number-2)+(width/3-2)*m+3;
						a[enemy_xb[m]][enemy_yb[m]]=0;
						enemy_xb[m]=enemy_x[m]+1;
						enemy_yb[m]=enemy_y[m];
						a[enemy_x[m]][enemy_y[m]]=7;
						a[enemy_x2[m]][enemy_y2[m]]=0;
						enemy_x2[m]=enemy_x[m]-1;
						enemy_y2[m]=enemy_y[m]-1;
						a[enemy_x[m]][enemy_y[m]]=3;  //击中敌机,重新生成敌机 
						a[enemy_x2[m]][enemy_y2[m]]=4;
						score++;
						//je=je+width/number;
					}
				}
				a[i][j]=0;
				if(i>0)
				  a[i-1][j]=2;  //子弹上移 
			}
		}
	}
	for(int i=0;i<number;i++)
	{
		if((position_y1<=enemy_y[i]+1)&&(position_y1>=enemy_y[i]-1)&&(position_x1-1==enemy_x[i]))
		{
			cout<<"失败!\n";
			for(int i=0;i<200000000;i++){;}
		    system("pause");
		    exit(0);
		}
		if((enemy_yb[i]<=position_y1+3)&&(enemy_yb[i]>=position_y1-2)&&(position_x1-1==enemy_xb[i]))
		{
			a[enemy_xb[i]][enemy_yb[i]]=0;
			score-=1;
		}

		if(enemy_x[i]>high)
		{
			a[enemy_x[i]][enemy_y[i]]=0;
			enemy_x[i]=0;
			enemy_y[i]=rand()%(width/number-2)+(width/number-2)*i+3;
			a[enemy_x[i]][enemy_y[i]]=3;
			
			a[enemy_xb[i]][enemy_yb[i]]=0;
			enemy_xb[i]=enemy_x[i]+1;
			enemy_yb[i]=enemy_y[i];
			a[enemy_xb[i]][enemy_yb[i]]=7;
			a[enemy_x2[i]][enemy_y2[i]]=0;
			enemy_x2[i]=enemy_x[i]-1;
			enemy_y2[i]=enemy_y[i]-1;
			a[enemy_x2[i]][enemy_y2[i]]=4;
			//je=je+width/number;
		}
		static int speed=0;
		static int speedb=0;
		if(speed<4)
		speed++;
		if(speed==4){
		a[enemy_x[i]][enemy_y[i]]=0;
		enemy_x[i]++;
		a[enemy_x[i]][enemy_y[i]]=3;
		a[enemy_x2[i]][enemy_y2[i]]=0;
		enemy_x2[i]++;
		a[enemy_x2[i]][enemy_y2[i]]=4;
		speed = 0;
		}
		if(speedb<2)
		speedb++;
		if(speedb==2){
		a[enemy_xb[i]][enemy_yb[i]]=0;
		enemy_xb[i]++;
		a[enemy_xb[i]][enemy_yb[i]]=7;
		speedb = 0;
		}
		
	 }
}
void updateWithInput()     //与用户输入有关的更新 
{
	char input;

	if (_kbhit())   //当按键时被执行 
	{
		input = _getch();

		if (input == 'a')//&&(position_y>2)&&(position_y<=width-1))
		{
			a[position_x1][position_y1]=0;
			a[position_x2][position_y2]=0;
			a[position_x3][position_y3]=0;
			position_y1--;
			position_y2--;
			position_y3--;
			a[position_x1][position_y1]=1;
			a[position_x2][position_y2]=5;
			a[position_x3][position_y3]=6;
		}
		else if (input == 'd')//&&(position_y>=0)&&(position_y<width-1))
		{
			a[position_x1][position_y1]=0;
			a[position_x2][position_y2]=0;
			a[position_x3][position_y3]=0;
			position_y1++;
			position_y2++;
			position_y3++;
			a[position_x1][position_y1]=1;
			a[position_x2][position_y2]=5;
			a[position_x3][position_y3]=6;
		}
		else if (input == 'w')//&&(position_x>1)&&(position_x<=high))
		{
			a[position_x1][position_y1]=0;
			a[position_x2][position_y2]=0;
			a[position_x3][position_y3]=0;
			position_x1--;
			position_x2--;
			position_x3--;
			a[position_x1][position_y1]=1;
			a[position_x2][position_y2]=5;
			a[position_x3][position_y3]=6;
		}
		else if (input == 's')//&&(position_x>=0)&&(position_x<high-2))
		{
			a[position_x1][position_y1]=0;
			a[position_x2][position_y2]=0;
			a[position_x3][position_y3]=0;
			position_x1++;
			position_x2++;
			position_x3++;
			a[position_x1][position_y1]=1;
			a[position_x2][position_y2]=5;
			a[position_x3][position_y3]=6;
		}
		else if (input == ' ')
		{   
			int left,right;
			left=position_y1-bw+1;
			right=position_y1+bw+1;
			if(left<0) left=0;
			if(right>=width) right=width-1;
			for(int q=left;q<=right;q++)
			   a[position_x1-1][q]=2;
		}
		/*enemy_xb=enemy_x+2;
		enemy_yb=enemy_y;*/
	}
	//je=je+width/number;
}
int main()
{
	startup();    //数据初始化 
	while (1)   //游戏循环进行 
	{
		show();    //显示画面 
		updateWithoutInput();   //与用户输入无关的更新 
		updateWithInput();     //与用户输入有关的更新 
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值