听起来您确实希望仍然能够自定义不同选择将对玩家产生的影响,同时避免编写所有代码。
做到这一点的一种方法是创建一个数据结构,它将处理任何组合的结果,并使创建新组合的任务更容易处理潜在的大量可能性,而不是你必须重新编译的代码更容易更改的东西在 XML 中并根据用户的选择查询结果。
您可能有一个类似于以下的类来存储结果。
public class AttackResult
{
public int ChanceToCrit { get;set; }
public int ChanceToBurn { get;set; }
public int FireDmg { get;set; }
}
至于 XML,你可能会有类似的东西,
<Options>
<Attack>
<AttackResult>
<ChanceToCrit>5</ChanceToCrit>
</AttackResult>
<Attack>
<AttackResult>
<ChanceTCrit>10</ChanceToCrit>
</AttackResult>
</Attack>
</Attack>
<Fire>
</Fire>
</Options>
你明白了。例如,在处理您的用户选择时(我只是在这里猜测),您可能会将他们所做的事情存储在 Enum 中。因此,要使用 XML,您可能会做一些类似的事情
public enum ActionType
{
Attack,
Fire,
None
}
allActions 必须是为了让这个例子与你的游戏想法一起工作,我认为。
public ActionResult ProcessActions(List<ActionType> allActions)
{
string xpathquery = "Options";
foreach(var playerAction in allActions)
{
if(playerAction == ActionType.None)
break;
xpathquery += "/" + playerAction.ToString();
}
//Query xmldocument of all options
var result = Singleton.ActionsDoc.SelectSingleNode(xpathquery);
string attackRes = result.InnerXml;
XmlSerializer serializer = new XmlSerializer(typeof(ActionResult))
//Might need to prepend something to attackRes before deserializing, none of this is tested
byte[] allBytes = Encoding.UTF8.GetBytes(attackRes);
MemoryStream ms = new MemoryStream(allBytes);
ActionResult result = (ActionResult)serializer.Deserialize(ms);
return result;
}
此选项有其缺点,例如 XmlSerializer 非常慢,但这意味着您可以创建一个简单的工具来帮助生成所有选项所需的 xml,并非常简单地调整值以平衡游戏。
桌上的一个选项。希望有帮助。