36.普通枚举

36.枚举-普通枚举


36.1 知识点

基本概念

枚举是什么

枚举是一个比较特别的存在。它是一个被命名的整型常量的集合,是一种用户自定义的数据类型。一般用它来表示状态、类型等。

声明枚举 和 声明枚举变量

声明枚举和声明枚举变量是两个概念:

  • 声明枚举:相当于是创建一个自定义的枚举类型。
  • 声明枚举变量:使用声明的自定义枚举类型来创建一个枚举变量。

声明枚举语法

enum E_EnumName
{
    Name1 = 100, // 100
    Name2,       // 101
    Name3,       // 102
    Name4 = 200, // 200
    Name5,       // 201
    Name6,       // 202
};

枚举中不手动赋值时,从0开始,后面的项依次加1。最后一个枚举项后面的逗号是可写可不写,不影响语法。

枚举变量声明规则

E_EnumName my1 = Name1;
E_EnumName my2 = Name2;

在哪里声明枚举

枚举的声明一般作为全局变量进行声明,不写在任何语句块中。

例如,表示颜色类型的枚举:

enum E_Color
{
    White,
    Blue,
    Red,
};

表示怪物种类的枚举:

enum E_MonsterType
{
    Normal,
    Boss
};

枚举变量的声明可以写在任意位置,注意:声明枚举变量时,要保证枚举在之前已进行声明。

例如,全局枚举变量的声明:

E_Color color = White;

枚举的使用及作用

提高代码可读性

枚举可以提高代码的可读性。例如:

E_Color myColor = Red;
cout << myColor << endl; // 2

通过枚举变量,代码语义更加清晰。如果使用整数代替,会失去可读性。

枚举和 Switch 配合使用

枚举和 switch 是天生一对,能提高编程效率。例如:

E_MonsterType type = Boss;
cout << type << endl; // 1

switch (type)
{
    case Normal:
        cout << "普通怪物的逻辑处理" << endl;
        break;
    case Boss:
        cout << "Boss怪物的逻辑处理" << endl;
        break;
    default:
        break;
}

枚举和整数之间的转换

枚举转整型

枚举可以隐式转换为整数类型。例如:

int colorNum = myColor;
cout << colorNum << endl; // 2
int typeNum = type;
cout << typeNum << endl; // 1

整型转枚举

需要使用 static_cast<枚举类型>(整型值) 方法进行强制转换。例如:

myColor = static_cast<E_Color>(6);
switch (myColor)
{
    case White:
        cout << "White" << endl;
        break;
    case Blue:
        cout << "Blue" << endl;
        break;
    case Red:
        cout << "Red" << endl;
        break;
    default:
        cout << "枚举中没有" << endl;
        break;
}

游戏开发中使用枚举的情况

在游戏开发中,对象很多时候会有许多状态。例如,玩家有一个动作状态,我们需要用一个变量或标识来标识当前玩家处于哪一种状态。

综合考虑,可能会使用整数来标识它的状态:

  • 1 行走
  • 2 待机
  • 3 跑步
  • 4 跳跃
  • ……等等

这个时候,就可以通过枚举来帮助我们清晰地分辨状态的含义以及进行逻辑处理。


36.2 知识点代码

Lesson36_枚举_普通枚举.cpp

#include <iostream>
using namespace std;

#pragma region 知识点一 基本概念

#pragma region 1.枚举是什么

//枚举是一个比较特别的存在
//它是一个被命名的整形常量的集合
//是一种用户自定义的数据类型
//一般用它来表示 状态 类型 等等

#pragma endregion

#pragma region 2.声明枚举 和 声明枚举变量

//注意:声明枚举 和 声明枚举变量 是两个概念
//声明枚举:     相当于是 创建一个自定义的枚举类型
//声明枚举变量: 使用声明的自定义枚举类型 创建一个枚举变量

#pragma endregion

#pragma region 3.声明枚举语法

//enum E_枚举名字
//{
//    枚举项名字, //0 如果不自己赋值 默认第一项 就会是0 之后枚举项对应的值 会依次累加
//    枚举项名字1,//1
//    枚举项名字2,//2
//    枚举项名字3,//3
//    //......n个枚举项都可以 根据自己的需求添加
//};

enum E_EnumName
{
    //枚举不手动赋值的话 是从0开始的 后面一项逐个加一
    //Name = 100,//虽然枚举中的值 允许手动改为一样的值 但是不建议
    Name1 = 100,
    Name2,//101
    Name3,//102
    Name4 = 200,
    Name5,//201
    //枚举中最后一个枚举项后面的逗号 是可以写可不写的 不影响
    Name6,//202
};


//枚举变量 声明规则
//枚举类型 变量名 = 枚举中包含的枚举项
E_EnumName my1 = Name1;
E_EnumName my2 = Name2;

#pragma endregion

#pragma endregion

#pragma region 知识点二 在哪里声明枚举

//枚举的声明一般都是作为全局变量进行声明
//不写在任何语句块中

//表示颜色类型的枚举
enum E_Color
{
    White,
    Blue,
    Red,
};

//表示怪物种类的枚举
enum E_MonsterType
{
    Normal,
    Boss
};

//枚举变量的声明可以写在任意位置
//注意:声明枚举变量时要保证枚举在之前进行了声明
//全局枚举变量
E_Color color = White;

#pragma endregion

#pragma region 知识点三 枚举的使用及作用

//可以提高代码可读性
//枚举和Switch是天生一对 提高编程效率

#pragma endregion

#pragma region 知识点四 枚举和整数之间的转换

//枚举转整型
//可以隐式转换为整数类型

//整型转枚举
//需要使用 static_cast<枚举类型>(整型值) 方法进行强制转换

#pragma endregion

#pragma region 知识点五 游戏开发中使用枚举的情况

//在游戏开发中,对象很多时候 会有许多的状态
//比如玩家 有一个动作状态 我们需要用一个变量或者标识 来标识当前玩家处于的是哪一种状态
//综合考虑 可能会使用 int 来标识它的状态
// 1 行走
// 2 待机
// 3 跑步
// 4 跳跃
// .......等等
//这个时候 就可以通过枚举来帮助我们 清晰的分清楚状态的含义 以及进行逻辑处理

#pragma endregion


int main()
{
    std::cout << "枚举\n";


    #pragma region 知识点三 枚举的使用

    //枚举第一个作用 可以提高代码可读性

    E_Color myColor = Red;
    cout << myColor << endl;//2

    if (myColor == White)
    {

    }
    else if (myColor == Blue)
    {

    }
    else if (myColor == Red)
    {

    }


    //第二个作用 枚举和Switch是天生一对 提高编程效率

    E_MonsterType type = Boss;
    cout << type << endl;//1

    switch (type)
    {
    case Normal:
        cout << "普通怪物的逻辑处理" << endl;
        break;
    case Boss:
        cout << "Boss怪物的逻辑处理" << endl;
        break;
    default:
        break;
    }

    #pragma endregion

    #pragma region 知识点四 枚举和整数之间的转换

    //把枚举转换为整形
    int colorNum = myColor;
    cout << colorNum << endl;//2
    int typeNum = type;
    cout << typeNum << endl;//1

    //把整形转换为枚举
    myColor = static_cast<E_Color>(6);
    switch (myColor)
    {
    case White:
        cout << "White" << endl;
        break;
    case Blue:
        cout << "Blue" << endl;
        break;
    case Red:
        cout << "Red" << endl;
        break;
    default:
        cout << "枚举中没有" << endl;
        break;
    }

    #pragma endregion
}

36.3 练习题

定义QQ状态的枚举,并提示用户选择一个在线状态,我们接受输入的数字,并将其转换成枚举类型

//QQ状态
enum E_QQType
{
    //在线0
    OnLine,
    //离开1
    Leave,
    //忙绿2
    Busy,
    //隐身3
    Invisible,
};

try
{
    cout << "请输入你的QQ状态(0在线、1离开、2忙绿、3隐身)" << endl;
    string str;
    cin >> str;
    //将输入的字符串转为int再转为枚举
    E_QQType type = static_cast<E_QQType>(stoi(str));
    switch (type)
    {
        case OnLine:
            cout << "在线" << endl;
            break;
        case Leave:
            cout << "离开" << endl;
            break;
        case Busy:
            cout << "忙绿" << endl;
            break;
        case Invisible:
            cout << "隐身" << endl;
            break;
        default:
            cout << "未知状态" << endl;
            break;
    }
}
catch (const std::exception&)
{
    cout << "请输入正确的数字" << endl;
}

用户去星巴克买咖啡,分为中杯(35元),大杯(40元),超大杯(43元),请用户选择要购买的类型,用户选择后,打印:您购买了xxx咖啡,花费了xx元

例如:你购买了中杯咖啡,花费了35元

//咖啡类型
enum E_CafeType
{
    M,//中杯
    B,//大杯
    SB,//超大杯
};

try
{
    cout << "请输入咖啡的种类(0中杯 1大杯 2超大杯)" << endl;
    string str;
    cin >> str;
    E_CafeType type = static_cast<E_CafeType>(stoi(str));
    switch (type)
    {
        case M:
            cout << "你购买了中杯咖啡,花费了35元" << endl;
            break;
        case B:
            cout << "你购买了大杯咖啡,花费了40元" << endl;
            break;
        case SB:
            cout << "你购买了超大杯咖啡,花费了43元" << endl;
            break;
        default:
            cout << "请输入正确的类型" << endl;
            break;
    }
}
catch (const std::exception&)
{
    cout << "请输入正确的数字" << endl;
}

请用户选择英雄性别与英雄职业,最后打印英雄的基本属性(攻击力,防御力,技能)

性别:
男(攻击力+50,防御力+100)
女(攻击力+150,防御力+20)

职业:
战士(攻击力+20,防御力+100,技能:冲锋)
猎人(攻击力+120,防御力+30,技能:假死)
法师(攻击力+200,防御力+10,技能:奥术冲击)

举例打印:你选择了“女性法师”,攻击力:350,防御力:30,职业技能:奥术冲击

enum E_Sex
{
    Man,//男
    Woman,//女
};

enum E_Occupation
{
    Warrior,//战士
    Hunter,//猎人
    Master,//法师
};

try
{
    cout << "请选择性别(男0,女1)" << endl;
    string str;
    cin >> str;
    E_Sex sexType = static_cast<E_Sex>(stoi(str));
    string sexStr = "";
    int atk = 0;
    int def = 0;
    switch (sexType)
    {
        case Man:
            atk += 50;
            def += 100;
            sexStr = "男性";
            break;
        case Woman:
            atk += 150;
            def += 20;
            sexStr = "女性";
            break;
        default:
            cout << "请输入正确的男女类型" << endl;
            return 0;
    }

    cout << "请选择职业(0战士、1猎人、2法师)" << endl;
    cin >> str;
    E_Occupation oType = static_cast<E_Occupation>(stoi(str));
    string skillInfo = "";
    string occupation = "";
    switch (oType)
    {
        case Warrior:
            atk += 20;
            def += 100;
            skillInfo = "冲锋";
            occupation = "战士";
            break;
        case Hunter:
            atk += 120;
            def += 30;
            skillInfo = "假死";
            occupation = "猎人";
            break;
        case Master:
            atk += 200;
            def += 10;
            skillInfo = "奥术冲击";
            occupation = "法师";
            break;
        default:
            cout << "请输入正确的职业类型" << endl;
            return 0;
    }

    cout << "你选择了“" << sexStr + occupation << "”,攻击力:" << atk << ",防御力:"
         << def << ",职业技能:" << skillInfo << endl;
}
catch (const std::exception&)
{
    cout << "请输入正确的数字" << endl;
}

36.4 练习题代码

Lesson36_练习题.cpp

#include <iostream>
#include <string>
using namespace std;

//QQ状态
enum E_QQType
{
    //在线0
    OnLine,
    //离开1
    Leave,
    //忙绿2
    Busy,
    //隐身3
    Invisible,
};

//咖啡类型
enum E_CafeType
{
    M,//中杯
    B,//大杯
    SB,//超大杯
};

enum E_Sex
{
    Man,//男
    Woman,//女
};

enum E_Occupation
{
    Warrior,//战士
    Hunter,//猎人
    Master,//法师
};

int main()
{
    std::cout << "枚举 练习题\n";

    #pragma region 练习题一

    //定义QQ状态的枚举,并提示用户选择一个在线状态,我们接受输入的数字,并将其转换成枚举类型

    try
    {
        cout << "请输入你的QQ状态(0在线、1离开、2忙绿、3隐身)" << endl;
        string str;
        cin >> str;
        //将输入的字符串转为int再转为枚举
        E_QQType type = static_cast<E_QQType>(stoi(str));
        switch (type)
        {
            case OnLine:
                cout << "在线" << endl;
                break;
            case Leave:
                cout << "离开" << endl;
                break;
            case Busy:
                cout << "忙绿" << endl;
                break;
            case Invisible:
                cout << "隐身" << endl;
                break;
            default:
                cout << "未知状态" << endl;
                break;
        }
    }
    catch (const std::exception&)
    {
        cout << "请输入正确的数字" << endl;
    }

    #pragma endregion

    #pragma region 练习题二

    //用户去星巴克买咖啡,分为中杯(35元),大杯(40元),超大杯(43元),
    //请用户选择要购买的类型,用户选择后,打印:您购买了xxx咖啡,花费了xx元
    //例如:你购买了中杯咖啡,花费了35元

    try
    {
        cout << "请输入咖啡的种类(0中杯 1大杯 2超大杯)" << endl;
        string str;
        cin >> str;
        E_CafeType type = static_cast<E_CafeType>(stoi(str));
        switch (type)
        {
            case M:
                cout << "你购买了中杯咖啡,花费了35元" << endl;
                break;
            case B:
                cout << "你购买了大杯咖啡,花费了40元" << endl;
                break;
            case SB:
                cout << "你购买了超大杯咖啡,花费了43元" << endl;
                break;
            default:
                cout << "请输入正确的类型" << endl;
                break;
        }
    }
    catch (const std::exception&)
    {
        cout << "请输入正确的数字" << endl;
    }

    #pragma endregion

    #pragma region 练习题三
    //请用户选择英雄性别与英雄职业,最后打印英雄的基本属性(攻击力,防御力,技能)
    //性别:
    //男(攻击力 + 50,防御力 + 100)
    //女(攻击力 + 150,防御力 + 20)
    //职业:
    //战士(攻击力 + 20,防御力 + 100,技能:冲锋)
    //猎人(攻击力 + 120,防御力 + 30,技能:假死)
    //法师(攻击力 + 200,防御力 + 10,技能:奥术冲击)
    //
    //举例打印:你选择了“女性法师”,攻击力:350,防御力:30,职业技能:奥术冲击

    try
    {
        cout << "请选择性别(男0,女1)" << endl;
        string str;
        cin >> str;
        E_Sex sexType = static_cast<E_Sex>(stoi(str));
        string sexStr = "";
        int atk = 0;
        int def = 0;
        switch (sexType)
        {
            case Man:
                atk += 50;
                def += 100;
                sexStr = "男性";
                break;
            case Woman:
                atk += 150;
                def += 20;
                sexStr = "女性";
                break;
            default:
                cout << "请输入正确的男女类型" << endl;
                return 0;
        }

        cout << "请选择职业(0战士、1猎人、2法师)" << endl;
        cin >> str;
        E_Occupation oType = static_cast<E_Occupation>(stoi(str));
        string skillInfo = "";
        string occupation = "";
        switch (oType)
        {
            case Warrior:
                atk += 20;
                def += 100;
                skillInfo = "冲锋";
                occupation = "战士";
                break;
            case Hunter:
                atk += 120;
                def += 30;
                skillInfo = "假死";
                occupation = "猎人";
                break;
            case Master:
                atk += 200;
                def += 10;
                skillInfo = "奥术冲击";
                occupation = "法师";
                break;
            default:
                cout << "请输入正确的职业类型" << endl;
                return 0;
        }

        cout << "你选择了“" << sexStr + occupation << "”,攻击力:" << atk << ",防御力:"
            << def << ",职业技能:" << skillInfo << endl;
    }
    catch (const std::exception&)
    {
        cout << "请输入正确的数字" << endl;
    }

    #pragma endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏