目录
1前言
吸血鬼幸存者合成系统的个人版本,希望提供给大家一些创作上的思路
2.需求分析
吸血鬼幸存者中玩家每次升级都会获得一个武器或者饰品,物品和饰品都有对应的等级和功能,装备A武器和B饰品,升级获得武器C,并且武器A消失,饰品B保留。
3.代码
3.1物品代码,包含武器和饰品
/// <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合成配方
/// <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材料代码
/// <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合成系统
/// <summary>
/// 合成系统接口
/// </summary>
public interface ICraftRecipeSystem
{
bool CheckRecipeID(int RecipeIDRecipeID, int ItemId);
bool CanCraft(int ItemID);
void CraftItem(int itemId);
}
/// <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);
}
/// <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玩家数据
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使用方法
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();
}
}