C++小游戏—简单飞机大战(1)
前面文章简单实现了弹球操作,这篇文章我们介绍一下如何实现简单的飞机大战操作。这篇文章我们要实现的效果如下:
第一步:整体思路
在某个点画出飞机的形状
获取用户按下哪个按键
根据按键移动飞机的位置
按空格键发射子弹
子弹击中目标,目标消失
1.在任何一个点画出一个飞机的形状
我们借鉴上次课中的弹球小游戏用来做出一个飞机的形状。参考下面代码:
void showBall(int x,int y) { for(int i=0; i<x; i++) printf("\n"); for(int j=0; j<y; j++) printf(" "); printf(" &\n"); for(int j=0; j<y; j++) printf(" "); printf("**#**\n"); for(int j=0; j<y; j++) printf(" "); printf(" * *\n"); }
2.根据用户按键控制飞机移动
#include<cstdio> #include<iostream> #include<conio.h> using namespace std; int x=10; int y=10; //展示小球 void showBall(int x,int y) { for(int i=0; i<x; i++) printf("\n"); for(int j=0; j<y; j++) printf(" "); printf(" &\n"); for(int j=0; j<y; j++) printf(" "); printf("**#**\n"); for(int j=0; j<y; j++) printf(" "); printf(" * *\n"); } int main() { char key; //读取用户输入 while(1){ system("cls"); showBall(x,y); char key = getch(); switch(key){ case 72: //上键 case 'w': case 'W': x--; break; case 80: // 下键 case 's': case 'S': x++; break; case 75: //左键 case 'a': case 'A': y--; break; case 77: //右键 case 'd': case 'D': y++; break; } } return 0; }
效果:
3.按空格键发射子弹
首先可以完成让飞机发射出子弹,我们可以用“|”表示子弹,下面这段代码可以做出发射子弹的效果。
#include<cstdio> #include<iostream> #include<conio.h> using namespace std; int x=10; int y=10; //展示小球 void showBall(int x,int y) { // for(int i=0; i<x; i++) // printf("\n"); // for(int j=0; j<y; j++) // printf(" "); for(int i=0; i<x; i++) { printf("\n"); for(int j=0; j<y; j++) printf(" ") ; printf(" |\n"); } for(int j=0; j<y; j++) printf(" "); printf(" &\n"); for(int j=0; j<y; j++) printf(" "); printf("**#**\n"); for(int j=0; j<y; j++) printf(" "); printf(" * *\n"); } int main() { char key; //读取用户输入 while(1){ system("cls"); showBall(x,y); char key = getch(); switch(key){ case 72: //上键 case 'w': case 'W': x--; break; case 80: // 下键 case 's': case 'S': x++; break; case 75: //左键 case 'a': case 'A': y--; break; case 77: //右键 case 'd': case 'D': y++; break; } } return 0; }
效果:
但是我们还没有做到按空格键发射子弹的效果。大概思路是,如果用户按下空格,就显示子弹轨迹,否则只显示飞机位置。
参考代码:
#include<cstdio> #include<iostream> #include<conio.h> using namespace std; int x=10; int y=10; int isFired=0; //用户按下空格键,用来判断是否显示子弹轨迹 //展示小球 void showBall(int x,int y) { if(isFired==0) { for(int i=0; i<x; i++) printf("\n"); } else { for(int i=0; i<x; i++) { for(int j=0; j<y; j++) printf(" ") ; printf(" |\n"); isFired=0; //移动后子弹不显示 } } for(int j=0; j<y; j++) printf(" "); printf(" &\n"); for(int j=0; j<y; j++) printf(" "); printf("**#**\n"); for(int j=0; j<y; j++) printf(" "); printf(" * *\n"); } int main() { char key; //读取用户输入 while(1) { system("cls"); showBall(x,y); char key = getch(); switch(key) { case 72: //上键 case 'w': case 'W': x--; break; case 80: // 下键 case 's': case 'S': x++; break; case 75: //左键 case 'a': case 'A': y--; break; case 77: //右键 case 'd': case 'D': y++; break; case 32: //空格控制发射子弹 isFired=1; break; } } return 0; }
效果:
4.构造目标,击中目标。
我们需要在上方构造一个目标。然后让子弹击中目标。我们可以先定义一个目标的坐标。然后移动飞机,射中目标,射中目标的逻辑就是子弹的y坐标和目标的y坐标相同。
参考代码:
#include<cstdio> #include<iostream> #include<conio.h> using namespace std; int x=10; int y=10; int isFired=0; //用户按下空格键,用来判断是否显示子弹轨迹 int isKilled=0; //表示目标是否被击中 int nx=0,ny=5; //目标的坐标 //展示小球 void showBall(int x,int y) { if(isKilled==0) //没有击中就显示目标 { for(int i=0;i<ny;i++) printf(" "); printf("X\n"); } if(isFired==0) { for(int i=0; i<x; i++) printf("\n"); } else { for(int i=0; i<x; i++) { for(int j=0; j<y; j++) printf(" ") ; printf(" |\n"); if(y+2==ny) //因为飞机的头空了两个格 isKilled=1; //表示击中 isFired=0; //移动后子弹不显示 } } for(int j=0; j<y; j++) printf(" "); printf(" &\n"); for(int j=0; j<y; j++) printf(" "); printf("**#**\n"); for(int j=0; j<y; j++) printf(" "); printf(" * *\n"); } int main() { char key; //读取用户输入 while(1) { system("cls"); showBall(x,y); char key = getch(); switch(key) { case 72: //上键 case 'w': case 'W': x--; break; case 80: // 下键 case 's': case 'S': x++; break; case 75: //左键 case 'a': case 'A': y--; break; case 77: //右键 case 'd': case 'D': y++; break; case 32: //空格控制发射子弹 isFired=1; break; } } return 0; }
效果:
5.后记
这个程序还存在一些问题,比如子弹轨迹没有实现,目标应该是个随机位置等,我们在下一篇中将会继续优化。