是的,有一个非常简单的公式:
player computer solution (c+4-p)%3 0 0 1 1 0 1 2 2 0 2 0 0 1 0 0 0 1 1 1 1 1 2 2 2 2 0 2 2 2 1 0 0 2 2 1 1
所以你可以使用:
int result = (computer + 4 - player) % 3;
访问数组并计算值将同时变得粗糙。但是,此应用程序中的性能差异可以忽略不计。只需将结果写入控制台比使用数组或计算值要花费更长的时间。当然,通过计算你不需要数组的值,但是因为它太小而没有太大差别。
还要考虑解决方案的可读性。该公式与您使用它的方式没有逻辑联系,它只是获取特定结果的一种方法,因此您需要一个大的注释来解释它完成的内容......
如果您希望专注于可读性,可以将逻辑放在一个单独的类中:
public class Play { public enum Value { Paper = 0, Rock = 1, Scissors = 2 } private Value _value; public Play(Random rnd) { _value = (Value)rnd.Next(3); } public bool SameAs(Play other) { return _value == other._value; } public bool Beats(Play other) { return (_value == Value.Paper && other._value == Value.Rock) || (_value == Value.Rock && other._value == Value.Scissors) || (_value == Value.Scissors && other._value == Value.Paper); } public override string ToString() { switch (_value) { case Value.Paper: return "PAPER"; case Value.Rock: return "ROCK"; default: return "SCISSORS"; } } }
现在逻辑变得清晰了:
Random r = new Random(); Play player = new Play(r); Play computer = new Play(r); Console.WriteLine("you : {0} vs {1} : computer", player, computer); string feedback; if (player.SameAs(computer)) { feedback = "{0} Equals {1}, Draw!"; } else if (player.Beats(computer)) { feedback = "{0} Beats {1}, You Win!"; } else { feedback = "{1} Beats {0}, You Loose!"; } Console.WriteLine(feedback, player, computer);