文章目录

  • C版本
    • 点子
      • 初版1.1 静止的飞机
      • 初版1.2 动态飞机(使用按键控制飞机移动)
      • 初版1.3 动态飞机(按空格发射和关闭激光)
      • 初版1.4 动态飞机(按空格发射一次激光,移动时关闭)
      • 初版1.5 飞机打靶(添加和击毁靶子)

C版本

点子

实现一个字符飞机,按asdw键后改变飞机的坐标位置(x, y),控制飞机上下左右移动,空格键开火。注意:这里的坐标指得是飞机头的坐标。

初版是设计一个靶子,飞机按空格键后发射激光击毁靶子。然后让靶子自由移动,添加分数统计和显示等。

进阶版是将游戏模块化,设计自由下落的敌机,被击中后绘制简易爆炸效果等等。

更高级是添加关卡和多种武器等等。

初版1.1 静止的飞机

同小球弹跳一样,在控制台输出一些空格和换行控制飞机位置。飞机形状如下:

     **********  *  **
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
void PrintPlane(int x, int y) { //输出飞机图形for (int i = 0; i < y; i++)  puts(""); for (int i = 0; i < x; i++)  putchar(' ');   puts("*");for (int i = 0; i < x - 1; i++) putchar(' '); puts("***");for (int i = 0; i < x - 2; i++) putchar(' '); puts("*****");for (int i = 0; i < x - 3; i++) putchar(' '); puts("*  *  *");for (int i = 0; i < x; i++) putchar(' '); puts("*");
}
int main() {int x, y;x = 10, y = 5;  PrintPlane(x, y);  return 0;
}

效果如下:

初版1.2 动态飞机(使用按键控制飞机移动)

可以用scanf输入字符,但是会影响游戏体验,毕竟scanf需要敲回车。替代的是使用conio.h中的getch函数。

conio.h不是C标准库中的头文件,在C standard library,ISO C 和POSIX标准中均没有定义。
conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
conio库不仅适用于 Windows 平台,在 Linux 下也可使用.网上已经有兼容包,下载后打开就可使用。

发现一个问题,如果移动到上左的边界时,飞机的输出会变形…为此添加边界检查。

#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
void PrintPlane(int x, int y) { //输出飞机图形for (int i = 0; i < y; i++)  puts(""); for (int i = 0; i < x; i++)  putchar(' ');   puts("*");for (int i = 0; i < x - 1; i++) putchar(' '); puts("***");for (int i = 0; i < x - 2; i++) putchar(' '); puts("*****");for (int i = 0; i < x - 3; i++) putchar(' '); puts("*  *  *");for (int i = 0; i < x; i++) putchar(' '); puts("*");
}
int main() {int x, y;x = 10, y = 5; char c;while (1) {PrintPlane(x, y); c = getch();switch (c) {case 'a': x -= (x > 3) ? 1 : 0; break;case 's': y++; break;case 'd': x++; break;case 'w': y -= (y > 0) ? 1 : 0; break;case ' ': break;} system("cls");}return 0;
}

初版1.3 动态飞机(按空格发射和关闭激光)

和按其他方向键一样,按空格键后同样要重新绘制图形。让飞机发射激光,即在飞机上方显示一列竖线"|"。

发射模式:按了空格键后就会不断的发射激光,如果再按一次就会关闭激光。移动时会自动发射激光。

#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
void PrintScreen(int x, int y, int isFired) {for (int i = 0; i < y; i++) { //不发射激光时会输出多余的空格for (int j = 0; j < x; j++) putchar(' ');if (isFired) putchar('|');puts("");}for (int i = 0; i < x; i++)  putchar(' ');   puts("*");for (int i = 0; i < x - 1; i++) putchar(' '); puts("***");for (int i = 0; i < x - 2; i++) putchar(' '); puts("*****");for (int i = 0; i < x - 3; i++) putchar(' '); puts("*  *  *");for (int i = 0; i < x; i++) putchar(' '); puts("*");
}
int main() {int x, y;x = 10, y = 5; char c;int isFired = 0;while (1) {PrintScreen(x, y, isFired); c = getch();switch (c) {case 'a': x -= (x > 3) ? 1 : 0; break;case 's': y++; break;case 'd': x++; break;case 'w': y -= (y > 0) ? 1 : 0; break;case ' ': isFired = isFired == 0 ? 1: 0; break;} system("cls");}return 0;
}


当然,也可以改成按空格键后发射一次激光,然后移动时关闭激光。一般来看,应该以这种模式为主,不然玩家只需要开启一次激光就可以了。哪有这么好的事呢??

另外也不一定要是激光,也可以添加其他的武器,如用‘^'表示子弹。

初版1.4 动态飞机(按空格发射一次激光,移动时关闭)

这里空格不具有关闭激光的功能,仅仅是开启激光。因此,改为使用全局变量isFired。

#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
int isFired = 0;
void PrintScreen(int x, int y) {if (!isFired) for (int i = 0; i < y; i++) puts(""); //不发射激光时else {for (int i = 0; i < y; i++) {for (int j = 0; j < x; j++) putchar(' ');if (isFired) printf("|\n");}isFired = 0; //关闭激光} /* 打印飞机 */for (int i = 0; i < x; i++)  putchar(' ');   puts("*");for (int i = 0; i < x - 1; i++) putchar(' '); puts("***");for (int i = 0; i < x - 2; i++) putchar(' '); puts("*****");for (int i = 0; i < x - 3; i++) putchar(' '); puts("*  *  *");for (int i = 0; i < x; i++) putchar(' '); puts("*");
}
int main() {int x, y;x = 10, y = 5; char c; while (1) {PrintScreen(x, y); c = getch();switch (c) {case 'a': x -= (x > 3) ? 1 : 0; break;case 's': y++; break;case 'd': x++; break;case 'w': y -= (y > 0) ? 1 : 0; break;case ' ': isFired = 1; break;} system("cls");}return 0;
}

初版1.5 飞机打靶(添加和击毁靶子)

先用‘+‘作为靶子。当飞机头的x坐标和靶子对齐时,全局变量is_killed置1,刷新屏幕取消靶子输出。

#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
int isFired = 0, is_killed = 0;
int target_x = 12; //靶子的x坐标, y = 0
void PrintScreen(int x, int y) {if (!is_killed) { //打印靶子 for (int i = 0; i < target_x; i++) printf(" ");printf("+\n"); }if (!isFired) for (int i = 0; i < y; i++) puts(""); //不发射激光时else { //发射激光 for (int i = 0; i < y; i++) {for (int j = 0; j < x; j++) putchar(' ');if (isFired) printf("|\n");}isFired = 0;if (x == target_x) is_killed = 1; //击中靶子 } /* 打印飞机 */for (int i = 0; i < x; i++)  putchar(' ');   puts("*");for (int i = 0; i < x - 1; i++) putchar(' '); puts("***");for (int i = 0; i < x - 2; i++) putchar(' '); puts("*****");for (int i = 0; i < x - 3; i++) putchar(' '); puts("*  *  *");for (int i = 0; i < x; i++) putchar(' '); puts("*");
}
int main() {int x, y;x = 20, y = 15; char c; while (1) {PrintScreen(x, y); c = getch();switch (c) {case 'a': x -= (x > 3) ? 1 : 0; break;case 's': y++; break;case 'd': x++; break;case 'w': y -= (y > 0) ? 1 : 0; break;case ' ': isFired = 1; break;} system("cls");}return 0;
}

这时的程序仍然很简陋,可以思考一下,如何让靶子自己移动?如何统计和显示得分?可以自己作为练习。我会将其作为进阶版的飞机游戏实现。

C/C++实现简单打飞机小游戏【初版】相关推荐

  1. C语言——简单的飞机小游戏

    目录 前言 一.先看代码 二.代码解析 1.飞机图案的打印 2.控制飞机移动 getch() 函数 kbhit() 函数 3.发射激光 4.打击靶子 总结 前言 代码参考了<C语言课程设计与游戏 ...

  2. Java飞机小游戏制作简单实现详细小结

    567881@ftJava小游戏开发 Java飞机小游戏制作简单实现小结 本人原来是个技术小白,寒假我跟着高淇老师的Java300集开始自学Java,跟着做了一个飞机大战小游戏,已经实现了飞机的自由移 ...

  3. 用c++做一个简单的打飞机小游戏(详细说明与注释)

    用c++做一个简单的打飞机小游戏(详细说明与注释) 说明: 代码长度5k多,行数200多行. 不仅没有压行,反而为了条理清晰一点所以很多中间加空换行,把很多可以写在一起的分割成了几个函数. 为了不会忘 ...

  4. 用JAVA写个飞机小游戏玩玩吧

    闲来无事写了个飞机小游戏. 设定很简单,子弹打到飞机就结束游戏. 实现步骤如下,有问题可以评论区讨论: 首先建立一个PlayGame项目和它之下的包: MyGameFrame(游戏实现)类: pack ...

  5. c语言射击类打飞机小游戏感悟

    c语言:简单飞机射击小游戏 使用c语言编写一个打飞机小游戏,使用键盘按键来进行游戏,操作方法是"a""d""w"或者"←" ...

  6. C语言 打飞机 小游戏

    C语言实现简单的打飞机小游戏 编译环境:vs2019 需求: 在同一个平面内,控制大炮发射的三个方向,空格发射炮弹,敌军和友军飞机会一直随机在天上飞过,击中天上飞行的敌军飞机加一分,击中友军飞机减一分 ...

  7. Python编写微信打飞机小游戏(三)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  8. Python编写微信打飞机小游戏(八)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  9. Python编写微信打飞机小游戏(十一)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

最新文章

  1. TensorFlow各版本下载地址,强烈推荐
  2. IE9上特定网站不断崩溃的故障
  3. 树莓派html5播放器,树莓派|5 个很适合在课堂上演示的树莓派项目
  4. WordPress前台后台出现一片空白的原因以及解决办法
  5. win10下Rabbitmq的安装和配置
  6. android提交项目到svn,Android Studio 配置SVN,通过Share project提交项目和实现忽略文件...
  7. 定时备份 MySQL 并上传到七牛
  8. Spark精华问答 | RDD的核心概念是什么?
  9. C#LeetCode刷题-字符串
  10. 美联社将在以太坊区块链记录NCAA锦标赛篮球比分和赛程表
  11. Slim Span UVA - 1395 (并查集)
  12. 20155307《网络对抗》信息搜集与漏洞扫描
  13. 计算机硬盘分区知识简介、Linux企业级分区方案建议
  14. unity学习笔记(二)—— 制作第一个小游戏
  15. word打开很慢解决办法
  16. 红米K40使用半个月,谈谈上手体验,“优缺点”非常明显!
  17. Java/java程序设计:房屋出租系统:要求实现:新增房源,查找房屋信息,修改房屋信息,删除房屋信息,显示所有房屋列表,退出房屋管理系统;
  18. 关于使用google map实现周边搜索的功能
  19. 两化融合贯标之-申请表案例
  20. markdown语法总结

热门文章

  1. 【方法】如何快速高效学习
  2. MP4 全介绍【转载】
  3. tps和tips区别_性能测试:TPS和QPS的区别
  4. Kindle电子书的资源汇总
  5. 全解析阿里云Alibaba Cloud Linux镜像操作系统详解
  6. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL【收藏】
  7. 【图像分割】基于贝叶斯算法阙值图像分割matlab代码
  8. 高校实验室仪器设备管理系统/实验室管理系统
  9. 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
  10. 小米平板1(A0101)官方线刷包_救砖包_解账户锁