《C++游戏编程入门》第4章 标准模板库: Hangman

2024-03-12 09:12

本文主要是介绍《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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800788

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类