C语言实现飞机大战游戏Demo

效果图

在这里插入图片描述
O表示玩家,W表示敌机

源代码

//Control.h文件
#ifndef Console_h
#define Console_h

//光标跳转到指定位置 
void gotoxy(int x, int y) 
{
    COORD pos = {y,x};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
    SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
//隐藏光标 
void HideCursor()
{
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cci;
	GetConsoleCursorInfo(hOut, &cci);
	cci.bVisible = FALSE;
	SetConsoleCursorInfo(hOut, &cci);
}

#endif 

//plane.c文件
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#include"Console.h"
/*常量定义*/ 
//上边界 
#define UP 		0
//下边界 
#define DOWN 	15
//左边界 
#define LEFT 	0
//右边界 
#define RIGHT	20
//飞机代号 
#define PLANE	'O'
//敌机
#define ENEMY	'W' 
//子弹代号 
#define BULLET 	'*'
//墙壁 
#define WALL	'#'
//规定用时 
#define TIME	20

/*结构体建立*/
//飞机结构 
typedef struct plane
{
	//横坐标 
	int x;
	//纵坐标 
	int y; 
}Plane;

//子弹结构
typedef struct bullet
{
	//横坐标 
	int x;
	//纵坐标 
	int y;	
}Bullet; 

/*全局变量*/
//飞机 
Plane plane;
//敌方飞机
Plane enemy; 
//子弹 
Bullet bullet;
//得分
int score; 
//是否继续游戏 
int proceed;
//生命 
int life;
//计时器
clock_t tstart,tend; 

/*控制函数*/ 
//初始化函数 
void StartUp();
//打印地图函数
void PrintMap();
//与用户操作无关的更新
void UpdateWithoutPlayer();
//与用户操作有关的更新
void UpdateWithPlayer(); 
 
int main()
{
	StartUp();
	while(proceed)
	{
		PrintMap();
		UpdateWithoutPlayer();
		UpdateWithPlayer();
	}
	return 0;
}

//初始化函数 
void StartUp()
{
	//我方飞机出现在屏幕中下方 
	plane.x=DOWN-1;
	plane.y=RIGHT/2;
	//敌方飞机出现在屏幕上方任意位置
	enemy.x=UP+1;
	enemy.y=rand()%(RIGHT-LEFT)+1; 
	//子弹初始位置 
	bullet.x=0; 
	//一直游戏 
	proceed=1;
	//初始化生命为3
	life=3; 
	//计时开始 
	tstart=clock(); 
} 

//打印地图函数
void PrintMap()
{
	gotoxy(UP,LEFT);
	int i,j;
	for(i=UP;i<=DOWN;i++)
	{
		for(j=LEFT;j<=RIGHT;j++)
		{
			if(i==UP||i==DOWN||j==LEFT||j==RIGHT)
			{
				printf("%c",WALL);
			}
			else if(i==plane.x&&j==plane.y)
			{
				printf("%c",PLANE);
			}
			else if(i==bullet.x&&j==bullet.y)
			{
				printf("%c",BULLET);
			}
			else if(i==enemy.x&&j==enemy.y)
			{
				printf("%c",ENEMY);
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}	
	printf("得分:%d\t生命:%d\t剩余时间:%2d\n",score,life,(int)(TIME-(tend-tstart)/CLK_TCK));
	HideCursor();
}

//与用户操作无关的更新
void UpdateWithoutPlayer()
{
	//子弹自动向上飞行 
	if(bullet.x>UP)
	{
		bullet.x--;	
		if(bullet.x==enemy.x&&bullet.y==enemy.y)
		{
			score++;
			enemy.x=DOWN;
			bullet.x=UP;
		}
	}	
	//敌机自动下落
	if(enemy.x<DOWN)
	{
		enemy.x++;	
		if(bullet.x==enemy.x&&bullet.y==enemy.y)
		{
			score++;
			enemy.x=DOWN;
			bullet.x=UP;
		}
		else if(enemy.x==plane.x&&enemy.y==plane.y)
		{
			life--;
			score++;
			if(life<=0)
			{
				proceed=0;
			}
		}
	} 
	else
	{
		enemy.x=UP+1;
		enemy.y=rand()%(RIGHT-LEFT);
	}
	//判断是否超时 
	tend=clock();
	if((tend-tstart)/CLK_TCK>=TIME)
	{
		proceed=0;
	}
}

//与用户操作有关的更新
void UpdateWithPlayer()
{
	char ch;
	if(kbhit())
	{
		ch=getch();
		switch(ch)
		{
			case ' ':
				//发射子弹 
				if(bullet.x==UP)
				{
					bullet.x=plane.x-1;
					bullet.y=plane.y;
				}
				break;
			case 'q':
			case 'Q':
				proceed=0;
				break;
			case 'a':
			case 'A':
				if(plane.y>LEFT+1)
				{
					plane.y--;
				}
				break;
			case 'd':
			case 'D':
				if(plane.y<RIGHT-1)
				{
					plane.y++;
				}
				break;
			case 'w':
			case 'W':
				if(plane.x>UP+1)
				{
					plane.x--;
				}
				break;
			case 's':
			case 'S':
				if(plane.x<DOWN-1)
				{
					plane.x++;
				}
				break;
			default:
				break;
		}
	}
} 

ReadMe

本程序设计时分了两文件,一个是Control.h,主要用来设计光标的控制函数,一个是执行程序文件plane.c。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值