Итак, я пишу простую игру Rock, Paper, Scissors в C (это для задания, кстати, хотя главное - узнать сокеты. Кроме того, я подозреваю, что это произойдет, прежде чем я получу хороший ответ), У меня есть настройка Rock = 0, Paper = 1 и Scissors = 2. Есть ли простой однострочный ключ, чтобы определить, кто победит? Я попытался поиграть с ним на бумаге, но я не мог понять никаких шаблонов.
One-liner, чтобы определить, кто победит в Rock, Paper, Scissors
Ответ 1
winner = (3 + player1 - player2) % 3;
Это даст 1, если игрок 1 победит, 2, если победит 2 игрока, 0 за галстук.
Объяснение. В последовательности Rock=0, Paper=1, Scissors=2
каждый элемент побеждает предыдущий. Это верно, даже если мы рассматриваем последовательность как обертывание (то есть последний элемент предшествует первому).
Чтобы поставить это в более математических терминах, для любого элемента X:
- X побежден
(X+1) % 3
. - X побеждает
(X+2) % 3
.
Из этого можно показать, что (3+X-Y) % 3
равно 1, если X побеждает Y или 2, если Y побеждает X.
Добавление 3 требуется, чтобы заставить результат быть неотрицательным: модуль отрицательного числа будет отрицательным или нулевым в C99 и зависит от реализации на C89.