做游戏,学编程(C语言) 6 数组之空战游戏
利用数组,我们可以在空战游戏中实现多台敌机、发射闪弹等效果。大家可以用之前教程的思路,尝试分步骤实现:飞机的显示、单个敌机、多个敌机、发射常规子弹、发射闪弹,以下是完整的代码。
#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 数组之空战游戏相关推荐
- 教孩子学编程 python语言版_教孩子学编程 PYTHON语言版 PDF_IT教程网
资源名称:教孩子学编程 PYTHON语言版 PDF 资源目录: 第1章Python基础--认识环境1 1.1认识Python3 1.2用Python编写程序5 1.3运行Python程序5 1.4本章 ...
- python教孩子学编程,教孩子学编程(Python语言版)
教孩子学编程(Python语言版) 第1 章 Python 基础:认识环境 #NiceHexSpiral.py #运行后,挺奇特,整个作画过程,完全呈现. import turtle colors=[ ...
- 但凡原神有二十树脂,我也不会来学编程(c语言)
但凡原神有二十树脂,我也不会来学编程(c语言)<第一天> 编程小白一只,从今天开始,将在本专栏记录本人学习编程的过程与心得~来自甘肃,普通双非,由于地域影响,想要在计算机方面得到好的出路, ...
- c语言easyx输出文字_做游戏,学编程(C语言) 6 数组之空战游戏
利用数组,我们可以在空战游戏中实现多台敌机.发射闪弹等效果.大家可以用之前教程的思路,尝试分步骤实现:飞机的显示.单个敌机.多个敌机.发射常规子弹.发射闪弹,以下是完整的代码. #include &l ...
- 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- 优的python少儿编程课_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- 学编程c语言高考能加分吗,学好编程,中高考都能加分,还能保送清华北大!...
原标题:学好编程,中高考都能加分,还能保送清华北大! 前段时间,我跟一位母亲聊起现在的中考.高考,她大是不以为然,为什么?这位母亲跟我诉苦,说她家老大上半年备战中考,每天都早起晚睡地复习,全家都跟着一 ...
- 做软件学c易语言可以吗,怎么样做一个易语言程序:
呵呵,楼主和我当初一样的迷惑. 我当初啃C语言的时候,也是想用C语言做界面出来,走了很多冤枉路,这里希望能给楼主一些提示. 如果你想用"纯"C来做界面的话,那么我会很肯定的告诉你, ...
最新文章
- 微信支付:“当前页面的URL未注册”
- mobilenet精髓全力解析,全力迁移到别的网络
- OVS datapath结构图(四十六)
- oracle 日期加3个月,三个日期函数(十分有用)!!!!!!!!
- SAP Spartacus 4.0 版本因为 hamburger 依赖导致构建出错的问题
- ffmpeg检测文件是否损坏_教你一招如何检测硬盘,让你知道硬盘是否有损坏?还有几天寿命?...
- 《一天聊一个设计模式》 单例
- Typora用法教程小结
- android编译时注解,Android编译时注解框架系列2-Run Demo
- 四、Mysql安装多实例
- 【jquery】fancybox 是一款优秀的 jquery 弹出层展示插件
- 【JavaScript 插件】实现图片倒影效果 - reflex.js
- 如何对一个变量数据进行正则判定_数值数据与数值数据的分析
- linux分区整数计算器,整数G分区计算工具
- 51单片机的室内环境监测系统,MQ-2烟雾传感器和DHT11温湿度传感器,原理图,C编程和仿真
- APR学习-消息池的设计与使用
- google三大论文之--MapReduce:超大机群上的简单数据处理
- 《MLB棒球创造营》:走近棒球运动·亚利桑那响尾蛇队
- 【玖哥乱弹】祭天时不同程序员的不同杀法
- android 十六进制加密,使用十六进制十进制值的Android加密和解密?
热门文章
- Python Cookbook by Eric
- 机器学习——One-Hot编码
- 机器学习 Machine Learning中正则化的学习笔记~
- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable
- JS中var与function
- Java中ArrayList、Integer[]和int[]的相互转换
- 内存读写函数实现进程间通信
- php文件下载IE文件名乱码问题
- 【热门技术】三种SEO方式
- 【探路者】第六周立会报告5(总第38次)