C语言飞机大战简易版(包含两种界面)

以下两种代码均适用于初学者:

先上第一种粗糙的代码,讲解都在代码中了。

#include<stdio.h> 
#include<stdlib.h>
#include<conio.h>
//定义全局变量
int position_x,position_y ;//飞机所在的初始位置 
int zidan_x,zidan_y;//子弹所在位置
int diji_x,diji_y;//敌机所在位置
int high,wide;//画面大小
int score;//得分
 
 void chushi(){//数据初始化 
 	high=20;
 	wide=30;
 	position_x=10;
 	position_y=15;
 	zidan_x=-2;//子弹开始时失效 
 	zidan_y=15;
 	diji_x=0;//开始时敌机的位置可以自定义 
 	diji_y=15;
 	score=0;
 }
 
 void show(){//显示画面 
 	system("cls");
 	int i,j;
 	for(i=0;i<high;i++){
 		for(j=0;j<wide;j++){
 			if(i==position_x&&j==position_y)
			 printf("*");//飞机显示 
			 else if(i==diji_x&&j==diji_y)
			 printf("o");//敌机显示 
			 else if(i==zidan_x&&j==zidan_y)
			 	printf("|");//子弹显示
			else
			printf(" ");	  
		 }
		 printf("\n");//换行 
	 }
	 printf("得分为:%d",score);
 }
 
 void x1(){
 	if(zidan_x>-1)
	 zidan_x--;//子弹飞行 
	 if(zidan_x==diji_x&&zidan_y==diji_y){//击中敌机 
	 	score++;
	 	diji_x=-1;//敌机消失,至于为什么等于-1后面会讲 
	 	diji_y=rand()%wide;//生成新的位置
		 zidan_x=-2;//子弹失效 
	 }
 	if(diji_x>high) {
 		diji_x=-1;
 		diji_y=rand()%wide;//敌机飞出界面了重新生成 
	 }
	 static int speed=0;
	 if(speed<10){
	 	speed++;
	 }
	 if(speed==10){
	 	speed=0;
	 	diji_x++;//每过10次循环,敌机才往下移动一次,不然刷新会太快 
	 }
 }
 
 void x2(){//开始输入 
 	char shuru;
 	if(kbhit()){
 		shuru=getch();
 		if(shuru=='a')
		 position_y--;
		 if(shuru=='d')
		 position_y++;
		 if(shuru=='w')
		 position_x--;
		 if(shuru=='s')
		 position_x++;//控制飞机移动 
		 if(shuru==' '){
		 	zidan_x=position_x-1;//子弹应该从飞机上面那一行射出 
		 	zidan_y=position_y;
		 }
	 }
 }
 int main(){//整合函数 
 	chushi();
 	while(1){
 	show();
	 x1();
	 x2();	
	 }
 } 
 
 

这里我们运行后会发现光标乱闪和频闪严重的问题,但是不影响程序运行,不追求界面上面这个就可以了 。

下面的是界面优化后的效果:

#include<stdio.h> 
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
//定义全局变量
int position_x,position_y ;//飞机所在的初始位置 
int zidan_x,zidan_y;//子弹所在位置
int diji_x,diji_y;//敌机所在位置
int high,wide;//画面大小
int score;//得分
 
 void chushi(){//数据初始化 
 	high=20;
 	wide=30;
 	position_x=high/2;
 	position_y=wide/2;
 	zidan_x=-2;//子弹开始时失效 
 	zidan_y=15;
 	diji_x=0;//开始时敌机的位置可以自定义 
 	diji_y=position_y;
 	score=0;
 }
 
 void gotxy(int x,int y){//解决频闪问题 
 	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 	COORD pos;
 	pos.X=x;
 	pos.Y=y;
 	SetConsoleCursorPosition(handle,pos);
 }
 void yincang(){//隐藏光标 
 	CONSOLE_CURSOR_INFO cursor_info={1,0};
 	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
 }
 
 void show(){//显示画面 
 	gotxy(0,0);
 	int i,j;
 	for(i=0;i<high;i++){
 		for(j=0;j<wide;j++){
 			if(i==position_x&&j==position_y)
			 printf("*");//飞机显示 
			 else if(i==diji_x&&j==diji_y)
			 printf("o");//敌机显示 
			 else if(i==zidan_x&&j==zidan_y)
			 	printf("|");//子弹显示
			else
			printf(" ");	  
		 }
		 printf("\n");//换行 
	 }
	 printf("得分为:%d",score);
 }
 
 void x1(){
 	if(zidan_x>-1)
	 zidan_x--;//子弹飞行 
	 if(zidan_x==diji_x&&zidan_y==diji_y){//击中敌机 
	 	score++;
	 	diji_x=-1;//敌机消失,至于为什么等于-1后面会讲 
	 	diji_y=rand()%wide;//生成新的位置
		 zidan_x=-2;//子弹失效 
	 }
 	if(diji_x>high) {
 		diji_x=-1;
 		diji_y=rand()%wide;//敌机飞出界面了重新生成 
	 }
	 static int speed=0;
	 if(speed<10){
	 	speed++;
	 }
	 if(speed==10){
	 	speed=0;
	 	diji_x++;//每过10次循环,敌机才往下移动一次,不然刷新会太快 
	 }
 }
 
 void x2(){//开始输入 
 	char shuru;
 	if(kbhit()){
 		shuru=getch();
 		if(shuru=='a')
		 position_y--;
		 if(shuru=='d')
		 position_y++;
		 if(shuru=='w')
		 position_x--;
		 if(shuru=='s')
		 position_x++;//控制飞机移动 
		 if(shuru==' '){
		 	zidan_x=position_x-1;//子弹应该从飞机上面那一行射出 
		 	zidan_y=position_y;
		 }
	 }
 }
 int main(){//整合函数 
 	chushi();
 	yincang();
 	while(1){
 	show();
	 x1();
	 x2();	
	 }
 } 
 

这里面主要加了两段函数:

 void gotxy(int x,int y){//解决频闪问题 
 	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 	COORD pos;
 	pos.X=x;
 	pos.Y=y;
 	SetConsoleCursorPosition(handle,pos);
 }
void yincang(){//隐藏光标 
 	CONSOLE_CURSOR_INFO cursor_info={1,0};
 	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
 }

但这里需要注意的是如果打印复杂的飞机图案就不能直接改动了,光标的移动会导致画面出现重复,建议用 system(“cls”)来清屏。

其他的地方就请发挥想象力,修改弹道或者飞机图案等等。

希望能给你们带来帮助!!!!

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值