1.目标要求:
1.可以控制飞机上下左右移动和发射子弹
2.有计分,射中靶子分数加一
3.有子弹数,子弹数为0时结束游戏
2.C语言代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
/*
《飞机大战》 by:你最珍贵
——————————————————————————————————————
|控制信号: | 上 | 下 | 左 | 右 | 开火 |
——————————————————————————————————————
| 键盘: | i | k | j | l | 空格 |
——————————————————————————————————————
1.最初10颗子弹
2.开火:子弹-1;
3.击中:分数+1;子弹+3;
4.子弹:超过2秒未被击中,子弹会更新位置
5.子弹=0时,游戏结束
*/
int main(){
int Line=8,Column=20,aim_pt = rand()%70+5; //设定默认值:行=8;列=20;靶子位置随机取
int i,j; //i;j;
char contr; //控制信号
int isFired=0,aim=1,cnt=0,bullets=10,time_i=1; // 是否开火;靶子状态:aim=0显示满天星aim=1显示靶子;
//计分器;时间标记,为1重新计时间起始值
time_t time_begin,time_end; //时间开始终止变量 ,time_t是时间的单位long型
double time_cost; //时间差,如果>固定值则更新靶子位置
while( bullets>0 ){ //子弹数>0时,保持程序一直循环
system("cls"); //清屏,每更新一次屏幕,清除上一次屏幕
time(&time_end); //时刻计算时间终止值
time_cost = difftime(time_end,time_begin); //计算时间差(靶子位置不动的时间差)
if( aim==1 && Column+2==aim_pt+2 && isFired==1){ //【如果击中】(靶子显示状态+位置对+且开火)
//aim不显示靶子+更新靶子位置+重新计时+计分器加1+子弹加3
aim = 0; //击中的话下一状态输出满天星,不输出靶子
aim_pt = rand()%70+5; //靶子位置取随机,随机数为整数,取余70再加5,随机数范围就是(5,75)
time_i=1; //重新计时
cnt++; //计分器加一
bullets+=3; //子弹+3
} else if( time_cost>2 ){ //【如果没击中】&&时间长
//更新靶子位置+重新计时
aim_pt = rand()%70+5; //靶子位置取随机
time_i=1; //重新计时
}
//下面【输出飞机前页面信息】
printf("【子弹数:%3d】 游戏\
:《飞机大战》 【分数:%3d】\n",bullets,cnt);
printf("———————————————————————————\
————————————\n");
if( aim==0 ){ //【aim=0时】,显示满天星 ,下一状态aim置为1显示靶子
printf("**********************************子弹数+3\
*************************************\n");
printf("\a");//击中提示声音
aim++;
}else if( aim!=0 ){ //【aim为1时】,显示靶子
for( j=1; j<=aim_pt; j++)//输出靶子前包含位置信息的的空格
putchar(' ');
printf(" *\n");//输出靶子
if( time_i ==1){ //time_i=1即重新计时,重新取时间起始值,为使起始值固定time_i再置为0,保证起始值不变
time(&time_begin);
time_i=0;
}
}
if( isFired==1 ){ //如果开火信号为1,在飞机上方【输出子弹图案】
for( i=1; i<=Line; i++){ //输出飞机上方带子弹的行数
for( j=1; j<=Column; j++){ //输出每行内容前相同的空格
putchar(' ');
}
printf(" |\n"); //输出空格后的子弹形状
}
isFired = 0; //开火信号不可一直维持,每一次开火之后开火信号被设为0
} else if( isFired==0 ){ //如果开火信号为0飞机上方只输出空白图案
for( i=1; i<=Line; i++){ //输出飞机上方空的行数
putchar('\n');
}
}
//输出【飞机图案】
for( i=1; i<=Column; i++){ //输出飞机图像第一行内容前相同的空格
putchar(' ');
}
printf(" *\n"); //输出飞机图像第一行内容
for( i=1; i<=Column; i++){ //输出飞机图像第二行内容前相同的空格
putchar(' ');
}
printf("*****\n"); //输出飞机图像第二行内容
for( i=1; i<=Column; i++){ //输出飞机图像第三行内容前相同的空格
putchar(' ');
}
printf(" * *\n"); //输出飞机图像第三行内容
//判断【输入信号】
if( contr = getch() ){ //如果有输入则改变相应的变量值,控制飞机 。无输入则维持原先位置
//获得输入的控制字符,getch()不回车即可接受
if( contr=='j'){ //输入j向左移动 ,遇边界不动
Column = (Column==0)? 0:Column-1;
}else if( contr=='l'){ //输入l向右移动 ,遇边界不动
Column = (Column==73)? 73:Column+1;
}else if( contr=='i'){ //输入i向上移动 ,遇边界不动
Line = (Line==0)? 0:Line-1;
}else if( contr=='k'){ //输入k向下移动 ,遇边界不动
Line = (Line==18)? 18:Line+1;
}else if( contr==' '){ //输入为空格,开火信号为1
isFired = 1;
bullets--;
}
}
}
//输出失败页面
system("cls"); //清屏
for( j=1; j<=8; j++)
putchar('\n');
for( j=1; j<=30; j++)
putchar(' ');
printf("GAME OVER!\n");
for( j=1; j<=8; j++)//输出空白行
putchar('\n');
system("pause"); //暂停一次
system("pause"); //暂停一次
return 0;
}
3.运行结果:
小游戏玩法:
《飞机大战》 by:你最珍贵
——————————————————————————————————————————————————————————————————
| 控制信号:| 上 | 下 | 左 | 右 | 开火 |
——————————————————————————————————————————————————————————————————
| 键盘:| i | k | j | l | 空格 |
——————————————————————————————————————————————————————————————————
VS
——————不发射子弹时———————————发射子弹时——————
VS
——————子弹击中时—————————————游戏结束时——————