C++编程:枚举、多维数组、结构体与动画实现
立即解锁
发布时间: 2025-08-20 01:48:54 阅读量: 1 订阅数: 3 


懒惰程序员的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
```
0
0
复制全文
相关推荐










