《C++游戏编程入门》第4章 标准模板库: Hangman
《C++游戏编程入门》第4章 标准模板库: Hangman
- 4.1 标准模板库
- 4.2 vector
- 04.heros_inventory2.cpp
- 4.3 使用迭代器
- 04.heros_inventory3.cpp
- 4.4 使用算法
- 04.high_scores.cpp
- 4.5 理解向量性能
- 4.6 其他STL容器
- 4.7 Hangman简介
- 04.hangman.cpp
4.1 标准模板库
Standard Template Library,提供算法、容器和迭代器等。
4.2 vector
动态数组。
优势:
- 根据需要动态增长。
- 和STL算法使用,获得查找排序等功能。
缺点:
- 额外内存开销。
- 增长时可能性能损失。
- 某些游戏控制台系统无法使用向量。
04.heros_inventory2.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;int main()
{vector<string> inventory; // 声明// 添加元素inventory.push_back("sword");inventory.push_back("armor");inventory.push_back("shield");cout << "You have " << inventory.size() << " items.\n"; // 向量大小cout << "\nYour items:\n";for (unsigned int i = 0; i < inventory.size(); ++i){cout << inventory[i] << endl; // 向量索引}cout << "\nYou trade your sword for a battle axe.";inventory[0] = "battle axe"; // 向量元素赋值cout << "\nYour items:\n";for (unsigned int i = 0; i < inventory.size(); ++i){cout << inventory[i] << endl;}cout << "\nThe item name '" << inventory[0] << "' has ";cout << inventory[0].size() << " letters in it.\n";cout << "\nYour shield is destroyed in a fierce battle.";inventory.pop_back(); // 移除最后一个元素cout << "\nYour items:\n";for (unsigned int i = 0; i < inventory.size(); ++i){cout << inventory[i] << endl;}cout << "\nYou were robbed of all of your possessions by a thief.";inventory.clear(); // 移除所有元素if (inventory.empty()) // 判断是否为空{cout << "\nYou have nothing.\n";}else{cout << "\nYou have at least one item.\n";}return 0;
}
4.3 使用迭代器
迭代器标识容器中某个特定元素的值,引用元素。
04.heros_inventory3.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;int main()
{vector<string> inventory;inventory.push_back("sword");inventory.push_back("armor");inventory.push_back("shield");vector<string>::iterator myIterator; // 迭代器声明vector<string>::const_iterator iter; // 常量迭代器,不能修改相应元素cout << "Your items:\n";for (iter = inventory.cbegin(); iter != inventory.cend(); ++iter){cout << *iter << endl;}cout << "\nYou trade your sword for a battle axe.";myIterator = inventory.begin();*myIterator = "battle axe";cout << "\nYour items:\n"; // 循环访问向量// 第一个元素,最后一个元素之后,更新for (iter = inventory.begin(); iter != inventory.end(); ++iter){cout << *iter << endl; // 解引用}cout << "\nThe item name '" << *myIterator << "' has ";cout << (*myIterator).size() << " letters in it.\n";cout << "\nThe item name '" << *myIterator << "' has ";cout << myIterator->size() << " letters in it.\n";cout << "\nYou recover a crossbow from a slain enemy.";inventory.insert(inventory.begin(), "crossbow"); // 插入元素cout << "\nYour items:\n";for (iter = inventory.begin(); iter != inventory.end(); ++iter){cout << *iter << endl;}cout << "\nYour armor is destroyed in a fierce battle.";inventory.erase((inventory.begin() + 2)); // 移除元素cout << "\nYour items:\n";for (iter = inventory.begin(); iter != inventory.end(); ++iter){cout << *iter << endl;}return 0;
}
4.4 使用算法
泛型,同样算法用于不同容器类型的元素。
04.high_scores.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;int main()
{vector<int>::const_iterator iter;cout << "Creating a list of scores.";vector<int> scores;scores.push_back(1500);scores.push_back(3500);scores.push_back(7500);cout << "\nHigh Scores:\n";for (iter = scores.begin(); iter != scores.end(); ++iter){cout << *iter << endl;}cout << "\nFinding a score.";int score;cout << "\nEnter a score to find: ";cin >> score;iter = find(scores.begin(), scores.end(), score); // 查找if (iter != scores.end()){cout << "Score found.\n";}else{cout << "Score not found.\n";}cout << "\nRandomizing scores.";srand(static_cast<unsigned int>(time(0)));random_shuffle(scores.begin(), scores.end()); // 随机重排cout << "\nHigh Scores:\n";for (iter = scores.begin(); iter != scores.end(); ++iter){cout << *iter << endl;}cout << "\nSorting scores.";sort(scores.begin(), scores.end()); // 排序cout << "\nHigh Scores:\n";for (iter = scores.begin(); iter != scores.end(); ++iter){cout << *iter << endl;}string word = "High Scores";random_shuffle(word.begin(), word.end());for (auto it = word.cbegin(); it != word.cend(); ++it)cout << *it << endl;return 0;
}
4.5 理解向量性能
向量添加新元素超过当前大小时,重新分配内存,可能全部元素重新复制,导致性能损失。
capacity()向量容量,预先多分配空间。
reserve()扩充容量。
push_back()或pop_back(),尾部添加或移除元素效率高。
insert()或erase(),中间添加或移除元素效率底。
4.6 其他STL容器
顺序型容器:依次检索元素值。
关联型容器:基于键值检索元素值。
deque、list、map、multimap、multiset、priority_queue、queue、set、stack、vector
4.7 Hangman简介
04.hangman.cpp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>
using namespace std;int main()
{// 常量、变量初始化const int MAX_WRONG = 8; // maximum number of incorrect guesses allowedvector<string> words; // collection of possible words to guesswords.push_back("GUESS");words.push_back("HANGMAN");words.push_back("DIFFICULT");srand(static_cast<unsigned int>(time(0)));random_shuffle(words.begin(), words.end());const string THE_WORD = words[0]; // word to guessint wrong = 0; // number of incorrect guessesstring soFar(THE_WORD.size(), '-'); // word guessed so farstring used = ""; // letters already guessedcout << "Welcome to Hangman. Good luck!\n";// main loopwhile ((wrong < MAX_WRONG) && (soFar != THE_WORD)){cout << "\n\nYou have " << (MAX_WRONG - wrong);cout << " incorrect guesses left.\n";cout << "\nYou've used the following letters:\n"<< used << endl;cout << "\nSo far, the word is:\n"<< soFar << endl;char guess;cout << "\n\nEnter your guess: ";cin >> guess;guess = toupper(guess); // make uppercase since secret word in uppercasewhile (used.find(guess) != string::npos){cout << "\nYou've already guessed " << guess << endl;cout << "Enter your guess: ";cin >> guess;guess = toupper(guess);}used += guess;if (THE_WORD.find(guess) != string::npos){cout << "That's right! " << guess << " is in the word.\n";// update soFar to include newly guessed letterfor (unsigned int i = 0; i < THE_WORD.length(); ++i){if (THE_WORD[i] == guess){soFar[i] = guess;}}}else{cout << "Sorry, " << guess << " isn't in the word.\n";++wrong;}}// shut downif (wrong == MAX_WRONG)cout << "\nYou've been hanged!";elsecout << "\nYou guessed it!";cout << "\nThe word was " << THE_WORD << endl;return 0;
}
相关文章:
《C++游戏编程入门》第4章 标准模板库: Hangman
《C游戏编程入门》第4章 标准模板库: Hangman 4.1 标准模板库4.2 vector04.heros_inventory2.cpp 4.3 使用迭代器04.heros_inventory3.cpp 4.4 使用算法04.high_scores.cpp 4.5 理解向量性能4.6 其他STL容器4.7 Hangman简介04.hangman.cpp 4.1 标准模板库 Standard Template L…...
Linux最小系统安装无法查看IP地址
1,出现原因 服务器重启完成之后,我们可以通过linux的指令 ip addr 来查询Linux系统的IP地址,具体信息如下: 从图中我们可以看到,并没有获取到linux系统的IP地址,这是为什么呢?这是由于启动服务器时未加载网…...
分享个好用的GPT网站
目录 一、背景 二、功能描述 1、写代码 2、联网查询 3、AI绘图 一、背景 我现在的开发工作都依靠ChatGPT,效率提升了好几倍。这样一来,我有更多时间来摸鱼,真是嘎嘎香~ ⭐⭐⭐点击直达 ⭐⭐⭐ 二、功能描述 1、写代码 import java.ut…...
hyperf 二十六 数据迁移 二
教程:Hyperf 参考文章hyperf 二十五 数据迁移 一-CSDN博客 根据之前写的数据迁移的文章,已经说明Hyperf\Database\Schema\Schema::create()实际运行Hyperf\Database\Schema\Grammars\MySqlGrammar::compileCreate()生成的sql字符串。 文档所谓"在…...
linux下如何hook第三方播放器的视频数据?
背景 作为显卡生产商,当用户使用我们的显卡硬解码播放视频时,如果出现比如花屏等问题,为了快速确定问题原因,我们需要一个工具来帮助判断出问题是出在原始视频端,亦或者是应用程序端,亦或者是显卡端。因此我们需要一种方法,来对目标播放器程序进行监控,并捕获到视频源的…...
如何通过Python代码连接OceanBase Oracle租户
背景 目前,连接数据库的Oracle租户,只能通过Java和C的驱动程序,无法通过其他语言的驱动程序。为了满足社区中用户希望在Python代码中连接Oracle租户的需求,这里提供一种替代方案。通过结合使用JayDeBeApi和JDBC,我们可…...
2 月 Web3 游戏行业动态
作者:stellafootprint.network 数据来源:区块链游戏研究页面 - Footprint Analytics 2024 年 2 月,区块链游戏领域在加密货币价格上涨和活跃用户激增的推动下,实现了显著增长。然而,行业在维持用户参与度和留存率方面…...
普发Pfeiffer Prisma QMS200四极质谱计内部电路图装配3D图电路板接口详细注解
普发Pfeiffer Prisma QMS200四极质谱计内部电路图装配3D图电路板接口详细注解...
2024.03.04——2024.03.10 力扣练习总结及专项巩固(二)
1. (22. 括号生成)这里只讨论第二种做法回溯法。在回溯法的函数void backtrack(vector<string>& ans, string& current, int open, int close, int n); 中,可分为三个if条件判断,分别判断当current.size() 2*n,ope…...
前端NodeJs笔记之包结构到进程和线程到命令行到Node模块化讲解
包结构 包实际上是一个压缩文件,解压以后还原为目录,符合规范的目录应该包含如下文件: -package.json 描述文件 -bin 可执行二进制文件 -lib js代码 -doc …...
【Java】获取手机文件名称补充
本地的 ADB 工具路径指的是你电脑上安装的 Android Debug Bridge(ADB)工具的路径。ADB 是 Android SDK 中的一个工具,用于与连接到计算机上的 Android 设备进行通信。你需要确保 ADB 已正确安装,并知道其在你计算机上的位置。 通…...
YoloV8改进策略:BackBone改进|TransNeXt:ViT的鲁棒Foveal视觉感知
文章目录 摘要论文:《TransNeXt:ViT的鲁棒Foveal视觉感知》1、引言2、相关工作3、方法3.1、聚合像素焦点注意力3.1.1、像素焦点注意力3.1.2、在单个混合器中聚合不同的注意力3.1.3、克服多尺度图像输入3.1.4、特征分析3.2、卷积门控单元(Convolutional GLU)3.2.1、动机3.2.…...
三维的旋转平移矩阵形式
在三维空间中,一个物体或坐标系的旋转和平移可以通过一个4x4的变换矩阵来表示。这个矩阵通常被称为仿射变换矩阵或齐次变换矩阵。它结合了旋转矩阵和平移向量的功能,能够同时表示旋转和平移操作。 一个4x4的旋转平移矩阵通常具有以下形式: 复…...
ChatGPT+MATLAB应用
MatGPT是一个由chatGPT类支持的MATLAB应用程序,由官方Toshiaki Takeuchi开发,允许您轻松访问OpenAI提供的chatGPT API。作为官方发布的内容,可靠性较高,而且也是完全免费开源的,全程自己配置,无需注册码或用…...
C语言—冒泡排序
C语言—冒泡排序 原理过程讲解代码1、直接在主函数里面实现2、编写函数进行实现 原理 冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序…...
Discord OAuth2授权以及机器人监听群事件
下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。 创建应用 点击 此页面添加应用,ÿ…...
微信小程序返回上一页刷新组件数据
在父页面的onShow和onHide里面添加一个标志 onShow() {this.setData({show:true})},onHide() {this.setData({show:false})}, 把这个值传给子组件 <importantList slot"importantConcern" flag"{{barSelect}}" flag2"{{show}}" /> 在子组…...
Aging Cell:匈牙利学者发现肠道微生物组的变化和衰老密切相关
基于DNA甲基化衰老时钟的开发可以准确用来测量生物年龄,生物年龄在很大程度上受生活方式、环境和遗传等因素的影响,大量证据也表明健康生活方式可以延缓衰老并延长寿命。 先前大规模微生物组分析表明,随着年龄的增长,微生物组菌群…...
837. 连通块中点的数量(acwing)
文章目录 837. 连通块中点的数量题目描述维护size的并查集 837. 连通块中点的数量 题目描述 给定一个包含 n 个点(编号为 1~n)的无向图,初始时图中没有边。 现在要进行 m 个操作,操作共有三种: C a b&a…...
【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98
故障现象,MAME启动后,游戏都没有识别 添加日志输出,重新启动wine #!/bin/bashexport WINEPREFIX$(pwd)/.wine export WINESERVER$(pwd)/bin/wineserver export WINELOADER$(pwd)/bin/wine export WINEDEBUG"file,mame,warn,err"…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
