【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值
[导读]本系列博文内容链接如下:
【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值
【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动
【C++】【C++】做一个飞机空战小游戏(三)——模块化程设设计
最近想用c++做一个小游戏,游戏的主要内容是利用键盘控制一个飞机躲避和击落屏幕顶部随机掉落敌方炮弹,飞机被敌方炮弹击中则减掉一条命,飞机也可以发射炮弹反击,每击落一个敌方炮弹,则有相应积分。
游戏的思路就是利用w、s、a、d四个按键来控制飞机的移动方向,w——向上,s——向下,a——向左,d——向右;按空格键飞机发射反击炮弹。
那么问题来了,程序如何知道键盘哪个键被按下了呢?c++中getch()这个函数可以实现这个功能,当键盘某个按键(或某个组合按键)被按下时,利用这个函数可以获得该按键(或组合按键)对应符号的码值,从而确定哪个按键被按下了。
目录
一、getch()函数
(一)功能描述:
(二)函数原型:
二、键盘码值
(一)可显示字符
(二)控制按键编码
1、单码
2、双码
(1)第一部分为224
(2)第一部分为0
(三)小键盘码值
1、可显示字符
2、第一类控制字符
3、第二类控制字符
(四)检查键盘码值的方法
1、查询按键码值程序
2、可显示字符的运行结果
3、控制按键单编码
4、控制按键双编码
一、getch()函数
百度百科getch()函数的描述:
(一)功能描述:
getch()是编程中所用的函数,这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性!
(二)函数原型:
函数原型:int getch(void)
返回值:读取字符的码值
getch():所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上函数原型:int getch(void)返回值:读取的字符例如:char ch;或int ch;getch();或ch=getch();用getch();会等待你按下任意键,再继续执行下面的语句;用ch=getch();会等待你按下任意键之后,把该键字符所对应的键盘码值赋给ch,再执行下面的语句。
二、键盘码值
(一)可显示字符
可显示字符是指可通过键盘录入的字符文本,编号范围是32-126(0x20-0x7E),共95个字符,如图1所示浅黄色区域为对应的按键。

getch()获得的可显示字符的码值就是字符的ascii码值,具体情况见表1。

(二)控制按键编码
键盘的有些按键,作用并不是录入文本字符,而是代表输入了一些控制指令。这部分指令按键的码值分两种情况,单码和双码。单码码值范围为0~32之间,双码由两部分码组成,第一部分为0或者224,第二部分为0~255。
1、单码
常用的按键有4个:
序号 | 码值 | 键盘符号 |
1 | 8 | Backspace |
2 | 9 | Tab |
3 | 13 | Enter |
4 | 27 | Esc |
2、双码
(1)第一部分为224
序号 | 第一部分码值 | 第二部分码值 | 键盘符号 |
1 | 224 | 71 | Home |
2 | 224 | 72 | ↑ |
3 | 224 | 73 | PgUp |
4 | 224 | 75 | ← |
5 | 224 | 77 | → |
6 | 224 | 79 | End |
7 | 224 | 80 | ↓ |
8 | 224 | 81 | PgDn |
9 | 224 | 82 | Insert |
10 | 224 | 83 | Delete |
11 | 224 | 133 | F11 |
12 | 224 | 134 | F12 |
13 | 224 | 135 | F11第二功能 |
14 | 224 | 136 | F12第二功能 |
(2)第一部分为0
序号 | 第一部分码值 | 第二部分码值 | 键盘符号 |
1 | 0 | 59 | F1 |
2 | 0 | 60 | F2 |
3 | 0 | 61 | F3 |
4 | 0 | 62 | F4 |
5 | 0 | 63 | F5 |
6 | 0 | 64 | F6 |
7 | 0 | 65 | F7 |
8 | 0 | 66 | F8 |
9 | 0 | 67 | F9 |
10 | 0 | 68 | F10 |
11 | 0 | 84 | F1第二功能 |
12 | 0 | 85 | F2第二功能 |
13 | 0 | 86 | F3第二功能 |
14 | 0 | 87 | F4第二功能 |
15 | 0 | 88 | F5第二功能 |
16 | 0 | 89 | F6第二功能 |
17 | 0 | 90 | F7第二功能 |
18 | 0 | 91 | F8第二功能 |
19 | 0 | 92 | F9第二功能 |
20 | 0 | 93 | F10第二功能 |
(三)小键盘码值
大部分外接键盘和部分笔记本键盘带有数字输入专用的小键盘,如图2所示,也有独立的小键盘,如图3所示。


小键盘上的按键除了数字切换键NumLock之外,其余的键大键盘也是有的,是重复的。
小键盘的码值分三种情况:
1、可显示字符
小键盘的数字0~9、加减乘除等于号(+、-、*、/、=)、小数点(.)等15个可显示字符,其码值与大键盘一样,都是ascii码值。
2、第一类控制字符
数字键7、8、9、4、6、1、2、3、0和小数点键等10个键有复合功能,分别为Home、↑、PgUp、←、→、End、↓、PgDn、Insert、Delete。这10个复合功能键码值与大键盘的码值略有区别,其码值第二部分完全一致,而第一部分码值都是0。详见下表。
序号 | 第一部分码值 | 第二部分码值 | 键盘符号 |
1 | 0 | 71 | Home |
2 | 0 | 72 | ↑ |
3 | 0 | 73 | PgUp |
4 | 0 | 75 | ← |
5 | 0 | 77 | → |
6 | 0 | 79 | End |
7 | 0 | 80 | ↓ |
8 | 0 | 81 | PgDn |
9 | 0 | 82 | Insert |
10 | 0 | 83 | Delete |
3、第二类控制字符
控制字符键Backspace和Enter,其码值与大键盘一样,分别为13和8。
(四)检查键盘码值的方法
对于可显示字符,各个品牌键盘的码值基本都一样。对于控制按键的码值可能会有不同,可以通过
编写程序来显示。
1、查询按键码值程序
#include <iostream>
#include "conio.h"
using namespace std;int main()
{while(1){cout<<getch()<<endl;}}
2、可显示字符的运行结果
分别输入'1'、'A'、'a'、'!'、','5个字符时,显示的码值如下所示。
49
65
97
33
44
3、控制按键单编码
分别按Backspace、Tab、Enter、Esc时,显示的码值如下所示。
8
9
13
27
4、控制按键双编码
分别按↑、↓、←、→、F1、F2键时,显示的码值如下所示,注意每个按键对应的两个码值是分行显示。
224
72
224
80
224
75
224
77
0
59
0
60
相关文章:

【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值
[导读]本系列博文内容链接如下: 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 【C】【C】做一个飞机空战小游戏(三)——模块化程设设计 最近想用c做一个小游戏&#x…...
Spring项目整合策略模式~实战应用
需求背景 1、在管控流程中,涉及到的业务操作很多,不同的业务具有不同的策略实现 举个具体的例子: 在比价管控流程中,有比价策略和管控策略,每个业务的比价和管控均不一样。因此使用策略模式来开发 整体架构流程 1、…...
mybatis PageHelper的坑---记录
记录下,自己新开了一个kotlin的项目从而替换java项目,同时升级了部分组件,包括pageHelper,以往代码里有动态sql的配置 //通过不为null的属性查找数据 val tmpResult: List<Map<String?, Any?>> sqlSessionTemplat…...
uniapp微信小程序下载文件并打开
uni.downloadFile({url: 下载的地址,success(res) {console.log(res)if (res.statusCode 200) {console.log(下载成功);var filePath encodeURI(res.tempFilePath);uni.openDocument({filePath: filePath,fileType: "xlsx",showMenu: true,success: function(res) …...
安卓Intent打开系统进程汇总
1:拨打电话 val uri Uri.parse("tel:10086")val intent Intent(Intent.ACTION_DIAL,uri)startActivity(intent) 2:发送短信 val smsUri Uri.parse("smsto:10086")val intent1 Intent(Intent.ACTION_SENDTO,smsUri)intent1.putE…...
python学习(廖雪峰的官方网站部分,自学笔记)
python学习 廖雪峰的官方网站强烈推荐 字符串 Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符 ord( )先当与把字符转成整形,chr( ) 把编码转化成相应的字符 有些时候,字符串里面的%是一个普通字符怎么办&…...
python题-检查该字符串的括号是否成对出现
给定一个字符串,里边可能包含“()”、"{}"两种括号,请编写程序检查该字符串的括号是否成对出现。 输出: true:代表括号成对出现并且嵌套正确,或字符串无括号字符。 false:未正确使用括号字符。 …...

3ds Max建模教程:模拟布料拖拽撕裂和用剑撕裂两种效果
推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 拖拽撕布 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 在透视视口中创建平面。保持其长度 后座和宽度后座为 100。 创建平面 步骤 3 转到助手>假人并在 飞机的两侧。 助手>假人 步骤 4 选…...

数据可视化(4)散点图及面积图
1.简单散点图 #散点图 #scatter(x,y) x数据,y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…...
Redis - 数据过期策略
Redis提供了两种数据过期策略 惰性删除 和 定期删除 惰性删除 当某个key过期时,不马上删除,而是在调用时,再判断它是否过期,如果过期再删除它 优点 : 对CPU友好,对于很多用不到的key,不用浪费…...

英文论文(sci)解读复现:基于YOLOv5的自然场景下苹果叶片病害实时检测
对于目标检测算法改进,但是应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读发表高水平学术期刊中的SCI论文,并对…...

【Liux下6818开发板(ARM)】实现简易相册
(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…...
Kubernetes(K8s)从入门到精通系列之六:K8s的基本概念和术语之存储类
Kubernetes K8s从入门到精通系列之六:K8s的基本概念和术语之存储类 一、存储类二、emptyDir三、hostPath四、公有云Volume五、其他类型的Volume六、动态存储管理一、存储类 存储类的资源对象主要包括: VolumePersistent VolumePVCStorageClass基础的存储类资源对象——Volum…...

Spark-统一内存模型
总结: Spark的内存模型分为4部分,分别是存储内存,计算内存,其他内存,预留内存; 其中存储内存和计算内存可以动态占用,当己方内存不足对方空余则可占用对方的内存,计算内存被存储内…...

类的继承和super关键字的使用(JAVA)
继承 所有的OOP语言都会有三个特征: 封装(点击可跳转);继承;多态 为什么会有继承呢?可以先看下面的例子: 上面这两个类中的代码很相似因为它们只有最后一个方法不同其它的都相同,这样…...

BGP属性+选路规则
目录 一,BGP的属性—基础属性 1.PrefVal 2.LocPrf 3、优先本地下一跳 (NextHop) 4、AS-PATH 5、起源属性 6、MED -多出口鉴别属性 二,BGP选路规则 三,BGP的社团属性 一,BGP的属性—基础…...

类的实例化
类的实例化 class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day; //这只是函数的一个声明并没有定义 };上面是一个类,我们可以把有花括号括起来的叫做一个域ÿ…...

智能提词器有哪些?了解一下这款提词工具
智能提词器有哪些?使用智能提词器可以帮助你更好地准备和交付演讲、报告或其他提词场合。它可以提高你的效率,节省你的时间,并让你更加自信地与听众沟通。另外,智能提词器还可以提供一些有用的功能,如语音识别、智能建…...
oracle 19c rac环境配置firewalld
rac环境ip地址说明 [rootdb1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.100.19 db1 172.16.100.30 …...

Flutter 之Bloc入门指南实现倒计时功能
Flutter Timer By Bloc 前言Stream.periodic实现倒计时定义Bloc状态定义Bloc事件定义Bloc组件定义View层参考资料前言 使用Bloc开发Flutter的项目,其项目结构都很简单明确,需要创建状态,创建事件,创建bloc,创建对应的View。flutter_timer项目来分析下Bloc的使用方法。 通…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...