进阶——飞机游戏

目录

1.代码重构

2.新型子弹

3.静止的敌机

4.敌机移动 

5.击中敌机

6.清屏功能


本节利用函数封装重构飞机游戏,并实现新型子弹,敌机移动,击中敌军和更好的清屏功能

1.代码重构

  第一步利用函数和上面的游戏框架对上一次的飞机游戏进行重构,实现控制飞机移动的功能。另外对输出部分也进行了改进,通过二重循环输出所有的空格,回车等内容,可以进行更复杂的输出。

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

//全程变量
int position_x,position_y;   //飞机位置
int high,width;              //游戏画面尺寸

void startup()        // 数据的初始化 
{
	high = 20;
	width = 30;
	position_x = high/2;
    position_y = width/2;		
 } 
 
 void show()  //显示画面 
 {
 	system("cls");
	int i,j;
	for(i = 0;i<high;i++)
	{
	for(j = 0;j<width;j++)	
    {
     if((i==position_x)&&(j==position_y))
	  printf("*");   //输出飞机 
	  else
	  printf(" ");	//输出空格 
	}	
 	printf("\n");
    }
  } 
  
  void updateWithoutInput()    //与用户输入无关的更新 
  {
   } 
   
  void updateWithInput()       //与用户输入有关的更新 
  {
  	char input;
	if(kbhit())
    {
     input = getch();  
	 if(input == 'a')     //位置左移 
	 position_y--;	
     if(input == 'd')      //位置右移 
 	 position_y++;		
     if(input == 'w')      //位置上移 
	 position_x--;	
     if(input == 's')     //位置下移 
	 position_x++;		
    }	
   } 
  
  int main()
  {
  	startup();     //数据的初始化 
  	while(1)
  	{
  		show();                      //显示画面 
  		void updateWithoutInput();   //与用户输入无关的更新 
  		void updateWithInput();      //与用户输入有关的更新 
	  }
  	return 0; 
   } 

2.新型子弹

  第二步实现常规子弹,初始化子弹为飞机的正上方(bullet_x = position_x-1; bullet_y = position_y;),子弹发射后自动向上移动(bullet_x-1)。

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

//全程变量
int position_x,position_y;   //飞机位置
int bullet_x,bullet_y;       //子弹位置 
int high,width;              //游戏画面尺寸

void startup()        // 数据的初始化 
{
	high = 20;
	width = 30;
	position_x = high/2;
    position_y = width/2;
	bullet_x = 0;
	bullet_y = position_y; 
 } 
 
 void show()  //显示画面 
 {
 	system("cls");
	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 == bullet_x)&&(j == bullet_y))
	  printf("|");   //输出子弹 
	  else
	  printf(" ");	//输出空格 
	 }	
 	printf("\n");
    }
  } 
  
  void updateWithoutInput()    //与用户输入无关的更新 
  {
  	 if(bullet_x>-1) 
  	   bullet_x--; 
   } 
   
  void updateWithInput()       //与用户输入有关的更新 
  {
  	char input;
	if(kbhit())
    {
     input = getch();  
	 if(input == 'a')     //位置左移 
	 position_y--;	
     if(input == 'd')      //位置右移 
 	 position_y++;		
     if(input == 'w')      //位置上移 
	 position_x--;	
     if(input == 's')     //位置下移 
	 position_x++;	
	 if(input == '|')      //发射子弹 
	 {
	 	bullet_x = position_x-1; //发射子弹的初始位置在飞机的正上方
		bullet_y = position_y;  
	 }	
    }	
   } 
  
  int main()
  {
  	startup();     //数据的初始化 
  	while(1)
  	{
  		show();                      //显示画面 
  		void updateWithoutInput();   //与用户输入无关的更新 
  		void updateWithInput();      //与用户输入有关的更新 
	  }
  	return 0; 
   } 

3.静止的敌机

  第三步,增加静止的敌机@,其坐标为(emey_x,emey_y)

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

//全程变量
int position_x,position_y;   //飞机位置
int bullet_x,bullet_y;       //子弹位置 
int enemy_x,enemy_y;         //敌机位置 
int high,width;              //游戏画面尺寸

void startup()        // 数据的初始化 
{
	high = 20;
	width = 30;
	position_x = high/2;
    position_y = width/2;
	bullet_x = -1;
	bullet_y = position_y; 
	enemy_x = 0;
	enemy_y = position_y;
 } 
 
 void show()  //显示画面 
 {
 	system("cls");  //清屏 
	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==enemy_x)&&(j==enemy_y)) 
	  printf("@");   //输出敌机 
	  else if((i == bullet_x)&&(j == bullet_y))
	  printf("|");   //输出子弹 
	  else
	  printf(" ");	//输出空格 
	 }	
 	printf("\n");
    }
  } 
  
  void updateWithoutInput()    //与用户输入无关的更新 
  {
  	 if(bullet_x>-1) 
  	   bullet_x--; 
   } 
   
  void updateWithInput()       //与用户输入有关的更新 
  {
  	char input;
	if(kbhit())
    {
     input = getch();  
	 if(input == 'a')     //位置左移 
	 position_y--;	
     if(input == 'd')      //位置右移 
 	 position_y++;		
     if(input == 'w')      //位置上移 
	 position_x--;	
     if(input == 's')     //位置下移 
	 position_x++;	
	 if(input == '|')      //发射子弹 
	 {
	 	bullet_x = position_x-1; //发射子弹的初始位置在飞机的正上方
		bullet_y = position_y;  
	 }	
    }	
   } 
  
  int main()
  {
  	startup();     //数据的初始化 
  	while(1)
  	{
  		show();                      //显示画面 
  		void updateWithoutInput();   //与用户输入无关的更新 
  		void updateWithInput();      //与用户输入有关的更新 
	  }
  	return 0; 
   } 

4.敌机移动 

  第四步让敌机自动向下移动(enemy_x++;).为了在降低敌机移动速度的同时不影响用户输入响应的频率,代码中引用了一个小技巧,即在updateWithoutInput()函数中利用静态函数speed,每执行10次updateWithoutInput函数敌机才移动一次。

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

//全程变量
int position_x,position_y;   //飞机位置
int bullet_x,bullet_y;       //子弹位置 
int enemy_x,enemy_y;         //敌机位置 
int high,width;              //游戏画面尺寸

void startup()        // 数据的初始化 
{
	high = 20;
	width = 30;
	position_x = high/2;
    position_y = width/2;
	bullet_x = -1;
	bullet_y = position_y; 
	enemy_x = 0;
	enemy_y = position_y;
 } 
 
 void show()  //显示画面 
 {
 	system("cls");  //清屏 
	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==enemy_x)&&(j==enemy_y)) 
	  printf("@");   //输出敌机 
	  else if((i == bullet_x)&&(j == bullet_y))
	  printf("|");   //输出子弹 
	  else
	  printf(" ");	//输出空格 
	 }	
 	printf("\n");
    }
  } 
  
  void updateWithoutInput()    //与用户输入无关的更新 
  {
  	 if(bullet_x>-1) 
  	   bullet_x--; 
  	 //用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
	 //这样修改,虽然用户按键的交互速度还是很快,但NPC的移动显示可以降速
	 static int speed = 0;
	 if(speed<10)
	  speed++;
	 if(speed == 10)
	 {
	 	enemy_x++; 
	 	speed = 0;
	  } 
  	   
   } 
   
  void updateWithInput()       //与用户输入有关的更新 
  {
  	char input;
	if(kbhit())
    {
     input = getch();  
	 if(input == 'a')     //位置左移 
	 position_y--;	
     if(input == 'd')      //位置右移 
 	 position_y++;		
     if(input == 'w')      //位置上移 
	 position_x--;	
     if(input == 's')     //位置下移 
	 position_x++;	
	 if(input == '|')      //发射子弹 
	 {
	 	bullet_x = position_x-1; //发射子弹的初始位置在飞机的正上方
		bullet_y = position_y;  
	 }	
    }	
   } 
  
  int main()
  {
  	startup();     //数据的初始化 
  	while(1)
  	{
  		show();                      //显示画面 
  		void updateWithoutInput();   //与用户输入无关的更新 
  		void updateWithInput();      //与用户输入有关的更新 
	  }
  	return 0; 
   } 

5.击中敌机

  第五步增加判断,当子弹和敌机的位置同时就是击中敌机。增加变量score记录游戏得分,击中敌机后score++。敌机被击中后会先消失,然后重新在随机位置出现,其中rand()函数产生了一个随机整数,rand()%10即产生0—9的一个随机整数。

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

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

void startup()        // 数据的初始化 
{
	high = 20;
	width = 30;
	position_x = high/2;
    position_y = width/2;
	bullet_x = -1;
	bullet_y = position_y; 
	enemy_x = 0;
	enemy_y = position_y;
	score = 0;
 } 
 
 void show()  //显示画面 
 {
 	system("cls");  //清屏 
	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==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--; 
  	 //用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
	 //这样修改,虽然用户按键的交互速度还是很快,但NPC的移动显示可以降速
	 static int speed = 0;
	 if(speed<10)
	  speed++;
	 if(speed == 10)
	 {
	 	enemy_x++; 
	 	speed = 0;
	  } 
  	   
   } 
   
  void updateWithInput()       //与用户输入有关的更新 
  {
  	char input;
	if(kbhit())
    {
     input = getch();  
	 if(input == 'a')     //位置左移 
	 position_y--;	
     if(input == 'd')      //位置右移 
 	 position_y++;		
     if(input == 'w')      //位置上移 
	 position_x--;	
     if(input == 's')     //位置下移 
	 position_x++;	
	 if(input == '|')      //发射子弹 
	 {
	 	bullet_x = position_x-1; //发射子弹的初始位置在飞机的正上方
		bullet_y = position_y;  
	 }	
    }	
   } 
  
  int main()
  {
  	startup();     //数据的初始化 
  	while(1)
  	{
  		show();                      //显示画面 
  		void updateWithoutInput();   //与用户输入无关的更新 
  		void updateWithInput();      //与用户输入有关的更新 
	  }
  	return 0; 
   } 

6.清屏功能

  目前飞机游戏画面的闪烁严重,现在介绍新的清屏方法。利用void gotoxy(int x,int y)函数(#include<window.h>),在show函数中首先调用gotoxy(0,0),光标移动到原点位置,再进行重画,即实现了类似清屏函数的效果。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
//全程变量
int position_x,position_y;   //飞机位置
int bullet_x,bullet_y;       //子弹位置 
int enemy_x,enemy_y;         //敌机位置 
int high,width;             //游戏画面尺寸
int score;

void gotoxy(int x,int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos); 
}

void startup()        // 数据的初始化 
{
	high = 20;
	width = 30;
	position_x = high/2;
    position_y = width/2;
	bullet_x = -1;
	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==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--; 
  	 //用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
	 //这样修改,虽然用户按键的交互速度还是很快,但NPC的移动显示可以降速
	 static int speed = 0;
	 if(speed<10)
	  speed++;
	 if(speed == 10)
	 {
	 	enemy_x++; 
	 	speed = 0;
	  } 
  	   
   } 
   
  void updateWithInput()       //与用户输入有关的更新 
  {
  	char input;
	if(kbhit())
    {
     input = getch();  
	 if(input == 'a')     //位置左移 
	 position_y--;	
     if(input == 'd')      //位置右移 
 	 position_y++;		
     if(input == 'w')      //位置上移 
	 position_x--;	
     if(input == 's')     //位置下移 
	 position_x++;	
	 if(input == '|')      //发射子弹 
	 {
	 	bullet_x = position_x-1; //发射子弹的初始位置在飞机的正上方
		bullet_y = position_y;  
	 }	
    }	
   } 
  
  int main()
  {
  	startup();     //数据的初始化 
  	while(1)
  	{
  		show();                      //显示画面 
  		void updateWithoutInput();   //与用户输入无关的更新 
  		void updateWithInput();      //与用户输入有关的更新 
	  }
  	return 0; 
   } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值