当前位置:首页 > 趣味小程序 > 正文内容

C++小游戏—简单飞机大战(1)

亿万年的星光4年前 (2021-03-21)趣味小程序2224

前面文章简单实现了弹球操作,这篇文章我们介绍一下如何实现简单的飞机大战操作。这篇文章我们要实现的效果如下:



第一步:整体思路

  • 在某个点画出飞机的形状

  • 获取用户按下哪个按键

  • 根据按键移动飞机的位置

  • 按空格键发射子弹

  • 子弹击中目标,目标消失


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.后记

这个程序还存在一些问题,比如子弹轨迹没有实现,目标应该是个随机位置等,我们在下一篇中将会继续优化。

扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【C++图形化编程】EasyX实现弹跳小球

【C++图形化编程】EasyX实现弹跳小球

前面的文章实现了C++控制台显示一个弹跳的小球,这篇文章使用EasyX实现一个带有界面的弹跳小球的效果。首位,我们需要准备好EasyX。然后让EasyX画一个小的圆。然后我们使用前面学过的判断边界的函...

【C++图形化编程】飞机大战2——运动与碰撞检测

上一篇中,简单实现了飞机大战的基本框架,这篇文章继续完善,使其可以进行游戏。#include <graphics.h> #include <conio.h>...

【C++图形化编程】EasyX函数~文字输出相关函数

文字输出相关函数:函数或数据类型描述gettextcolor获取当前文字颜色gettextstyle获取当前字体颜色LOGFONT保存字体样式的结构体outterxtxy指定位置输出字符串drawte...

【算法】前缀和与差分(1)一维数组前缀和

【算法】前缀和与差分(1)一维数组前缀和

一、定义前缀和:是指某序列的前n项和。可以理解成数学上上的数列的前n项和。差分:是前缀和的逆运算。二、前缀和的分类可以分成一维数组的前缀和和二维 数组的前缀和一维数组前缀和  &n...

C++小游戏—弹跳小球

C++小游戏—弹跳小球

首先,要注意屏幕直角坐标系的问题,不然的话,后面移动过程中一定会出错。然后,利用printf函数在屏幕坐标(x,y)处显示一个静止的小球字符‘O’,注意屏幕坐标系的原点在左上方,参考代码#includ...

【C++图形化编程】C++图形库的引入

【C++图形化编程】C++图形库的引入

0.前言前面的文章用C++的控制台完成了小游戏,但是我们平常玩的游戏都是有图形化界面,我们从这篇文章开始就引入一个C++图形库—EasyX。C++的图形库有很多,EasyX是最适合上手的图形库。1.简...