3.枚举

3.复杂数据类型-枚举


3.1 知识点

基本概念

枚举是什么

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

声明枚举和声明枚举变量

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

声明枚举语法

枚举名以E或者E_开头作为我们的命名规范。声明枚举语法示例:

  • 示例一

    enum E_自定义枚举名
    {
        自定义枚举项名字, //枚举中包裹的整形常量,第一个默认值是0,下面会依次累加
        自定义枚举项名字1,//1
        自定义枚举项名字2,//2
    }
    
  • 示例二

    enum E_自定义枚举名2
    {
        自定义枚举项名字 = 5, //第一个枚举项的默认值变成5了 
        自定义枚举项名字1,// 6
        自定义枚举项名字2 = 100,
        自定义枚举项名字3,//101
        自定义枚举项名字4,//102
    }
    

在哪里声明枚举

  • namespace语句块中(常用)
  • class语句块中、struct语句块中(不常用)

注意:枚举不能在函数语句块中声明!

声明枚举示例:

  • 示例一

    enum E_MonsterType
    {
        Normal,//0
        Boss,//1
    }
    
  • 示例二

    enum E_PlayerType
    { 
        Main,
        Other,
    }
    

枚举的使用

  • 声明枚举变量

    //自定义的枚举类型 变量名 = 默认值;(自定义的枚举类型.枚举项)
    E_PlayerType playerType = E_PlayerType.Other;
    
  • 枚举变量的逻辑判断

    if( playerType == E_PlayerType.Main )
    {
        Console.WriteLine("主玩家逻辑");
    }
    else if(playerType == E_PlayerType.Other)
    {
        Console.WriteLine("其它玩家逻辑");
    }
    
  • 枚举和switch是天生一对

    E_MonsterType monsterType = E_MonsterType.Boss;
    switch (monsterType)
    {
        case E_MonsterType.Normal:
            //Console.WriteLine("普通怪物逻辑");
            //break;
        case E_MonsterType.Boss:
            Console.WriteLine("Boss逻辑");
            break;
        default:
            break;
    }
    

枚举的类型转换

playerType = E_PlayerType.Main; 设置枚举变量为第0个枚举。

  • 枚举和int互转

    • 枚举转int

      int i = (int)playerType;
      Console.WriteLine(i);//0
      
    • int转枚举

      playerType = 0;
      Console.WriteLine(playerType);//Main
      
  • 枚举和string相互转换

    • 枚举转string

      string str = playerType.ToString();
      Console.WriteLine(str);//Main
      
    • string转枚举

      //public static object Parse(Type enumType, string value);
      //第一个参数:你要转为哪个枚举类型
      //第二个参数:用于转换的对应枚举项的字符串
      //执行Parse方法后 会返回一个object类型 我们需要用括号吧object类型强转成我们想要的目标枚举类型
      playerType = (E_PlayerType)Enum.Parse(typeof(E_PlayerType), "Other");
      Console.WriteLine(playerType);//Other
      

枚举的作用

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


3.2 知识点代码

using System;

namespace Lesson01_枚举
{

    #region 知识点一 基本概念

    #region 1.枚举是什么 
    //枚举是一个比较特别的存在
    //它是一个被命名的整形常量的集合
    //一般用它来表示 状态 类型 等等
    #endregion

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

    #region 3.声明枚举语法

    // 枚举名 以E或者E_开头 作为我们的命名规范
    enum E_自定义枚举名
    {
        自定义枚举项名字, //枚举中包裹的 整形常量  第一个默认值是0 下面会依次累加
        自定义枚举项名字1,//1
        自定义枚举项名字2,//2
    }

    enum E_自定义枚举名2
    {
        自定义枚举项名字 = 5, //第一个枚举项的默认值 变成5了 
        自定义枚举项名字1,// 6
        自定义枚举项名字2 = 100,
        自定义枚举项名字3,//101
        自定义枚举项名字4,//102
    }

    #endregion

    #endregion

    #region 知识点二 在哪里声明枚举
    //1.namespace语句块中(常用)
    //2.class语句块中 struct语句块中(不常用)
    //注意:枚举不能在函数语句块中声明!!!
    //声明枚举示例:
    enum E_MonsterType
    {
        Normal,//0

        Boss,//1
    }

    enum E_PlayerType
    { 
        Main,
        Other,
    }


    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("枚举");

            #region 知识点三 枚举的使用
            //声明枚举变量
            //自定义的枚举类型  变量名 = 默认值;(自定义的枚举类型.枚举项)
            E_PlayerType playerType = E_PlayerType.Other;

            //枚举变量的逻辑判断
            if( playerType == E_PlayerType.Main )
            {
                Console.WriteLine("主玩家逻辑");
            }
            else if(playerType == E_PlayerType.Other)
            {
                Console.WriteLine("其它玩家逻辑");
            }

            //枚举和switch是天生一对
            E_MonsterType monsterType = E_MonsterType.Boss;
            switch (monsterType)
            {
                case E_MonsterType.Normal:
                    //Console.WriteLine("普通怪物逻辑");
                    //break;
                case E_MonsterType.Boss:
                    Console.WriteLine("Boss逻辑");
                    break;
                default:
                    break;
            }

            #endregion


            #region 知识点四 枚举的类型转换

            playerType = E_PlayerType.Main;//设置枚举变量为第0个枚举

            // 1.枚举和int互转

            //枚举转int
            int i = (int)playerType;
            Console.WriteLine(i);//0
            //int转枚举
            playerType = 0;
            Console.WriteLine(playerType);//Main

            // 2.枚举和string相互转换

            //枚举转string
            string str = playerType.ToString();
            Console.WriteLine(str);//Main
            //string转枚举
            //public static object Parse(Type enumType, string value);
            //第一个参数:你要转为哪个枚举类型
            //第二个参数:用于转换的对应枚举项的字符串
            //执行Parse方法后 会返回一个object类型 我们需要用括号吧object类型强转成我们想要的目标枚举类型
            playerType = (E_PlayerType)Enum.Parse(typeof(E_PlayerType), "Other");
            Console.WriteLine(playerType);//Other

            #endregion


            #region 知识点五 枚举的作用
            //在游戏开发中,对象很多时候 会有许多的状态
            //比如玩家 有一个动作状态 我们需要用一个变量或者标识 来表示当前玩家处于的是哪种状态
            //综合考虑 可能会使用 int 来表示他的状态
            // 1 行走 2 待机 3 跑步 4 跳跃。。。。。。。等等
            //枚举可以帮助我们 清晰的分清楚状态的含义
            #endregion
        }
    }
}

3.3 练习题

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

在命名空间中声明QQ状态的枚举:

// 三杠注释可以让鼠标点上去的时候有注释中的提示
/// <summary>
/// QQ状态枚举
/// </summary>
enum E_QQType
{
    /// <summary>
    /// 在线
    /// </summary>
    OnLine,
    /// <summary>
    /// 离开
    /// </summary>
    Leave,
    /// <summary>
    /// 忙碌
    /// </summary>
    Busy,
    /// <summary>
    /// 隐身
    /// </summary>
    Invisible,
}

主函数内让用户输入QQ的状态并将其转换成枚举类型:

try
{
    Console.WriteLine("请输入QQ的状态(0在线,1离开,2忙碌,3隐身)");
    int type = int.Parse(Console.ReadLine());
    E_QQType qqType = (E_QQType)type;
    Console.WriteLine(qqType);
}
catch
{
    Console.WriteLine("请输入数字");
}

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

在命名空间中声明咖啡类型枚举:

enum E_CafeType
{
    /// <summary>
    /// 中杯
    /// </summary>
    M,
    /// <summary>
    /// 大杯
    /// </summary>
    B,
    /// <summary>
    /// 超大杯
    /// </summary>
    S,
}

主函数内让用户输入要买的咖啡并打出对应花费:

try
{
    Console.WriteLine("请输入咖啡的种类(中杯0 大杯1 超大杯2)");
    int cafeType = int.Parse(Console.ReadLine());
    E_CafeType cType = (E_CafeType)cafeType;
    switch (cType)
    {
        case E_CafeType.M:
            Console.WriteLine("你购买了中杯咖啡,花费了35元");
            break;
        case E_CafeType.B:
            Console.WriteLine("你购买了大杯咖啡,花费了40元");
            break;
        case E_CafeType.S:
            Console.WriteLine("你购买了超大杯咖啡,花费了43元");
            break;
        default:
            Console.WriteLine("请输入正确类型");
            break;
    }
}
catch
{
    Console.WriteLine("请输入数字");
}

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

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

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

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

在命名空间中声明英雄性别枚举和英雄职业:

enum E_Sex
{
    Man,
    Woman,
}

enum E_Occupation
{
    /// <summary>
    /// 战士
    /// </summary>
    Warrior,
    /// <summary>
    /// 猎人
    /// </summary>
    Hunter,
    /// <summary>
    /// 法师
    /// </summary>
    Master,
}

主函数内让用户输入对应枚举并加对应属性,最后打印:

try
{
    Console.WriteLine("请选择性别(男0 女1)");
    E_Sex sex =

 (E_Sex)int.Parse(Console.ReadLine());
    string sexStr = "";
    int atk = 0;
    int def = 0;
    switch (sex)
    {
        case E_Sex.Man:
            sexStr = "男性";
            atk += 50;
            def += 100;
            break;
        case E_Sex.Woman:
            sexStr = "女性";
            atk += 150;
            def += 20;
            break;
    }
    Console.WriteLine("请选择职业(战士0 猎人1 法师2)");
    E_Occupation o = (E_Occupation)int.Parse(Console.ReadLine());
    string skill = "";
    string occupation = "";
    switch (o)
    {
        case E_Occupation.Warrior:
            atk += 20;
            def += 100;
            skill = "冲锋";
            occupation = "战士";
            break;
        case E_Occupation.Hunter:
            atk += 120;
            def += 30;
            skill = "假死";
            occupation = "猎人";
            break;
        case E_Occupation.Master:
            atk += 200;
            def += 10;
            skill = "奥术冲击";
            occupation = "法师";
            break;
        default:
            break;
    }

    Console.WriteLine("你选了\"{0}{1}\",攻击力:{2},防御力{3},职业技能:{4}", sexStr, occupation, atk, def, skill);
}
catch
{
    Console.WriteLine("请输入数字");
}

3.4 练习题代码

using System;

namespace Lesson01_练习题
{
    #region 练习题一
    //namespace中声明QQ状态枚举
    // 三杠注释可以让鼠标点上去的时候有注释中的提示
    /// <summary>
    /// QQ状态枚举
    /// </summary>
    enum E_QQType
    {
        /// <summary>
        /// 在线
        /// </summary>
        OnLine,
        /// <summary>
        /// 离开
        /// </summary>
        Leave,
        /// <summary>
        /// 忙碌
        /// </summary>
        Busy,
        /// <summary>
        /// 隐身
        /// </summary>
        Invisible,
    }
    #endregion

    #region 练习题二

    //namespace中声明咖啡类型枚举
    enum E_CafeType
    {
        /// <summary>
        /// 中杯
        /// </summary>
        M,
        /// <summary>
        /// 大杯
        /// </summary>
        B,
        /// <summary>
        /// 超大杯
        /// </summary>
        S,
    }
    #endregion

    #region 练习题三

    //namespace中声明英雄性别枚举和英雄职业
    enum E_Sex
    {
        Man,
        Woman,
    }

    enum E_Occupation
    {
        /// <summary>
        /// 战士
        /// </summary>
        Warrior,
        /// <summary>
        /// 猎人
        /// </summary>
        Hunter,
        /// <summary>
        /// 法师
        /// </summary>
        Master,
    }
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("枚举练习题");
            #region 练习题一
            //定义QQ状态的枚举,并提示用户选择一个在线状态,我们接受输入的数字,并将其转换成枚举类型

            //主函数内让用户输入QQ的状态并将其转换成枚举类型
            try
            {
                Console.WriteLine("请输入QQ的状态(0在线,1离开,2忙碌,3隐身)");
                int type = int.Parse(Console.ReadLine());
                E_QQType qqType = (E_QQType)type;
                Console.WriteLine(qqType);
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }
            #endregion

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

            //主函数内让用户输入要买的咖啡 并打出对应花费
            try
            {
                Console.WriteLine("请输入咖啡的种类(中杯0 大杯1 超大杯2)");
                int cafeType = int.Parse(Console.ReadLine());
                E_CafeType cType = (E_CafeType)cafeType;
                switch (cType)
                {
                    case E_CafeType.M:
                        Console.WriteLine("你购买了中杯咖啡,花费了35元");
                        break;
                    case E_CafeType.B:
                        Console.WriteLine("你购买了大杯咖啡,花费了40元");
                        break;
                    case E_CafeType.S:
                        Console.WriteLine("你购买了超大杯咖啡,花费了43元");
                        break;
                    default:
                        Console.WriteLine("请输入正确类型");
                        break;
                }
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }

            #endregion

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

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

            //主函数内让用户输入对应枚举并加对应属性 最后打印
            try
            {
                Console.WriteLine("请选择性别(男0 女1)");
                E_Sex sex = (E_Sex)int.Parse(Console.ReadLine());
                string sexStr = "";
                int atk = 0;
                int def = 0;
                switch (sex)
                {
                    case E_Sex.Man:
                        sexStr = "男性";
                        atk += 50;
                        def += 100;
                        break;
                    case E_Sex.Woman:
                        sexStr = "女性";
                        atk += 150;
                        def += 20;
                        break;
                }
                Console.WriteLine("请选择职业(战士0 猎人1 法师2)");
                E_Occupation o = (E_Occupation)int.Parse(Console.ReadLine());
                string skill = "";
                string occupation = "";
                switch (o)
                {
                    case E_Occupation.Warrior:
                        atk += 20;
                        def += 100;
                        skill = "冲锋";
                        occupation = "战士";
                        break;
                    case E_Occupation.Hunter:
                        atk += 120;
                        def += 30;
                        skill = "假死";
                        occupation = "猎人";
                        break;
                    case E_Occupation.Master:
                        atk += 200;
                        def += 10;
                        skill = "奥术冲击";
                        occupation = "法师";
                        break;
                    default:
                        break;
                }

                Console.WriteLine("你选了\"{0}{1}\",攻击力:{2},防御力{3},职业技能:{4}", sexStr, occupation, atk, def, skill);
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }

            #endregion
        }
    }
}


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

×

喜欢就点赞,疼爱就打赏