1.目标要求:
1.击中目标,分数加1
2.分数多20【分数梯度】分,难度增加一个等级
3.飞机碰到目标时,游戏结束
2.C语言代码:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define bullets_num 15//同一屏幕可存在的子弹数量
#define aim_num 4//同一屏幕可存在的目标数量
#define level_difference 20 //每等级的【分数梯度】
/*
《飞机大战_模块化》 by:你最珍贵
———————————————————————
|控制信号: | 上 | 下 | 左 | 右 | 开火 | 暂停 |
———————————————————————
| 键盘: | i | k | j | l | 空格 | z |
———————————————————————
1.击中目标,分数加1
2.分数多20【分数梯度】分,难度增加一个等级
3.飞机碰到目标时,游戏结束
*/
int line,column; //显示屏幕行列
int aircraft_x,aircraft_y; //飞机位置
int bullets_x[bullets_num+1]={0};
int bullets_y[bullets_num+1]; //子弹位置,同一屏幕最多可存在bullets_num个子弹{1~bullets_num else0}
int aim_x[aim_num+1]={0};
int aim_y[aim_num+1]; //目标位置,同一屏幕最多可存在aim_num个目标{1~aim_num else0};
int aim_speed_num,aim_speed;//目标下落速度之变量,目标下落速度
int scores;//分数
int IsKnock;//是否被撞
int level;//难度等级
void HideCursor(){ //隐藏光标位置 ,这个函数复制代码就行
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void gotoxy(int x,int y){ //把光标放在(0,0)位置 ,这个函数复制代码就行
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
void startup(){ //数据初始化
int i;
HideCursor(); //隐藏光标功能
line=22,column=78;//可移动屏幕大小
aircraft_x = line/2,aircraft_y = column/2;//飞机初始位置
for(i=1;i<=aim_num;i++){
aim_y[i]=rand()%column+1;//4个目标位置随机取
}
aim_speed=12;//目标下落初始速度,数字越大越慢
//此值与level、之后的速度变化、之后的等级变化代码有关
aim_speed_num=1;//目标下落速度之循环变量初值(循环计数的)
scores=0;//分数
level=1; //难度等级
IsKnock=0; //被撞标记为0
}
void show(){ // 显示画面
int printf_i; //是否输出
int i;
gotoxy(0,0); //刷新页面时鼠标回到(0,0)位置
int x,y; //页面坐标
printf(" 【难度等级:%2d】 游戏\
:《飞机大战》 【分数:%3d】\n",level,scores);
for( x=1;x<=line;x++){ //行坐标循环
printf("\n");
printf(" "); //输出使对称的空格
for( y=1;y<=column;y++){ //列坐标循环
printf_i=0; //输出标记重置为0(未输出状态),1是已输出状态
if( x==aircraft_x && y==aircraft_y){ //判断飞机位置
printf("M");printf_i=1;
}
if( printf_i==0){
for(i=1;i<=bullets_num;i++){ //判断子弹位置
if( x==bullets_x[i] && y==bullets_y[i]){
printf("|");printf_i=1;break;
}
}
}
if( printf_i==0){
for(i=1;i<=aim_num;i++){ //判断目标位置
if( x==aim_x[i] && y==aim_y[i]){
printf("*");printf_i=1;break;
}
}
}
if(printf_i==0){
printf(" "); //都不是的话输出空格
}
}
}
}
void update_outinput(){ //与输入无关的更新
int i,j;
aim_speed_num= (aim_speed_num==aim_speed)?1:aim_speed_num+1;//速度变量循环计数
for(i=1;i<=bullets_num;i++){ //子弹位置更新
bullets_x[i]= (bullets_x[i]==0)? 0:bullets_x[i]-1;
}
for(i=1;i<=aim_num;i++){ //目标位置更新
if(aim_x[i]==line){
aim_x[i]=0;
aim_y[i]=rand()%column+1;
}else{
aim_x[i] += aim_speed_num/aim_speed;//速度值到aim_speed时目标行数+1;
}
}
for(i=1;i<=aim_num;i++){ //判断目标是否被击中
for(j=1;j<=bullets_num;j++){
if(aim_x[i]==bullets_x[j] && aim_y[i]==bullets_y[j]){
scores++;//分数加1
if( scores>0 && scores%level_difference==0){//分数改变了,判断要不要升级
aim_speed= (aim_speed<=3)? 2:aim_speed-3;//速度变化12>9>6>3>2
level= (level==5)? 5:level+1;//等级变化1>2>3>4>5
aim_speed_num=1; // aim_speed速度已改,其相关变量必须重置一下!
}
printf("\a");//输出提示音
bullets_x[j]=0;//子弹归位
aim_x[i]=0;//目标归位
aim_y[i]=rand()%column+1;
break;
}
}
}
for(i=1;i<=aim_num;i++){ //判断飞机是否被目标击中
if(aim_x[i]==aircraft_x && aim_y[i]==aircraft_y){
IsKnock=1;break;
}
}
}
void update_input(){ //与输入有关的更新
int i;
char input;
if(kbhit()){ //kbhit()判断有无输入,有输入为1
//无输入则不运行(不卡在这一步,可往后运行继续刷新页面哦,棒)
input = getch(); //将输入的值存入input
if( input=='j'){
aircraft_y = (aircraft_y==1)? 1:aircraft_y-1;//不能用aircraft_y--形式,传递的是原值不是-1的
}else if( input=='l'){
aircraft_y = (aircraft_y==column)? column:aircraft_y+1;
}else if( input=='i'){
aircraft_x = (aircraft_x==1)? 1:aircraft_x-1;
}else if( input=='k'){
aircraft_x = (aircraft_x==line)? line:aircraft_x+1;
}else if( input=='z'){
system("pause");
}else if( input==' '){
for(i=1;i<=bullets_num;i++){ //找出未用子弹位置
if( bullets_x[i]==0) break;
}
if(i>=1&&i<=bullets_num){ //使用该子弹
bullets_x[i]=aircraft_x-1;
bullets_y[i]=aircraft_y;
}
}
}
}
void show_end(){ //显示失败界面
int i,j;
system("cls");//清屏
for( j=1; j<=8; j++)
putchar('\n');
for( j=1; j<=30; j++)
putchar(' ');
printf("您的分数是:%d\n\n",scores);
printf(" \
GAME OVER!\n");
for( j=1; j<=8; j++)//输出空白行
putchar('\n');
system("pause"); //暂停一次
system("pause"); //暂停一次
system("pause"); //暂停一次
}
int main(){
startup(); //数据初始化
while(!IsKnock){ //游戏循环执行
show(); // 显示画面
update_outinput(); //与输入无关的更新
update_input(); //与输入有关的更新
}
show_end();
return 0;
}
3.运行结果:
小游戏玩法:
《飞机大战_模块化》 by:你最珍贵
——————————————————————————————————————————
|控制信号: | 上 | 下 | 左 | 右 | 开火 | 暂停 |
——————————————————————————————————————————
| 键盘: | i | k | j | l | 空格 | z |
——————————————————————————————————————————
and
and