利用数组,我们可以在空战游戏中实现多台敌机、发射闪弹等效果。大家可以用之前教程的思路,尝试分步骤实现:飞机的显示、单个敌机、多个敌机、发射常规子弹、发射闪弹,以下是完整的代码。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define High 15  // 游戏画面尺寸
#define Width 25
#define EnemyNum 5 // 敌机个数

// 全局变量
int position_x,position_y; // 飞机位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];  // 敌机位置
int canvas[High][Width] = {0}; // 二维数组存储游戏画布中对应的元素
                        // 0为空格,1为飞机*,2为子弹|,3为敌机@
int score; // 得分
int BulletWidth; // 子弹宽度
int EnemyMoveSpeed; // 敌机移动速度

void gotoxy(int x,int y)  //光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{position_x = High-1;position_y = Width/2;canvas[position_x][position_y] = 1;    int k;for (k=0;k<EnemyNum;k++){enemy_x[k] = rand()%2;enemy_y[k] = rand()%Width;canvas[enemy_x[k]][enemy_y[k]] = 3;}score = 0;BulletWidth = 0;EnemyMoveSpeed = 20;
}void show()  // 显示画面
{gotoxy(0,0);  // 光标移动到原点位置,以下重画清屏
    int i,j;for (i=0;i<High;i++){for (j=0;j<Width;j++){if (canvas[i][j]==0)printf(" ");   //   输出空格
            else if (canvas[i][j]==1)printf("*");   //   输出飞机*
            else if (canvas[i][j]==2)printf("|");   //   输出子弹|
            else if (canvas[i][j]==3)printf("@");   //  输出飞机@
        }printf("\n");}printf("得分:%d\n",score);Sleep(20);
}   void updateWithoutInput()  // 与用户输入无关的更新
{int i,j,k;for (i=0;i<High;i++){for (j=0;j<Width;j++){if (canvas[i][j]==2) {for (k=0;k<EnemyNum;k++){if ((i==enemy_x[k]) && (j==enemy_y[k]))  // 子弹击中敌机
                    {score++;                // 分数加1
                        if (score%5==0 && EnemyMoveSpeed>3)   // 达到一定积分后,敌机变快
                            EnemyMoveSpeed--;if (score%5==0)   // 达到一定积分后,子弹变厉害
                            BulletWidth++;canvas[enemy_x[k]][enemy_y[k]] = 0;enemy_x[k] = rand()%2;           // 产生新的飞机
                        enemy_y[k] = rand()%Width;canvas[enemy_x[k]][enemy_y[k]] = 3;canvas[i][j] = 0;      // 子弹消失
                    }}// 子弹向上移动
                canvas[i][j] = 0;if (i>0)canvas[i-1][j] = 2;}}}static int speed = 0;  if (speed<EnemyMoveSpeed)speed++;for (k=0;k<EnemyNum;k++){if ((position_x==enemy_x[k]) && (position_y==enemy_y[k]))  // 敌机撞到我机
        {printf("失败!\n");Sleep(3000);system("pause");exit(0);}if (enemy_x[k]>High)   // 敌机跑出显示屏幕
        {canvas[enemy_x[k]][enemy_y[k]] = 0;enemy_x[k] = rand()%2;           // 产生新的飞机
            enemy_y[k] = rand()%Width;canvas[enemy_x[k]][enemy_y[k]] = 3;score--;  // 减分
        }if (speed == EnemyMoveSpeed){// 敌机下落
            for (k=0;k<EnemyNum;k++){canvas[enemy_x[k]][enemy_y[k]] = 0;enemy_x[k]++;          speed = 0;canvas[enemy_x[k]][enemy_y[k]] = 3;}}}
}void updateWithInput()  // 与用户输入有关的更新
{char input;if(kbhit())  // 判断是否有输入
    {input = getch();  // 根据用户的不同输入来移动,不必输入回车
        if (input == 'a' && position_y>0) {canvas[position_x][position_y] = 0;position_y--;  // 位置左移
            canvas[position_x][position_y] = 1;}else if (input == 'd' && position_y<Width-1){canvas[position_x][position_y] = 0;position_y++;  // 位置右移
            canvas[position_x][position_y] = 1;}else if (input == 'w'){canvas[position_x][position_y] = 0;position_x--;  // 位置上移
            canvas[position_x][position_y] = 1;}else if (input == 's'){canvas[position_x][position_y] = 0;position_x++;  // 位置下移
            canvas[position_x][position_y] = 1;}else if (input == ' ')  // 发射子弹
        {int left = position_y-BulletWidth;int right = position_y+BulletWidth;if (left<0)left = 0;if (right>Width-1)right = Width-1;int k;for (k=left;k<=right;k++) // 发射闪弹
                canvas[position_x-1][k] = 2; // 发射子弹的初始位置在飞机的正上方
        }       }
}int main()
{startup();  // 数据初始化
    while (1)  // 游戏循环执行
    {show();  // 显示画面
        updateWithoutInput();  // 与用户输入无关的更新
        updateWithInput();  // 与用户输入有关的更新
    }return 0;
}

这个代码快200行了,大家吃透这个代码,相信对C语言的基本语法和逻辑结构都有了较好的掌握。

思考题:尝试让敌机也发射子弹,增加形状血量不一样的敌机boss。

下一个教程,学习EasyX图形交互功能----flappy bird源代码:知乎专栏

做游戏,学编程(C语言) 6 数组之空战游戏相关推荐

  1. 教孩子学编程 python语言版_教孩子学编程 PYTHON语言版 PDF_IT教程网

    资源名称:教孩子学编程 PYTHON语言版 PDF 资源目录: 第1章Python基础--认识环境1 1.1认识Python3 1.2用Python编写程序5 1.3运行Python程序5 1.4本章 ...

  2. python教孩子学编程,教孩子学编程(Python语言版)

    教孩子学编程(Python语言版) 第1 章 Python 基础:认识环境 #NiceHexSpiral.py #运行后,挺奇特,整个作画过程,完全呈现. import turtle colors=[ ...

  3. 但凡原神有二十树脂,我也不会来学编程(c语言)

    但凡原神有二十树脂,我也不会来学编程(c语言)<第一天> 编程小白一只,从今天开始,将在本专栏记录本人学习编程的过程与心得~来自甘肃,普通双非,由于地域影响,想要在计算机方面得到好的出路, ...

  4. c语言easyx输出文字_做游戏,学编程(C语言) 6 数组之空战游戏

    利用数组,我们可以在空战游戏中实现多台敌机.发射闪弹等效果.大家可以用之前教程的思路,尝试分步骤实现:飞机的显示.单个敌机.多个敌机.发射常规子弹.发射闪弹,以下是完整的代码. #include &l ...

  5. 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  6. python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  7. 优的python少儿编程课_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  8. 学编程c语言高考能加分吗,学好编程,中高考都能加分,还能保送清华北大!...

    原标题:学好编程,中高考都能加分,还能保送清华北大! 前段时间,我跟一位母亲聊起现在的中考.高考,她大是不以为然,为什么?这位母亲跟我诉苦,说她家老大上半年备战中考,每天都早起晚睡地复习,全家都跟着一 ...

  9. 做软件学c易语言可以吗,怎么样做一个易语言程序:

    呵呵,楼主和我当初一样的迷惑. 我当初啃C语言的时候,也是想用C语言做界面出来,走了很多冤枉路,这里希望能给楼主一些提示. 如果你想用"纯"C来做界面的话,那么我会很肯定的告诉你, ...

最新文章

  1. 微信支付:“当前页面的URL未注册”
  2. mobilenet精髓全力解析,全力迁移到别的网络
  3. OVS datapath结构图(四十六)
  4. oracle 日期加3个月,三个日期函数(十分有用)!!!!!!!!
  5. SAP Spartacus 4.0 版本因为 hamburger 依赖导致构建出错的问题
  6. ffmpeg检测文件是否损坏_教你一招如何检测硬盘,让你知道硬盘是否有损坏?还有几天寿命?...
  7. 《一天聊一个设计模式》 单例
  8. Typora用法教程小结
  9. android编译时注解,Android编译时注解框架系列2-Run Demo
  10. 四、Mysql安装多实例
  11. 【jquery】fancybox 是一款优秀的 jquery 弹出层展示插件
  12. 【JavaScript 插件】实现图片倒影效果 - reflex.js
  13. 如何对一个变量数据进行正则判定_数值数据与数值数据的分析
  14. linux分区整数计算器,整数G分区计算工具
  15. 51单片机的室内环境监测系统,MQ-2烟雾传感器和DHT11温湿度传感器,原理图,C编程和仿真
  16. APR学习-消息池的设计与使用
  17. google三大论文之--MapReduce:超大机群上的简单数据处理
  18. 《MLB棒球创造营》:走近棒球运动·亚利桑那响尾蛇队
  19. 【玖哥乱弹】祭天时不同程序员的不同杀法
  20. android 十六进制加密,使用十六进制十进制值的Android加密和解密?

热门文章

  1. Python Cookbook by Eric
  2. 机器学习——One-Hot编码
  3. 机器学习 Machine Learning中正则化的学习笔记~
  4. Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable
  5. JS中var与function
  6. Java中ArrayList、Integer[]和int[]的相互转换
  7. 内存读写函数实现进程间通信
  8. php文件下载IE文件名乱码问题
  9. 【热门技术】三种SEO方式
  10. 【探路者】第六周立会报告5(总第38次)