有没有办法提高效率?
Is there a way to make this more efficient?
所以我正在做一个文本冒险来提高我的编程技能(只是一个初学者),我正在为它开发一个新的战斗系统,因为旧的真的很无聊。所以我遇到了一个剪刀石头布系统,但我想要一个使用剪刀石头布的系统,有 5 个选项供玩家选择,以及攻击玩家的敌人或怪物。
我用了很多 if 语句,实际上并没有花太长时间,但我想知道是否有更好的方法来做到这一点,以便我的代码更高效,而且不会那么大。
public static void ResultsOfMoves(string PlayerMove, string MonsterMove, Monster CurrentMonster, Weapon CurrentWeapon, Armor CurrentArmor, Player CurrentPlayer)
{
//Monster Responses to Player
if (PlayerMove == "dodge" && MonsterMove == "heavy"||MonsterMove == "stealth")
{
if (MonsterMove == "heavy") { MonsterHeavyAttack(); }
if (MonsterMove == "stealth") { MonsterStealthAttack(); }
}
else if (PlayerMove == "charge" && MonsterMove == "dodge"||MonsterMove == "stealth")
{
if (MonsterMove == "dodge") { MonsterDodge(); }
if (MonsterMove == "stealth") { MonsterStealthAttack(); }
}
else if (PlayerMove == "block" && MonsterMove == "charge" || MonsterMove == "dodge")
{
if (MonsterMove == "charge") { MonsterChargeAttack(); }
if (MonsterMove == "dodge") { MonsterDodge(); }
}
else if (PlayerMove == "heavy" && MonsterMove == "block" || MonsterMove == "charge")
{
if (MonsterMove == "block") { MonsterBlock(); }
if (MonsterMove == "charge") { MonsterChargeAttack(); }
}
else if (PlayerMove == "stealth" && MonsterMove == "heavy" || MonsterMove == "block")
{
if (MonsterMove == "heavy") { MonsterHeavyAttack(); }
if (MonsterMove == "block") { MonsterBlock(); }
}
//Players Responses To Monster
if (MonsterMove == "dodge" && PlayerMove == "heavy" || PlayerMove == "stealth")
{
if (PlayerMove == "heavy") { MonsterHeavyAttack(); }
if (PlayerMove == "stealth") { MonsterStealthAttack(); }
}
else if (MonsterMove == "charge" && PlayerMove == "dodge" || PlayerMove == "stealth")
{
if (PlayerMove == "dodge") { MonsterDodge(); }
if (PlayerMove == "stealth") { MonsterStealthAttack(); }
}
else if (MonsterMove == "block" && PlayerMove == "charge" || PlayerMove == "dodge")
{
if (PlayerMove == "charge") { MonsterChargeAttack(); }
if (PlayerMove == "dodge") { MonsterDodge(); }
}
else if (MonsterMove == "heavy" && PlayerMove == "block" || PlayerMove == "charge")
{
if (PlayerMove == "block") { MonsterBlock(); }
if (PlayerMove == "charge") { MonsterChargeAttack(); }
}
else if (MonsterMove == "stealth" && PlayerMove == "heavy" || PlayerMove == "block")
{
if (PlayerMove == "heavy") { MonsterHeavyAttack(); }
if (PlayerMove == "block") { MonsterBlock(); }
}
}
首先创建一个 Move
枚举,而不是使用字符串:
public enum Moves
{
Charge,
Dodge,
Heavy,
Steath,
Block
}
接下来,使用Dictionary
来确定走法:
var moveResolution = new Dictionary<Tuple<Moves, Moves>, Action>
{
{ new Tuple<Moves, Moves>(Moves.Dodge, Moves.Heavy), MonsterHeavyAttack },
{ new Tuple<Moves, Moves>(Moves.Dodge, Moves.Steath), MonsterStealthAttack },
{ new Tuple<Moves, Moves>(Moves.Charge, Moves.Dodge), MonsterDodge },
...
};
然后要确定合适的着法,只需执行以下操作:
var moveCombination = new Tuple<Moves, Moves>(playerMove, monsterMove);
if (moveResolution.ContainsKey(moveCombination))
{
moveResolution[moveCombination]();
}
然后可以通过将惰性 Tuple<Moves, Moves>
替换为 MoveCombination
结构来进一步改进此代码。 注意,使用 struct
确保 moveResolution.ContainsKey(moveCombination)
部分正常工作,因为您需要按值而不是按引用进行比较。
所以我正在做一个文本冒险来提高我的编程技能(只是一个初学者),我正在为它开发一个新的战斗系统,因为旧的真的很无聊。所以我遇到了一个剪刀石头布系统,但我想要一个使用剪刀石头布的系统,有 5 个选项供玩家选择,以及攻击玩家的敌人或怪物。
我用了很多 if 语句,实际上并没有花太长时间,但我想知道是否有更好的方法来做到这一点,以便我的代码更高效,而且不会那么大。
public static void ResultsOfMoves(string PlayerMove, string MonsterMove, Monster CurrentMonster, Weapon CurrentWeapon, Armor CurrentArmor, Player CurrentPlayer)
{
//Monster Responses to Player
if (PlayerMove == "dodge" && MonsterMove == "heavy"||MonsterMove == "stealth")
{
if (MonsterMove == "heavy") { MonsterHeavyAttack(); }
if (MonsterMove == "stealth") { MonsterStealthAttack(); }
}
else if (PlayerMove == "charge" && MonsterMove == "dodge"||MonsterMove == "stealth")
{
if (MonsterMove == "dodge") { MonsterDodge(); }
if (MonsterMove == "stealth") { MonsterStealthAttack(); }
}
else if (PlayerMove == "block" && MonsterMove == "charge" || MonsterMove == "dodge")
{
if (MonsterMove == "charge") { MonsterChargeAttack(); }
if (MonsterMove == "dodge") { MonsterDodge(); }
}
else if (PlayerMove == "heavy" && MonsterMove == "block" || MonsterMove == "charge")
{
if (MonsterMove == "block") { MonsterBlock(); }
if (MonsterMove == "charge") { MonsterChargeAttack(); }
}
else if (PlayerMove == "stealth" && MonsterMove == "heavy" || MonsterMove == "block")
{
if (MonsterMove == "heavy") { MonsterHeavyAttack(); }
if (MonsterMove == "block") { MonsterBlock(); }
}
//Players Responses To Monster
if (MonsterMove == "dodge" && PlayerMove == "heavy" || PlayerMove == "stealth")
{
if (PlayerMove == "heavy") { MonsterHeavyAttack(); }
if (PlayerMove == "stealth") { MonsterStealthAttack(); }
}
else if (MonsterMove == "charge" && PlayerMove == "dodge" || PlayerMove == "stealth")
{
if (PlayerMove == "dodge") { MonsterDodge(); }
if (PlayerMove == "stealth") { MonsterStealthAttack(); }
}
else if (MonsterMove == "block" && PlayerMove == "charge" || PlayerMove == "dodge")
{
if (PlayerMove == "charge") { MonsterChargeAttack(); }
if (PlayerMove == "dodge") { MonsterDodge(); }
}
else if (MonsterMove == "heavy" && PlayerMove == "block" || PlayerMove == "charge")
{
if (PlayerMove == "block") { MonsterBlock(); }
if (PlayerMove == "charge") { MonsterChargeAttack(); }
}
else if (MonsterMove == "stealth" && PlayerMove == "heavy" || PlayerMove == "block")
{
if (PlayerMove == "heavy") { MonsterHeavyAttack(); }
if (PlayerMove == "block") { MonsterBlock(); }
}
}
首先创建一个 Move
枚举,而不是使用字符串:
public enum Moves
{
Charge,
Dodge,
Heavy,
Steath,
Block
}
接下来,使用Dictionary
来确定走法:
var moveResolution = new Dictionary<Tuple<Moves, Moves>, Action>
{
{ new Tuple<Moves, Moves>(Moves.Dodge, Moves.Heavy), MonsterHeavyAttack },
{ new Tuple<Moves, Moves>(Moves.Dodge, Moves.Steath), MonsterStealthAttack },
{ new Tuple<Moves, Moves>(Moves.Charge, Moves.Dodge), MonsterDodge },
...
};
然后要确定合适的着法,只需执行以下操作:
var moveCombination = new Tuple<Moves, Moves>(playerMove, monsterMove);
if (moveResolution.ContainsKey(moveCombination))
{
moveResolution[moveCombination]();
}
然后可以通过将惰性 Tuple<Moves, Moves>
替换为 MoveCombination
结构来进一步改进此代码。 注意,使用 struct
确保 moveResolution.ContainsKey(moveCombination)
部分正常工作,因为您需要按值而不是按引用进行比较。