Да, есть довольно простая формула:
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);