效果图
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。