2.1 项目分析

2.1.1 项目功能简介

使用C#编写一个文字界面的“王者荣耀”角色扮演游戏。在游戏中,玩家通过账户和密码登录游戏,登录成功后

可选择一个英雄来扮演。每位英雄都拥有名称、描述、攻击力、防御力以及等级等相关属性。玩家可以控制英雄的

行为:购买装备、与怪物战斗等。运行效果图.。

解释

1)角色扮演:角色扮演游戏(Role-playing game,RPG)是一种常见的游戏类型,在游戏中,玩家扮演虚拟

世界中的一个或几个特定角色,在特定场景下进行游戏,角色根据不同的游戏情节和统计数据(如力量、灵敏度、

智力和魔法等)具有不同的能力,而这些属性会根据游戏规则在游戏情节中发生改变。

2)文字界面游戏:是指游戏中所有的交互均用文字来体现,没有画面和声音。

2.1.2 项目模块分析

根据“王者荣耀”游戏的执行效果可知,该项目分为4个模块,如图.。

1)玩家登录:用于实现根据玩家输入的账户和密码进行登录。

2)英雄选择:用于实现根据玩家输入英雄的编号,选择所扮演的英雄并显示英雄的基本信息。

3)购买装备:用于实现根据玩家输入的装备编号购买武器,武器购买成功后所扮演的英雄将装备对应武器,英

雄的攻击力和防御力会有所提升。

4)打怪练级:用于实现玩家所扮演的英雄打怪练级,打怪成功后将会获得奖励金币,用于购买装备。

 2.1.3 项目业务流程分析

 对“王者荣耀”游戏的执行效果进行分析可知,该项目的业务流程如下

1)玩家登录:使用循环结构进行登录验证,直到账户和密码输入正确为止。

2)选择英雄:显示英雄列表,选择所扮演的英雄并显示英雄的基本信息。

3)进入新手村:显示操作菜单,若用户选择“购买装备”,则进入购买装备模块;若用户选择“出村练级”,

则进入打怪练级模块。

4)购买装备:显示装备信息,并根据用户输入的装备编号购买装备。

5)打怪练级:使用循环结构与怪物对战,显示每次对战的信息,直到怪物生命值为零为止,并获取对应的

金币。

6)是否继续游戏:若用户输入“Y”,则继续游戏,再次进入新手村;若用户输入“N”,则游戏终止。

该项目业务流程如图.。

2.1.4 项目涉及技术

 1)方法。该项目中涉及到多个功能和模块,为了让程序的结构更加清晰,可将不同功能定义在不同方法中,实

现模块化的程序设计结构。

2)结构体。该项目中存在多个对象实体(英雄、武器和怪物)需要进行描述,每个对象实体都存在多个属性,

无法使用基本数据类型进行描述和存储,可使用结构体类型实现。

3)数组。该项目所操作的数据中,英雄、装备以及怪物存在多个,可使用结构体数组实现数据存储和操作,

更加方便。

4)各种流程控制语句。由项目的业务流程图可知,该项目需要使用顺序结构、选择结构以及循环结构实现对应

的业务流程,因此可使用各种流程控制语句实现对应要求。

5)运算符和表达式。在项目中需要进行多次计算,如与怪物对战过程中需要计算怪物在一次攻击中所受到的伤

害值,怪物伤害值=英雄攻击力+武器攻击力-怪物防御力。可使用运算符和表达式完成相关运算。

2.1.5 项目计划

“王者荣耀”项目计划12课时,如表.。

序号 任务 课时数
1 讲解项目分析、数据模型以及程序结构设计 2
2 完成结构体定义以及程序结构设计 2
3 讲解并完成玩家登录模块 1
4 讲解英雄选择模块 1
5 完成英雄选择模块 2
6 讲解购买装备模块 1
7 完成购买装备模块 1
8 讲解打怪升级模块 1
9 完成打怪升级模块 1

2.2 模块化程序结构的设计和实现

2.2.1 数据模型的设计和实现

“王者荣耀”项目中需要描述3个对象实体:怪物、装备以及英雄,每个对象实体由多个属性构成,需要定义对应

的结构体类型进行描述和存储数据。

1.怪物结构体

1)分析与设计

怪物在项目中主要作用涉及到与英雄对战,因此“怪物”对象应具备名称、攻击力、防御力以及生命值等属性。

由于英雄杀怪成功后,将掉落对应的金币,且英雄的经验值会增加,所以需要为“怪物”对象添加杀怪所获得的金

币以及经验值属性。怪物结构体设计见表.。

序号 成员 数据类型 备注
1 Name string 怪物名称
2 Attack int 攻击力
3 Defense int 防御力
4 Life int 生命值
5 KillMoney int 杀怪所获得的金币
6 KillExp int 杀怪所获得的经验值

2)具体实现

1 public struct Monster //怪物结构体
2 {
3     public string Name;
4     public int Attack;
5     public int Defense;
6     public int Life;
7     public int KillMoney;
8     public int KillExp;
9 }

2.装备结构体

1)分析与设计

英雄可以通过金币购买所需要的装备,成功购买装备后可以提高其攻击力和防御力。因此“装备”对象应具备名称、

攻击力、防御力以及购买价格等属性。装备结构体设计见表.。

序号 成员 数据类型 备注
1 Name string 装备名称
2 Attack int 攻击力
3 Defense int 防御力
4 Money int 购买价格

2)具体实现

1 public struct Equip //装备结构体
2 {
3     public string Name; 
4     public int Money;
5     public int Attack;
6     public int Defense;
7 }

3.英雄结构体

1)分析与设计

在项目中需要显示英雄列表以及其基本信息,因此可以为“英雄”对象添加英雄名称以及简介等属性。英雄既可以

打怪练级,也可以购买装备,所以需要为“英雄”对象添加攻击力、防御力、等级、所拥有的金币数、所拥有的经

验值、武器以及防具等属性。英雄结构体设计见表.。

序号 成员 数据类型 备注
1 Name string 英雄名称
2 Desc string 英雄简介
3 Attack int 攻击力
4 Defense int 防御力
5 Level int 等级
6 TotalMoney int 所拥有的金币数
7 TotalExp int 所拥有的经验值
8 AttackEquip Equip 武器
9 DefenseEquip Equip 防具

2)具体实现

 1 public struct Hero //英雄结构体
 2 {   
 3     public string Name;
 4     public string Desc;
 5     public int Attack;
 6     public int Defense;
 7     public int Level;
 8     public int TotalMoney;
 9     public int TotalExp;
10     public Equip AttackEquip;
11     public Equip DefenseEquip;
12 }

2.2.2 程序结构的设计和实现

使用模块化程序结构设计思路,将不同的功能定义在不同方法中完成。将项目所包含的四个模块分别定义为方法实

现对应功能,并由主方法实现程序执行流程的控制。

1.玩家登录方法

1 public static bool Login() //玩家登录方法
2 {
3     return true;
4 }

其中,返回值为bool类型,用于表示登录验证的结果,若返回值为true,表示验证通过,登录成功;若返回值为

false,表示验证未通过,登录失败。

2.英雄选择

1 public static Hero SelectHero() //英雄选择方法
2 {
3     return new Hero();
4 }

其中,返回值为Hero结构体类型,用于表示用户当前所选择的英雄。

3.购买装备

1 public static void BuyEquip(ref Hero player) //购买装备
2 {
3 }

其中,参数为Hero结构体类型,用于表示当前进行购买装备的英雄,之所以使用ref关键字,用于表示按引用方

式传参,因为在购买装备的操作中,需要修改当前英雄的相关属性,为了让方法中对英雄相关属性的修改能够保留,

因此使用ref关键字。

4.打怪练级

1 public static void Fight(ref Hero player) //打怪练级
2 {
3 }

其中,参数为Hero结构体类型,用于表示当前进行打怪练级的英雄。之所以使用ref关键字,用于表示按引用方

式传参,因为在打怪练级操作中,需要修改当前英雄的相关属性,为了让方法中对英雄相关属性的修改能够保留,

因此使用ref关键字。

5.主方法

 1 static void Main(string[] args)
 2 {
 3     Console.WriteLine("--------------------");
 4     Console.WriteLine("      王者荣耀      ");
 5     Console.WriteLine("--------------------");
 6     bool isPassed = false; //玩家登录
 7     do
 8     {
 9         isPassed = Login();
10     } while (isPassed == false);
11     Console.WriteLine("召唤师,欢迎来到王者荣耀!");
12     Console.WriteLine("在这片虚构的王者大陆上,重生的英雄们演绎着新的传奇");
13     Console.WriteLine("准备好了吗?精彩对战即将爆发!");
14     Hero player = SelectHero(); //选择英雄
15     Console.Write("你已经选择了英雄:"+player.Name+",");
16     Console.WriteLine("下面开始你的王者大陆之旅吧!");
17     Console.WriteLine("--------------------");
18     Console.WriteLine("       新手村       ");
19     Console.WriteLine("--------------------");
20     string isExitGame = "n";
21     do
22     {
23         Console.WriteLine("1.购买装备");
24         Console.WriteLine("2.出村练级");
25         Console.WriteLine("请输入对应功能编号进行选择。");
26         string selectMenu = Console.ReadLine();
27         switch (selectMenu)
28         {
29             case"1":
30                 BuyEquip(ref player); //购买装备
31                 break;
32             case "2":
33                 Fight(ref player); //打怪升级
34                 break;
35         }
36         Console.WriteLine("是否继续游戏?(y/n)");
37         isExitGame = Console.ReadLine();
38     } while (isExitGame != "n");
39 }

 2.3 登录模块的设计和实现

2.3.1 业务流程分析

使用循环结构进行登录验证,直到登录成功为止。根据用户输入的账户和密码进行判断,若输入账户为“admin”

且密码为“123”,则提示“登录成功”,并跳出循环;否则提示“登录失败”,继续进行登录验证。运行效果图.。

2.3.2 具体实现

 1 public static bool Login() //玩家登录方法
 2 {
 3     Console.WriteLine("-------登录-------");
 4     Console.WriteLine("请输入账号:");
 5     string userName = Console.ReadLine();
 6     Console.WriteLine("请输入密码:");
 7     string userPwd = Console.ReadLine();
 8     if (userName=="admin"&&userPwd=="123")
 9     {
10         Console.WriteLine("登录成功!");
11         Console.WriteLine("-----------------");
12         return true;
13     }else
14     {
15         Console.WriteLine("登录失败!");
16         Console.WriteLine("------------------");
17         return false;       
18     }
19 }

2.4 选择英雄模块的设计和实现

2.4.1 业务流程分析

在选择英雄模块中,程序执行流程如下:

1)初始化所有英雄的信息。

2)显示英雄列表。

3)根据用户输入的编号选择所扮演的英雄。

4)显示所选英雄的基本信息。

需注意的是,在显示所选英雄的基本信息时,需要计算英雄的实际攻击力和实际防御力,因为英雄攻击力和防御力

会根据等级变化而增长。

英雄实际攻击力计算公式:英雄攻击力+英雄等级*0.3*攻击力。

英雄实际防御力计算公式:英雄防御力+英雄等级*0.15*防御力。

运行效果图.。

2.4.2 模块结构的设计

选择英雄模块包含多个功能,相对比较复杂,若将所有功能全部在选择英雄模块对应的方法SelectHero()中实现,

会造成方法体过长,导致程序结构不清晰,可读性不高,因此,可根据业务功能定义不同方法实现。英雄攻击力和

防御力会根据等级变化而增长,所以在显示所选英雄的基本信息时需要计算英雄的实际攻击力和防御力,而在打怪

练级模块中也需要相同的计算,因此可以将计算英雄的实际攻击力和防御力的功能定义为方法,提升代码复用性,

各方法设计如下。

1)初始化英雄信息方法

方法签名:public static Hero[] InitHeros()

其中,返回值为Hero结构体类型数组,用于返回所有可选择的英雄信息。

2)显示英雄列表方法

方法签名:public static void ShowHeroList(Hero[] heros)

其中,参数为Hero结构体类型数组,用于传递所有可选择的英雄信息。

3)显示所选英雄的基本信息方法

方法签名:public static void ShowHeroInfo(Hero hero)

其中,参数为Hero结构体类型,用于表示当前所选的英雄。

4)计算所选英雄的实际攻击力方法

方法签名:public static double HeroAttack(Hero hero)

其中,参数为Hero结构体类型,用于表示当前所选的英雄,返回值为实际的攻击力。

5)计算所选英雄的实际防御力方法

方法签名:public static double HeroDefense(Hero hero)

其中,参数为Hero结构体类型,用于表示当前所选的英雄,返回值为实际的防御力。

2.4.3 具体实现

1.初始化英雄信息方法

定义长度为5的Hero结构体数组,用于存储5位可选英雄的信息,并通过下标逐一初始化,初始化完毕将数

组作为返回值返回。完整代码如下:

 1 public static Hero[] InitHeros() //初始化英雄信息方法
 2 {
 3     Hero[] heros = new Hero[5];
 4     heros[0] = new Hero(); 
 5     heros[0].Name = "东皇太一";
 6     heros[0].Desc = "楚人于东方立祠祭祀天神,故称东皇。太一则有多种说法,一指星名,又有称是形容神力无边广大。";
 7     heros[0].Attack = 43;
 8     heros[0].Defense = 35;
 9     heros[0].Level = 1;
10     heros[0].TotalMoney = 200;
11     heros[1] = new Hero(); 
12     heros[1].Name = "大乔";
13     heros[1].Desc = "即小乔的姐姐,江东庐江桥玄的女儿。传说都是国色天香,大乔嫁给了孙策,在《三国志》里有零星的记载。";
14     heros[1].Attack = 62;
15     heros[1].Defense = 30;
16     heros[1].Level = 1;
17     heros[2] = new Hero(); 
18     heros[2].Name = "程咬金";
19     heros[2].Desc = "即程知节,本名程咬金。秦王李世民帐下的骁将。";
20     heros[2].Attack = 47;
21     heros[2].Defense = 37;
22     heros[2].Level = 1;
23     heros[3] = new Hero(); 
24     heros[3].Name = "赵云";
25     heros[3].Desc = "赵云是三国时的蜀汉名将。常山真定人,字子龙。公孙瓒败亡,投奔刘备。赵云一生都效忠于蜀国。";
26     heros[3].Attack = 45;
27     heros[3].Defense = 32;
28     heros[3].Level = 1;
29     heros[4] = new Hero(); 
30     heros[4].Name = "孙尚香";
31     heros[4].Desc = "刘备的续弦夫人,人称孙夫人,孙尚香只是孙夫人在民间传说中的名字。";
32     heros[4].Attack = 58;
33     heros[4].Defense = 28;
34     heros[4].Level = 1;
35     return heros; //返回所有英雄信息
36 }

2.显示英雄列表方法

该方法的参数为Hero结构体类型数组,其中存储所有可选的英雄信息,使用for循环结构遍历数组中所有元素,

输出每个英雄对应的名称。完整代码如下:

1 public static void ShowHeroList(Hero[] heros) //显示英雄列表方法
2 {
3     Console.WriteLine("英雄列表:");
4     for (int i = 0; i < heros.Length; i++)
5     {
6         Console.WriteLine("{0}.{1}",i+1,heros[i].Name);
7     }
8 }

3.计算所选英雄的实际攻击力方法

该方法的参数为所选择的英雄,根据英雄的实际攻击力计算公式进行计算,并将计算结果作为返回值返回。完整代

码如下:

1 public static double HeroAttack(Hero hero) //计算所选英雄的实际攻击力方法
2 {
3     return hero.Attack * (1 + hero.Level * 0.3);
4 }

4.计算所选英雄的实际防御力方法

该方法的参数为所选择的英雄,根据英雄的实际防御力计算公式进行计算,并将计算结果作为返回值返回。完整代

码如下:

1 public static double HeroDefense(Hero hero) //计算所选英雄的实际防御力方法
2 {
3     return hero.Defense * (1 + hero.Level * 0.15);
4 }

5.显示所选英雄的基本信息方法

该方法的参数为选择的英雄,输出英雄的基本信息(姓名、简介、等级、实际攻击力以及实际防御力)。计算实

际攻击力和防御力时可调用HeroAttack()方法和HeroDefense()方法实现。完整代码如下:

1 public static void ShowHeroInfo(Hero hero) //显示所选英雄的基本信息方法
2 {
3     Console.WriteLine("姓名:" + hero.Name);
4     Console.WriteLine("简介:" + hero.Desc);
5     Console.WriteLine("等级:{0},伤害:{1},防御:{2}",hero.Level,HeroAttack(hero),HeroDefense(hero));
6 }

6.英雄选择方法

在SelectHero()方法中调用方法实现英雄选择功能,完整代码如下:

 1 public static Hero SelectHero() //英雄选择方法
 2 {
 3     Hero[] heros = InitHeros(); 
 4     Console.WriteLine("--------------------");
 5     Console.WriteLine("       英雄列表      ");
 6     Console.WriteLine("--------------------");
 7     ShowHeroList(heros);
 8     Console.Write("请选择英雄编号,查看英雄属性!");
 9     int heroIndex = int.Parse(Console.ReadLine());
10     Hero selectHero;
11     switch (heroIndex) //存储当前选择的英雄
12     {
13         case 1:
14         case 2:
15         case 3:
16         case 4:
17         case 5:
18             selectHero = heros[heroIndex - 1];
19             break;
20         default:
21             selectHero = heros[0];
22             Console.WriteLine("编号输入错误,默认选中第一个英雄开始游戏");
23             break;
24     }
25     ShowHeroInfo(selectHero);
26     return selectHero;
27 }

2.5 购买装备模块的设计和实现

2.5.1 业务流程分析

在购买装备模块中,程序执行流程如下:

1)初始化所有装备的信息

2)显示装备列表

3)根据用户输入的编号选择所要购买的装备。

4)购买并装备武器

需注意的是,在购买和装备武器的过程中,需要判断所购买的武器类型。若装备的防御力为0,则表示装备为武器,

将会提升英雄的攻击力,应装备在英雄的武器属性中;若装备的防御力不为0,则表示装备为防具,将会提升英雄

的防御力,应装备在英雄的防具属性中。运行效果图.。

2.5.2 模块结构的设计

购买装备模块同样包含了多个功能,根据模块化程序设计思路,可根据业务功能定义不同方法实现,各方法设计如下:

1.初始化装备信息方法

方法签名:public static Equip[] InitEquips()

其中,返回值为Equip结构体类型数组,用于返回所有可购买的装备信息。

2.显示装备列表方法

方法签名:public static void ShowEquipList(Equip[] equips)

其中,参数为Equip结构体类型数组,用于传递所有可购买的装备信息。

3.购买并装备武器方法

方法签名:public static void BuyAndTakeOnEquip(ref Hero player, Equip buyEquip)

其中,第一个参数为Hero数据类型,用于表示当前所扮演的英雄,由于在方法中需要更新英雄所拥有的金币数

以及装备,且要求在方法中的修改能够被保留,因此需要使用ref关键字实现引用方式传递参数。第二个参数为

Equip结构体类型,用于表示所需购买的装备信息 。

上述方法调用关系如图.。

2.5.3 具体实现

1.初始化装备信息方法

定义长度为4的Equip结构体类型数组,用于存储4中可购买的装备信息,并通过下标逐一初始化,初始化完毕

将数组作为返回值返回。完整代码如下:

 1 public static Equip[] InitEquips() //初始化装备信息方法
 2 {
 3     Equip[] equips = new Equip[4];
 4     equips[0].Name = "铁剑";
 5     equips[0].Money = 100;
 6     equips[0].Attack = 15;
 7     equips[0].Defense = 0;
 8     equips[1].Name = "匕首";
 9     equips[1].Money = 500;
10     equips[1].Attack = 25;
11     equips[1].Defense = 0;
12     equips[2].Name = "布甲";
13     equips[2].Money = 200;
14     equips[2].Attack = 0;
15     equips[2].Defense = 10;
16     equips[3].Name = "雪山圆盾";
17     equips[3].Money = 600;
18     equips[3].Attack = 0;
19     equips[3].Defense = 20;
20     return equips; //返回装备信息
21 }

2.显示装备列表方法

该方法的参数为Equip结构体类型数组,其中存储所有可购买的装备信息,使用for循环结构遍历数组中的所有元

素,输出每种装备对应的信息。完整代码如下:

1 public static void ShowEquipList(Equip[] equips) //显示装备列表方法
2 {
3     for (int i = 0; i < equips.Length; i++)
4     {
5         Console.WriteLine("{0}:{1},金币:{2},攻击力:{3},防御力:{4}",i+1,equips[i].Name,equips[i].Money,equips[i].Attack,equips[i].Defense);
6     }
7 }

3.购买并装备武器方法

在方法中,先根据英雄所拥有的金币数和购买所选装备所需的金币数进行比较,判断是否能够购买,若满足购买条

件,则在英雄所拥有的金币数中扣除购买装备所需的金币数,之后根据所购买装备类型(武器或防具),将其设置

在英雄对应的属性中。完整代码如下:

 1 public static void BuyAndTakeOnEquip(ref Hero player, Equip buyEquip) //购买并装备武器方法
 2 {
 3     if (player.TotalMoney<buyEquip.Money)
 4     {
 5         Console.WriteLine("您的金币不足,购买失败!");
 6     }else
 7     {//在英雄所拥有的金币中扣除购买装备所需金币数
 8         player.TotalMoney -= buyEquip.Money;
 9         Console.WriteLine("{0}购买成功,花费{1}金币!",buyEquip.Name,buyEquip.Money);
10         //为英雄装备武器,如果是攻击性武器,防御值为0,装备在英雄的武器属性中
11         if (buyEquip.Defense == 0)
12             player.AttackEquip = buyEquip;
13         else //如果是防御性武器,攻击值为0,装备在英雄的防具属性中
14             player.DefenseEquip = buyEquip;
15     }
16 }

4.购买装备方法

在BuyEquip()方法中调用方法实现购买装备功能,完整代码如下:

 1 public static void BuyEquip(ref Hero player) //购买装备
 2 {   
 3     Console.WriteLine("----------------");
 4     Console.WriteLine("------ 商店 ------");
 5     Console.WriteLine("----------------");
 6     Equip[] equips = InitEquips(); //初始化装备信息
 7     ShowEquipList(equips); //显示装备列表
 8     //根据用户输入购买商品
 9     Console.WriteLine("你拥有{0}个金币",player.TotalMoney); 
10     Console.WriteLine("请输入装备对应编号来购买装备。");
11     int equipIndex = int.Parse(Console.ReadLine());
12     Equip buyEquip;
13     switch (equipIndex)
14     {
15         case 1:
16         case 2:
17         case 3:
18         case 4:
19             buyEquip = equips[equipIndex - 1];
20             break;
21         default:
22             buyEquip = equips[0];
23             Console.WriteLine("编号输入错误,默认购买第一个装备进行游戏");
24             break;
25     }
26     BuyAndTakeOnEquip(ref player, buyEquip);//购买并装备武器
27 }

2.6 打怪练级模块的设计和实现

2.6.1 业务流程分析

在打怪练级模块中,程序执行流程如下:

1)初始化怪物信息。

2)循环进行攻击怪物。

3)获取打怪成功后的金币和经验值,并显示当前英雄状态信息。

需注意的是,在攻击怪物过程中,一次攻击对怪物造成的伤害值=英雄实际攻击力+所装备武器的攻击力-

怪物自身的防御力。每次打怪成功会获得相应的金币和经验值,金币可以用于购买装备,从而提升英雄的攻击力或

防御力,而经验值则可以进行累加,每次升级需要500经验值,当满足升级条件时,英雄将会升级,升级之后英

雄的攻击力、防御力都会提升,但同时怪物的攻击、防御力以及生命值也会提升。运行效果图.。

2.6.2 模块结构设计

打怪练级模块虽然包含多个功能,但是由于代码相对较少,因此可以在打怪练级模块对应的方法Fight()中完成对应

功能实现。根据业务流程可将该模块划分为4个部分,各部分设计如下:

1.初始化怪物信息

英雄每次和一个怪物进行对战,因此需要声明一个Monster结构体类型的变量存储怪物信息并进行初始化,怪物

的各项属性值与英雄等级相关,会随着英雄级别的增长而增长。对应规则如下:

怪物的生命值=180+英雄等级x10

怪物的攻击力=10+英雄等级x2

怪物防御力=20+英雄等级x2

打怪成功所掉落的金币数=50+英雄等级x10

打怪成功所增长的经验值=100+英雄等级x10

2.循环进行攻击怪物

打怪是一个循环攻击过程,直到怪物的生命值小于等于0为止,可使用do-while循环实现,循环条件与循环体

如下:

循环条件:怪物的生命值大于0

循环体:计算一次攻击对怪物所造成的伤害值。输出本次攻击信息,根据伤害值计算怪物当前所剩余的生命值。其

中,一次攻击对怪物所造成的伤害值=英雄的实际攻击力+所装备武器的攻击力-怪物自身的防御力。

3.获取打怪成功后的金币和经验值,并显示当前英雄状态信息

打怪成功后,需在英雄的金币属性和经验值属性上累加打怪成功所获的金币数和经验值,并根据英雄当前的经验值

判断是否满足升级条件(累计经验值>500),若满足升级条件,则在对应等级属性上累加1,并在经验值属性上

减去500,之后显示英雄当前的状态(金币数、经验值以及等级信息)。

2.6.3 具体实现

 1 public static void Fight(ref Hero player) //打怪练级
 2 {
 3     //初始化怪物
 4     Monster monster;
 5     monster.Name = "荒野小怪";
 6     monster.Life = 180 + player.Level * 10;
 7     monster.Attack= 10 + player.Level * 2;
 8     monster.Defense = 20 + player.Level * 2;
 9     monster.KillMoney = 50 + player.Level * 10;
10     monster.KillExp = 100 + player.Level * 10;
11     //英雄攻击怪物,直到怪物死亡
12     do
13     {
14         int demage = (int)HeroAttack(player) + player.AttackEquip.Attack - monster.Defense;
15         Console.WriteLine("{0}对{1}产生了{2}伤害!",player.Name,monster.Name,demage);
16         monster.Life -= demage;
17     } while (monster.Life>0);
18     //杀死怪物,英雄获得金币
19     Console.WriteLine("{0}被杀死,获得{1}金币,获得{2}经验",monster.Name,monster.KillMoney,monster.KillExp);
20     //获取杀怪金币和经验值
21     player.TotalMoney += monster.KillMoney;
22     player.TotalExp += monster.KillExp;
23     //判断是否升级,每个等级所需经验值500
24     if (player.TotalExp>500)
25     {
26         player.Level++;
27         player.TotalExp -= 500;
28         Console.WriteLine("恭喜你,升级成功过,当前等级:{0}",player.Level);
29     }
30     Console.WriteLine("英雄{0}:金币数:{1},等级:{2},经验值:{3}",player.Name,player.TotalMoney,player.Level,player.TotalExp);
31 }

看不懂?

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace Task69
  8 {
  9     public struct Monster //怪物结构体
 10     {
 11         public string Name;
 12         public int Attack;
 13         public int Defense;
 14         public int Life;
 15         public int KillMoney;
 16         public int KillExp;
 17     }
 18     public struct Equip //装备结构体
 19     {
 20         public string Name; 
 21         public int Money;
 22         public int Attack;
 23         public int Defense;
 24     }
 25     public struct Hero //英雄结构体
 26     {   
 27         public string Name;
 28         public string Desc;
 29         public int Attack;
 30         public int Defense;
 31         public int Level;
 32         public int TotalMoney;
 33         public int TotalExp;
 34         public Equip AttackEquip;
 35         public Equip DefenseEquip;
 36     }
 37     class Program
 38     {
 39         //BCA BCB
 40         public static double HeroAttack(Hero hero) //计算所选英雄的实际攻击力方法
 41         {
 42             return hero.Attack * (1 + hero.Level * 0.3);
 43         }
 44         public static double HeroDefense(Hero hero) //计算所选英雄的实际防御力方法
 45         {
 46             return hero.Defense * (1 + hero.Level * 0.15);
 47         }
 48         //BA BB BC
 49         public static Hero[] InitHeros() //初始化英雄信息方法
 50         {
 51             Hero[] heros = new Hero[5];
 52             heros[0] = new Hero(); 
 53             heros[0].Name = "东皇太一";
 54             heros[0].Desc = "楚人于东方立祠祭祀天神,故称东皇。太一则有多种说法,一指星名,又有称是形容神力无边广大。";
 55             heros[0].Attack = 43;
 56             heros[0].Defense = 35;
 57             heros[0].Level = 1;
 58             heros[0].TotalMoney = 200;
 59             heros[1] = new Hero(); 
 60             heros[1].Name = "大乔";
 61             heros[1].Desc = "即小乔的姐姐,江东庐江桥玄的女儿。传说都是国色天香,大乔嫁给了孙策,在《三国志》里有零星的记载。";
 62             heros[1].Attack = 62;
 63             heros[1].Defense = 30;
 64             heros[1].Level = 1;
 65             heros[2] = new Hero(); 
 66             heros[2].Name = "程咬金";
 67             heros[2].Desc = "即程知节,本名程咬金。秦王李世民帐下的骁将。";
 68             heros[2].Attack = 47;
 69             heros[2].Defense = 37;
 70             heros[2].Level = 1;
 71             heros[3] = new Hero(); 
 72             heros[3].Name = "赵云";
 73             heros[3].Desc = "赵云是三国时的蜀汉名将。常山真定人,字子龙。公孙瓒败亡,投奔刘备。赵云一生都效忠于蜀国。";
 74             heros[3].Attack = 45;
 75             heros[3].Defense = 32;
 76             heros[3].Level = 1;
 77             heros[4] = new Hero(); 
 78             heros[4].Name = "孙尚香";
 79             heros[4].Desc = "刘备的续弦夫人,人称孙夫人,孙尚香只是孙夫人在民间传说中的名字。";
 80             heros[4].Attack = 58;
 81             heros[4].Defense = 28;
 82             heros[4].Level = 1;
 83             return heros; //返回所有英雄信息
 84         }
 85         public static void ShowHeroList(Hero[] heros) //显示英雄列表方法
 86         {
 87             Console.WriteLine("英雄列表:");
 88             for (int i = 0; i < heros.Length; i++)
 89             {
 90                 Console.WriteLine("{0}.{1}",i+1,heros[i].Name);
 91             }
 92         }
 93         public static void ShowHeroInfo(Hero hero) //显示所选英雄的基本信息方法
 94         {
 95             Console.WriteLine("姓名:" + hero.Name);
 96             Console.WriteLine("简介:" + hero.Desc);
 97             Console.WriteLine("等级:{0},伤害:{1},防御:{2}",hero.Level,HeroAttack(hero),HeroDefense(hero));
 98         }
 99         //CA CB CC
100         public static Equip[] InitEquips() //初始化装备信息方法
101         {
102             Equip[] equips = new Equip[4];
103             equips[0].Name = "铁剑";
104             equips[0].Money = 100;
105             equips[0].Attack = 15;
106             equips[0].Defense = 0;
107             equips[1].Name = "匕首";
108             equips[1].Money = 500;
109             equips[1].Attack = 25;
110             equips[1].Defense = 0;
111             equips[2].Name = "布甲";
112             equips[2].Money = 200;
113             equips[2].Attack = 0;
114             equips[2].Defense = 10;
115             equips[3].Name = "雪山圆盾";
116             equips[3].Money = 600;
117             equips[3].Attack = 0;
118             equips[3].Defense = 20;
119             return equips; //返回装备信息
120         }
121         public static void ShowEquipList(Equip[] equips) //显示装备列表方法
122         {
123             for (int i = 0; i < equips.Length; i++)
124             {
125                 Console.WriteLine("{0}:{1},金币:{2},攻击力:{3},防御力:{4}",i+1,equips[i].Name,equips[i].Money,equips[i].Attack,equips[i].Defense);
126             }
127         }
128         public static void BuyAndTakeOnEquip(ref Hero player, Equip buyEquip) //购买并装备武器方法
129         {
130             if (player.TotalMoney<buyEquip.Money)
131             {
132                 Console.WriteLine("您的金币不足,购买失败!");
133             }else
134             {//在英雄所拥有的金币中扣除购买装备所需金币数
135                 player.TotalMoney -= buyEquip.Money;
136                 Console.WriteLine("{0}购买成功,花费{1}金币!",buyEquip.Name,buyEquip.Money);
137                 //为英雄装备武器,如果是攻击性武器,防御值为0,装备在英雄的武器属性中
138                 if (buyEquip.Defense == 0)
139                     player.AttackEquip = buyEquip;
140                 else //如果是防御性武器,攻击值为0,装备在英雄的防具属性中
141                     player.DefenseEquip = buyEquip;
142             }
143         }
144         //A B C D
145         public static bool Login() //玩家登录方法
146         {
147             Console.WriteLine("-------登录-------");
148             Console.WriteLine("请输入账号:");
149             string userName = Console.ReadLine();
150             Console.WriteLine("请输入密码:");
151             string userPwd = Console.ReadLine();
152             if (userName=="admin"&&userPwd=="123")
153             {
154                 Console.WriteLine("登录成功!");
155                 Console.WriteLine("-----------------");
156                 return true;
157             }else
158             {
159                 Console.WriteLine("登录失败!");
160                 Console.WriteLine("------------------");
161                 return false;       
162             }
163         }
164         public static Hero SelectHero() //英雄选择方法
165         {
166             Hero[] heros = InitHeros(); 
167             Console.WriteLine("--------------------");
168             Console.WriteLine("       英雄列表      ");
169             Console.WriteLine("--------------------");
170             ShowHeroList(heros);
171             Console.Write("请选择英雄编号,查看英雄属性!");
172             int heroIndex = int.Parse(Console.ReadLine());
173             Hero selectHero;
174             switch (heroIndex) //存储当前选择的英雄
175             {
176                 case 1:
177                 case 2:
178                 case 3:
179                 case 4:
180                 case 5:
181                     selectHero = heros[heroIndex - 1];
182                     break;
183                 default:
184                     selectHero = heros[0];
185                     Console.WriteLine("编号输入错误,默认选中第一个英雄开始游戏");
186                     break;
187             }
188             ShowHeroInfo(selectHero);
189             return selectHero;
190         }
191         public static void BuyEquip(ref Hero player) //购买装备
192         {   
193             Console.WriteLine("----------------");
194             Console.WriteLine("------ 商店 ------");
195             Console.WriteLine("----------------");
196             Equip[] equips = InitEquips(); //初始化装备信息
197             ShowEquipList(equips); //显示装备列表
198             //根据用户输入购买商品
199             Console.WriteLine("你拥有{0}个金币",player.TotalMoney); 
200             Console.WriteLine("请输入装备对应编号来购买装备。");
201             int equipIndex = int.Parse(Console.ReadLine());
202             Equip buyEquip;
203             switch (equipIndex)
204             {
205                 case 1:
206                 case 2:
207                 case 3:
208                 case 4:
209                     buyEquip = equips[equipIndex - 1];
210                     break;
211                 default:
212                     buyEquip = equips[0];
213                     Console.WriteLine("编号输入错误,默认购买第一个装备进行游戏");
214                     break;
215             }
216             BuyAndTakeOnEquip(ref player, buyEquip);//购买并装备武器
217         }
218         public static void Fight(ref Hero player) //打怪练级
219         {
220             //初始化怪物
221             Monster monster;
222             monster.Name = "荒野小怪";
223             monster.Life = 180 + player.Level * 10;
224             monster.Attack= 10 + player.Level * 2;
225             monster.Defense = 20 + player.Level * 2;
226             monster.KillMoney = 50 + player.Level * 10;
227             monster.KillExp = 100 + player.Level * 10;
228             //英雄攻击怪物,直到怪物死亡
229             do
230             {
231                 int demage = (int)HeroAttack(player) + player.AttackEquip.Attack - monster.Defense;
232                 Console.WriteLine("{0}对{1}产生了{2}伤害!",player.Name,monster.Name,demage);
233                 monster.Life -= demage;
234             } while (monster.Life>0);
235             //杀死怪物,英雄获得金币
236             Console.WriteLine("{0}被杀死,获得{1}金币,获得{2}经验",monster.Name,monster.KillMoney,monster.KillExp);
237             //获取杀怪金币和经验值
238             player.TotalMoney += monster.KillMoney;
239             player.TotalExp += monster.KillExp;
240             //判断是否升级,每个等级所需经验值500
241             if (player.TotalExp>500)
242             {
243                 player.Level++;
244                 player.TotalExp -= 500;
245                 Console.WriteLine("恭喜你,升级成功过,当前等级:{0}",player.Level);
246             }
247             Console.WriteLine("英雄{0}:金币数:{1},等级:{2},经验值:{3}",player.Name,player.TotalMoney,player.Level,player.TotalExp);
248         }
249         static void Main(string[] args)
250         {
251             Console.WriteLine("--------------------");
252             Console.WriteLine("       王者荣耀      ");
253             Console.WriteLine("--------------------");
254             bool isPassed = false; //玩家登录
255             do
256             {
257                 isPassed = Login();
258             } while (isPassed == false);
259             Console.WriteLine("召唤师,欢迎来到王者荣耀!");
260             Console.WriteLine("在这片虚构的王者大陆上,重生的英雄们演绎着新的传奇");
261             Console.WriteLine("准备好了吗?精彩对战即将爆发!");
262             Hero player = SelectHero(); //选择英雄
263             Console.Write("你已经选择了英雄:"+player.Name+",");
264             Console.WriteLine("下面开始你的王者大陆之旅吧!");
265             Console.WriteLine("--------------------");
266             Console.WriteLine("-------新手村-------");
267             Console.WriteLine("--------------------");
268             string isExitGame = "n";
269             do
270             {
271                 Console.WriteLine("1.购买装备");
272                 Console.WriteLine("2.出村练级");
273                 Console.WriteLine("请输入对应功能编号进行选择。");
274                 string selectMenu = Console.ReadLine();
275                 switch (selectMenu)
276                 {
277                     case"1":
278                         BuyEquip(ref player); //购买装备
279                         break;
280                     case "2":
281                         Fight(ref player); //打怪升级
282                         break;
283                 }
284                 Console.WriteLine("是否继续游戏?(y/n)");
285                 isExitGame = Console.ReadLine();
286             } while (isExitGame != "n");
287         }
288     }
289 }
View Code
posted on 2022-11-29 00:44  ihoi  阅读(118)  评论(0)    收藏  举报