飞机大战(wsad上下左右,空格发射子弹,击中敌机加一分,分数达到10,20,30难度增加,敌机飞出显示屏幕游戏失败)

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>

//全局变量
int position_x,position_y;              //飞机位置
int bullet_x,bullet_y;                  //子弹位置
int enemy_x,enemy_y;                    //敌机位置
int high,width;                         //游戏画面尺寸
int score;                              //得分
int speed = 0;                          


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()
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void startup()                          //数据初始化
{
	high = 20;
	width = 30;
	position_x = high/2;
	position_y = width/2;
	bullet_x = -2;
	bullet_y = position_y;
	enemy_x = 0;
	enemy_y = position_y;
	score = 0;
 } 
 
 void show()                             //显示画面
 {
 	gotoxy(0,0);                         //重画清屏 
 	int i,j;
 	for(i=0;i<high;i++)
 	{
 		for(j=0;j<width;j++)
 		{
 			if((i==position_x)&&(j==position_y))
 			printf("*");                 
 			else if((i==position_x+1)&&(j>=position_y-2)&&(j<=position_y+2))
 			printf("*");
 			else if((i==position_x+2)&&(j==position_y-1))
 			printf("*");
 			else if((i==position_x+2)&&(j==position_y+1))
 			printf("*");
			 else if((i==enemy_x)&&(j==enemy_y))
			 printf("@");                //输出敌机
			 else if((i==bullet_x)&&(j==bullet_y))
			 printf("|");                //输出子弹
			 else
			 printf(" ");                //输出空格 
		 }
		 printf("\n");
	 }
	 printf("得分:%d\n",score);
  } 
  
  void updateWithoutInput()              //与用户输入无关的更新
  {
  	if(bullet_x>-1)                      //子弹向上移动 
  	bullet_x--;
  	if((bullet_x==enemy_x)&&(bullet_y==enemy_y))
  	{
  		speed = 0;
  		score++;                         //分数加一
		enemy_x = -1;                    //产生新飞机
		enemy_y = rand()%width;
		bullet_x = -2;                   //子弹消失 
	  }
	  if(enemy_x>high)                   //敌机跑出显示屏幕 
	  {
          printf("游戏失败!\n");
          system("pause");
	  }
	  
	  //通过静态局部变量或者全局变量达到每几次循环敌机才会移动一次
	  //从而降低敌机移动速度改变游戏难度
	  static int k = 100;                             //根据分数控制难度 
	  if(score==10)
          k = 30;
	  else if(score==20)
	      k = 20;
	  else if(score==30)
	      k = 10;
	  if(speed<k)
	  speed++;
	  if(speed==k)
	  {
	  	enemy_x++;                        //敌机下移 
	  	speed = 0;                          
	   } 
   } 
   
   void updateWithInput()                 //与用户有关的更新
   {
   	char input;
   	if(kbhit())                        //判断是否有输入
	   {
	   	input = getch();                  //根据用户输入不同来移动且无需回车
		if(input=='a'&&position_y>0)
		position_y--;                     //左移
		if(input=='d'&&position_y<width-1)
		position_y++;                     //右移
		if(input=='w'&&position_x>0)
		position_x--;                     //上移
		if(input=='s'&&position_x<high-3)
		position_x++;                     //下移
		if(input==' ')                    //发射子弹
		{
			bullet_x = position_x-1;
			bullet_y = position_y;
		 } 
		} 
	} 
	int main()
	{   
	    HideCursor();                      //隐藏光标 
	    srand(time(0));                    //随机数种子 
		startup();                         //数据初始化
		while(1)                      //游戏循环执行
		{
			show();                        //显示画面
			updateWithoutInput();          //与用户无关更新
			updateWithInput();             //与用户有关更新 
		 } 
		 return 0;
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值