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