活动介绍

C++编程:枚举、多维数组、结构体与动画实现

立即解锁
发布时间: 2025-08-20 01:48:54 阅读量: 1 订阅数: 3
PDF

懒惰程序员的C++入门指南

# C++ 编程:枚举、多维数组、结构体与动画实现 ## 1. 枚举类型的使用 ### 1.1 打印枚举值 在 C++ 中,编译器并不知道如何打印自定义的枚举类型。以扑克牌花色枚举 `Suit` 为例,我们可以编写一个函数来实现打印功能: ```cpp void print(Suit suit) //prints a Suit { switch (suit) { case CLUBS : sout << 'C'; break; case DIAMONDS: sout << 'D'; break; case HEARTS : sout << 'H'; break; case SPADES : sout << 'S'; break; default : sout << '?'; break; } } ``` ### 1.2 枚举类(enum class) C++11 及以后版本引入了 `enum class`,它提供了更安全的枚举使用方式。使用 `enum class` 时,引用枚举值需要加上作用域限定符,并且不能隐式转换为整数。例如: ```cpp // 普通枚举使用 for (int s = CLUBS; s <= SPADES; ++s) for (int r = ACE; r <= KING; ++r) ... // 枚举类使用 for (int s = int (Suit::HEARTS); s <= int (Suit::SPADES); ++s) for (int r = int (Rank::ACE); r <= int (Rank::KING); ++r)... ``` 虽然使用 `enum class` 需要更多的输入,但它可以避免意外的枚举值使用和名称冲突。 ### 1.3 枚举类型的边界问题 C++ 不会检查枚举类型变量是否超出了所列出的值范围。例如: ```cpp r = Rank (-5000); ``` 为了避免这种情况,我们应该确保不使用超出范围的值。 ### 1.4 枚举类型相关练习 - 声明一个国际象棋棋子的枚举类型: ```cpp enum ChessPiece { KING, QUEEN, BISHOP, KNIGHT, ROOK, PAWN }; ``` - 声明一个太阳系行星的枚举类型,使 `EARTH` 的值为 3: ```cpp enum Planet { MERCURY = 1, VENUS = 2, EARTH = 3, MARS = 4, JUPITER = 5, SATURN = 6, URANUS = 7, NEPTUNE = 8 }; ``` - 编写一个函数 `printRank`,根据 `Rank` 枚举值打印相应的字符: ```cpp void printRank(Rank rank) { switch (rank) { case ACE: sout << 'A'; break; case TWO: sout << '2'; break; // 其他情况... case KING: sout << 'K'; break; } } ``` - 编写一个函数 `readRank`,读取输入并返回相应的 `Rank` 枚举值: ```cpp Rank readRank() { // 实现读取逻辑 } ``` - 编写一个函数播放不同风格的音乐,使用枚举参数指定音乐风格: ```cpp enum MusicStyle { SPOOKY, CARNIVAL, ALIEN }; void playMusic(MusicStyle style) { // 实现音乐播放逻辑 } ``` ## 2. 多维数组 ### 2.1 二维数组示例:井字棋棋盘 并非所有数组都是简单的列表,我们可以创建二维或更多维的数组。以井字棋棋盘为例,它是一个 3x3 的网格,每个方格可以包含 `X`、`O` 或为空: ```cpp enum {MAX_CLMS = 3, MAX_ROWS = 3}; enum class Square { EMPTY, X, O }; Square board[MAX_ROWS][MAX_CLMS]; // 设置第 1 行第 2 列的方格为 X board[1][2] = Square::X; // 检查第 row 行第 clm 列的方格 if (board[row][clm] == Square::X) ... ``` 二维数组在内存中的排列方式是先存储第 0 行的所有列,然后是第 1 行,以此类推。例如,要访问 `board[1][2]`,C++ 会计算 `1*MAX_CLMS + 2 = 5`,从初始元素开始数第 5 个元素就是 `board[1][2]`。 ### 2.2 显示井字棋棋盘 显示井字棋棋盘可以分为两个基本步骤:绘制棋盘网格和绘制 `X` 和 `O`。以下是一个完整的示例程序: ```cpp #include "SSDL.h" //Dimensions of board and text notes enum { MAX_ROWS = 3, MAX_CLMS = 3 }; enum { ROW_WIDTH = 100, CLM_WIDTH = 100 }; enum { BOARD_HEIGHT = 300, BOARD_WIDTH = 300 }; enum { TEXT_LINE_HEIGHT = 20 }; //A Square is a place in the TicTacToe board //No enum class: I got tired of typing "Square::" enum Square { EMPTY, X, O }; //Displaying the board void display(const Square board[MAX_ROWS][MAX_CLMS]); int main(int argc, char** argv) { //Shrink the display to fit our board // allowing room for 2 lines of text at the bottom; // set title SSDL_SetWindowSize (BOARD_WIDTH, BOARD_HEIGHT + TEXT_LINE_HEIGHT * 2); SSDL_SetWindowTitle("Hit any key to end."); //Colors SSDL_RenderClear (SSDL_CreateColor(30, 30, 30)); //charcoal SSDL_SetRenderDrawColor(SSDL_CreateColor(245, 245, 220)); //beige //The board, initialized to give X 3 in a row Square board[MAX_ROWS][MAX_CLMS] = { {EMPTY, EMPTY, X}, {EMPTY, X, EMPTY}, { X, O, O} }; display (board); //display it //Be sure the user knows what he's seeing is the right result SSDL_RenderText("You should see 3 X's diagonally, ", 0, MAX_ROWS * ROW_WIDTH); SSDL_RenderText("and two O's in the bottom row.", 0, MAX_ROWS * ROW_WIDTH + TEXT_LINE_HEIGHT); SSDL_WaitKey(); return 0; } void display(const Square board[MAX_ROWS][MAX_CLMS]) { //Make 'em static: loaded once, and local to the only function // that needs 'em. What's not to like? static const SSDL_Image X_IMAGE = SSDL_LoadImage("media/X.png"); static const SSDL_Image O_IMAGE = SSDL_LoadImage("media/O.png"); //draw the X's and O's for (int row = 0; row < MAX_ROWS; ++row) for (int clm = 0; clm < MAX_CLMS; ++clm) switch (board[row][clm]) { case Square::X: SSDL_RenderImage(X_IMAGE, clm*CLM_WIDTH, row*ROW_WIDTH); br ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

sun海涛

游戏开发工程师
曾在多家知名大厂工作,拥有超过15年的丰富工作经验。主导了多个大型游戏与音视频项目的开发工作;职业生涯早期,曾在一家知名游戏开发公司担任音视频工程师,参与了多款热门游戏的开发工作。负责游戏音频引擎的设计与开发,以及游戏视频渲染技术的优化和实现。后又转向一家专注于游戏机硬件和软件研发的公司,担任音视频技术负责人。领导团队完成了多个重要的音视频项目,包括游戏机音频引擎的升级优化、视频编解码器的集成开发等。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

构建可扩展医疗设备集成方案:飞利浦监护仪接口扩展性深入解析

![构建可扩展医疗设备集成方案:飞利浦监护仪接口扩展性深入解析](https://media.licdn.com/dms/image/D4D12AQHs8vpuNtEapQ/article-cover_image-shrink_600_2000/0/1679296168885?e=2147483647&v=beta&t=NtAWpRD677ArMOJ_LdtU96A1FdowU-FibtK8lMrDcsQ) # 摘要 本文探讨了医疗设备集成的重要性和面临的挑战,重点分析了飞利浦监护仪接口技术的基础以及可扩展集成方案的理论框架。通过研究监护仪接口的技术规格、数据管理和标准化兼容性,本文阐述了实

【Matlab优化算法实战】:精通Matlab实现复杂问题优化的技巧

![【Matlab优化算法实战】:精通Matlab实现复杂问题优化的技巧](https://img-blog.csdnimg.cn/baf501c9d2d14136a29534d2648d6553.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Zyo6Lev5LiK77yM5q2j5Ye65Y-R,size_20,color_FFFFFF,t_70,g_se,x_16) # 摘要 本文全面概述了Matlab优化算法的理论基础、实践操作以及高级应用。首先,介绍了数学优化问题的分类和优化

【机器人灵巧手医疗应用】:手术精度革命的新工具

![【机器人灵巧手医疗应用】:手术精度革命的新工具](https://assets.cureus.com/uploads/figure/file/945468/article_river_58294d90dc6a11ee83bdf793876296c8-Picture1.png) # 摘要 随着医疗技术的进步,机器人灵巧手在手术精度和康复辅助方面展现出巨大潜力,已成为推动医疗领域创新的重要力量。本文首先介绍了机器人灵巧手在医疗领域的应用背景,随后深入探讨了其技术原理,包括机械结构设计、控制系统、以及传感技术。文章还通过具体应用案例,如外科手术、康复辅助以及医学教育与培训,分析了灵巧手的实际应

STM8点阵屏汉字显示:用户界面设计与体验优化的终极指南

![STM8点阵屏汉字显示:用户界面设计与体验优化的终极指南](http://microcontrollerslab.com/wp-content/uploads/2023/06/select-PC13-as-an-external-interrupt-source-STM32CubeIDE.jpg) # 摘要 STM8点阵屏技术作为一种重要的显示解决方案,广泛应用于嵌入式系统和用户界面设计中。本文首先介绍STM8点阵屏的技术基础,然后深入探讨汉字显示的原理,并着重分析用户界面设计策略,包括布局技巧、字体选择、用户交互逻辑及动态效果实现等。接着,本文详细阐述了STM8点阵屏的编程实践,涵盖开

【C#跨平台开发与Focas1_2 SDK】:打造跨平台CNC应用的终极指南

![Focas1_2 SDK](https://www.3a0598.com/uploadfile/2023/0419/20230419114643333.png) # 摘要 本文全面介绍了C#跨平台开发的原理与实践,从基础知识到高级应用,详细阐述了C#语言核心概念、.NET Core与Mono平台的对比、跨平台工具和库的选择。通过详细解读Focas1_2 SDK的功能与集成方法,本文提供了构建跨平台CNC应用的深入指南,涵盖CNC通信协议的设计、跨平台用户界面的开发以及部署与性能优化策略。实践案例分析部分则通过迁移现有应用和开发新应用的实战经验,向读者展示了具体的技术应用场景。最后,本文对

【游戏物理引擎基础】:迷宫游戏中的物理效果实现

![基于C++-EasyX编写的益智迷宫小游戏项目源码.zip](https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/7eae7ef4-7fbf-4de2-b153-48a18c117e42/d9ytliu-34edfe51-a0eb-4516-a9d0-020c77a80aff.png/v1/fill/w_1024,h_547,q_80,strp/snap_2016_04_13_at_08_40_10_by_draconianrain_d9ytliu-fullview.jpg?token=eyJ0eXAiOiJKV1QiLCJh

【wxWidgets多媒体处理】:实现跨平台音频与视频播放

![【wxWidgets多媒体处理】:实现跨平台音频与视频播放](https://media.licdn.com/dms/image/D4D12AQH6dGtXzzYAKQ/article-cover_image-shrink_600_2000/0/1708803555419?e=2147483647&v=beta&t=m_fxE5WkzNZ45RAzU2jeNFZXiv-kqqsPDlcARrwDp8Y) # 摘要 本文详细探讨了基于wxWidgets的跨平台多媒体开发,涵盖了多媒体处理的基础理论知识、在wxWidgets中的实践应用,以及相关应用的优化与调试方法。首先介绍多媒体数据类型与

MATLAB程序设计模式优化:提升pv_matlab项目可维护性的最佳实践

![MATLAB程序设计模式优化:提升pv_matlab项目可维护性的最佳实践](https://pgaleone.eu/images/unreal-coverage/cov-long.png) # 摘要 本文全面探讨了MATLAB程序设计模式的基础知识和最佳实践,包括代码的组织结构、面向对象编程、设计模式应用、性能优化、版本控制与协作以及测试与质量保证。通过对MATLAB代码结构化的深入分析,介绍了函数与脚本的差异和代码模块化的重要性。接着,本文详细讲解了面向对象编程中的类定义、继承、封装以及代码重用策略。在设计模式部分,本文探讨了创建型、结构型和行为型模式在MATLAB编程中的实现与应用

【BT-audio音频抓取工具比较】:主流工具功能对比与选择指南

# 摘要 本文旨在全面介绍BT-audio音频抓取工具,从理论基础、功能对比、实践应用到安全性与隐私保护等多个维度进行了深入探讨。通过分析音频信号的原理与格式、抓取工具的工作机制以及相关法律和伦理问题,本文详细阐述了不同音频抓取工具的技术特点和抓取效率。实践应用章节进一步讲解了音频抓取在不同场景中的应用方法和技巧,并提供了故障排除的指导。在讨论工具安全性与隐私保护时,强调了用户数据安全的重要性和提高工具安全性的策略。最后,本文对音频抓取工具的未来发展和市场需求进行了展望,并提出了选择合适工具的建议。整体而言,本文为音频抓取工具的用户提供了一个全面的参考资料和指导手册。 # 关键字 音频抓取;

【调试与性能优化】:LMS滤波器在Verilog中的实现技巧

![【调试与性能优化】:LMS滤波器在Verilog中的实现技巧](https://img-blog.csdnimg.cn/img_convert/b111b02c2bac6554e8f57536c89f3c05.png) # 摘要 本文详细探讨了最小均方(LMS)滤波器的理论基础、硬件实现、调试技巧以及性能优化策略,并通过实际案例分析展示了其在信号处理中的应用。LMS滤波器作为一种自适应滤波器,在数字信号处理领域具有重要地位。通过理论章节,我们阐述了LMS算法的工作原理和数学模型,以及数字信号处理的基础知识。接着,文章介绍了LMS滤波器的Verilog实现,包括Verilog语言基础、模块