目录

1前言

2.需求分析

3.代码

3.1物品代码,包含武器和饰品

3.2合成配方

3.3材料代码

3.4合成系统

3.5玩家数据

3.6使用方法

4.运行结果


1前言

吸血鬼幸存者合成系统的个人版本,希望提供给大家一些创作上的思路


2.需求分析

吸血鬼幸存者中玩家每次升级都会获得一个武器或者饰品,物品和饰品都有对应的等级和功能,装备A武器和B饰品,升级获得武器C,并且武器A消失,饰品B保留。

3.代码

3.1物品代码,包含武器和饰品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/// <summary>
/// 物品
/// </summary>
public class BaseItem
{
/// <summary>
/// 物品
/// </summary>
/// <param name="id">物品ID</param>
/// <param name="name">物品名称</param>
/// <param name="description">物品描述</param>
/// <param name="currentLevel">当前等级</param>
/// <param name="craftRecipeID">物品合成配方</param>
public BaseItem(int id, string name, string description, int currentLevel, int recipeId)
{
ItemId = id;
Name = name;
Description = description;
CurrentLevel = currentLevel;
RecipeID = recipeId;
}

/// <summary>
/// 物品ID
/// </summary>
public int ItemId { get; private set; }

/// <summary>
/// 物品名称
/// </summary>
public string Name { get; private set; }

/// <summary>
/// 物品描述
/// </summary>
public string Description { get; private set; }

/// <summary>
/// 当前等级
/// </summary>
public int CurrentLevel { get; set; }

/// <summary>
/// 合成配方ID
/// 2A+B=2C
/// </summary>
public int RecipeID { get; private set; }
}

点击并拖拽以移动


3.2合成配方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/// <summary>
/// 合成配方
/// </summary>
public class CraftRecipe
{
/// <summary>
/// 合成配方
/// </summary>
/// <param name="id">合成ID</param>
/// <param name="reslutItemId">目标物品ID</param>
/// <param name="resultLevel">合成目标数量</param>
/// <param name="needItems">所需材料</param>
public CraftRecipe(int id, int reslutItemId, int resultLevel, List<NeedItem> needItems)
{
RecipeID = id;
ReslutItemId = reslutItemId;
ResultLevel = resultLevel;
NeedItems = needItems;
}

/// <summary>
/// 合成ID
/// </summary>
public int RecipeID { get; private set; }

/// <summary>
/// 目标物品ID
/// </summary>
public int ReslutItemId { get; private set; }

/// <summary>
/// 合成目标等级
/// </summary>
public int ResultLevel { get; private set; }

/// <summary>
/// 所需材料
/// </summary>
public List<NeedItem> NeedItems { get; private set; }
}

点击并拖拽以移动


3.3材料代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <summary>
/// 所需材料
/// </summary>
public class NeedItem
{
/// <summary>
/// 所需材料ID
/// </summary>
public int ItemId;

/// <summary>
/// 所需材料数量
/// </summary>
public int NeedLevel;

/// <summary>
/// 所需材料
/// </summary>
/// <param name="id">所需材料ID</param>
/// <param name="needLevel">所需材料</param>
public NeedItem(int id, int needLevel)
{
this.ItemId = id;
this.NeedLevel = needLevel;
}
}

点击并拖拽以移动


3.4合成系统

1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 合成系统接口
/// </summary>
public interface ICraftRecipeSystem
{
bool CheckRecipeID(int RecipeIDRecipeID, int ItemId);

bool CanCraft(int ItemID);

void CraftItem(int itemId);
}

点击并拖拽以移动

1
2
3
4
5
6
7
8
9
/// <summary>
/// 抽象合成系统
/// </summary>
public abstract class AbstractCraftSystem : ICraftRecipeSystem
{
public abstract bool CanCraft(int ItemID);
public abstract bool CheckRecipeID(int RecipeIDRecipeID, int ItemId);
public abstract void CraftItem(int itemId);
}

点击并拖拽以移动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/// <summary>
/// 合成系统
/// </summary>
public class CraftRecipeSystem : AbstractCraftSystem
{
/// <summary>
/// 玩家数据
/// </summary>
public PlayerData m_PlayerData;

/// <summary>
/// 所有物品
/// </summary>
public Dictionary<int, BaseItem> Items = new Dictionary<int, BaseItem>();

/// <summary>
/// 所有配方
/// </summary>
public Dictionary<int, CraftRecipe> Table = new Dictionary<int, CraftRecipe>();

/// <summary>
/// 检查配方ID是否合法
/// </summary>
/// <param name="RecipeIDRecipeID">配方ID</param>
/// <returns>配方ID是否合法</returns>
public override bool CheckRecipeID(int RecipeIDRecipeID, int ItemId)
{
if (Table.ContainsKey(RecipeIDRecipeID) && Table[RecipeIDRecipeID].NeedItems.Count > 0)
{
Console.WriteLine($"配方Id为:{RecipeIDRecipeID}的配方合法");

return true;
}
else
{
Console.WriteLine($"配方ID为:{RecipeIDRecipeID}的配方不合法");
return false;
}
}

/// <summary>
/// 检查是否可以生成
/// </summary>
/// <param name="ItemID">物体ID</param>
/// <returns>是否可以生成</returns>
public override bool CanCraft(int ItemID)
{
//检查合成Id是否合法
if (CheckRecipeID(Items[ItemID].RecipeID, ItemID))
{
//检查合成后的物品ID是否存在于物品表
if (Items.ContainsKey(Table[Items[ItemID].RecipeID].ReslutItemId))
{
//检查所持物品数量是否满足合成物品的需求
foreach (var needItem in Table[Items[ItemID].RecipeID].NeedItems)
{
Console.WriteLine($"NeedItem:{needItem.ItemId}");
if (m_PlayerData.EquipItems.ContainsKey(needItem.ItemId))
{
//所持物品数量是否大于所需物品数量
if (m_PlayerData.EquipItems[needItem.ItemId].CurrentLevel < needItem.NeedLevel)
{
Console.WriteLine($"Id为:{needItem.ItemId}的等级不够,当前等级为:{m_PlayerData.EquipItems[needItem.ItemId].CurrentLevel},所需等级为:{needItem.NeedLevel},无法进行合成");
return false;
}
else
{
Console.WriteLine($"Id为:{needItem.ItemId}的等级足够,当前等级为:{m_PlayerData.EquipItems[needItem.ItemId].CurrentLevel},所需等级为:{needItem.NeedLevel},可以进行合成");
continue;
}
}
else
{
Console.WriteLine($"未装备ID为:{needItem.ItemId}的物品!");
return false;
}

}

return true;
}
else
{
Console.WriteLine($"不存在ID为:{Table[ItemID].ReslutItemId}的物品!");
return false;
}
}
else
{
Console.WriteLine($"物品ID为:{ItemID}的配方无法生成!");
return false;
}
}

/// <summary>
/// 合成物品
/// </summary>
/// <param name="itemId">物品Id</param>
public override void CraftItem(int itemId)
{
//Console.WriteLine($"物品的ID为{itemId},名称为:{Items[itemId].Name},生成前等级为:{m_PlayerData.EquipItems[itemId].CurrentLevel}");
//是否可合成
if (CanCraft(itemId))
{

m_PlayerData.RemoveItem(Items[Table[Items[itemId].RecipeID].NeedItems[0].ItemId]);
m_PlayerData.AddItem(new BaseItem(itemId, Items[itemId].Name, Items[itemId].Description, Table[Items[itemId].RecipeID].ResultLevel, Items[itemId].RecipeID));

Console.WriteLine($"物品的ID为:{itemId},名称为:{Items[itemId].Name},生成后装备等级为:{m_PlayerData.EquipItems[itemId].CurrentLevel}");
}
else
{
Console.WriteLine("合成失败");
}
}
}

点击并拖拽以移动


3.5玩家数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class PlayerData
{
public Dictionary<int, BaseItem> EquipItems = new Dictionary<int, BaseItem>();

public void AddItem(BaseItem item)
{
if (EquipItems.ContainsKey(item.ItemId))
{
EquipItems[item.ItemId].CurrentLevel++;
Console.WriteLine($"升级武器ID为:{item.ItemId},名称为:{item.Name},武器等级为:{EquipItems[item.ItemId].CurrentLevel}");
}
else
{
EquipItems.Add(item.ItemId, item);
Console.WriteLine($"装备武器ID为:{item.ItemId},名称为:{item.Name},武器等级为:{EquipItems[item.ItemId].CurrentLevel}");
}
ShowItem();
}

public void RemoveItem(BaseItem item)
{
Console.WriteLine($"移除武器ID为:{item.ItemId},名称为:{item.Name},武器等级为:{EquipItems[item.ItemId].CurrentLevel}");
EquipItems.Remove(item.ItemId);
ShowItem();
}

public void ShowItem()
{
Console.WriteLine("现存装备");
foreach (var item in EquipItems.Values)
{
Console.WriteLine($"Id:{item.ItemId},Name:{item.Name},Description:{item.Description},CuttentLevel:{item.CurrentLevel}");
}
}
}

点击并拖拽以移动


3.6使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MainProgram
{
static void Main(string[] args)
{
CraftRecipeSystem m_CraftRecipeSystem = new CraftRecipeSystem();
m_CraftRecipeSystem.Items.Add(1001, new BaseItem(1001, "长剑", "+10点攻击力", 1, 2000));
m_CraftRecipeSystem.Items.Add(1002, new BaseItem(1002, "魔戒", "+10%攻速", 1, 2000));
m_CraftRecipeSystem.Items.Add(1003, new BaseItem(1003, "魔剑", "+15攻击,+15%攻速", 0, 2001));


m_CraftRecipeSystem.Table.Add(2000, new CraftRecipe(2000, -1, 0, new List<NeedItem>()));
m_CraftRecipeSystem.Table.Add(2001,
new CraftRecipe(2001, 1003, 1, new List<NeedItem>() { new NeedItem(1001, 2), new NeedItem(1002, 1) }));

PlayerData m_playerData = new PlayerData();
//升一级
m_playerData.AddItem(new BaseItem(1001, "长剑", "+10点攻击力", 1, 2000));
//升一级
m_playerData.AddItem(new BaseItem(1002, "魔戒", "+10%攻速", 1, 2000));
//升一级
m_playerData.AddItem(new BaseItem(1001, "长剑", "+10点攻击力", 1, 2000));

m_CraftRecipeSystem.m_PlayerData = m_playerData;
Console.WriteLine();

//错误测试
m_CraftRecipeSystem.CraftItem(1001);
Console.WriteLine();
m_CraftRecipeSystem.CraftItem(1002);
Console.WriteLine();

//生成魔剑
m_CraftRecipeSystem.CraftItem(1003);
Console.WriteLine();

//错误测试
m_CraftRecipeSystem.CraftItem(1003);
Console.WriteLine();

}
}

点击并拖拽以移动


4.运行结果