돌, 보, 가위, 도마뱀, 스포크
소개
작년에 우리는 "수학"방법으로 돌, 보, 가위 놀이를 해결했는데 이 항목은 개방적인 문제로 끝났다.
Can you find a similar, mathematical approach for Rock, Paper, Scissors, Lizard, Spock?
며칠 전, @jotagarciaz 나에게 같은 질문을 하고 호기심을 불러일으켰을 때, 나는 비로소 이 변체에 대해 생각할 시간을 썼다.
게임 분석: "도마뱀, 스포크" 아니면 "스포크, 도마뱀?"
바위, 보, 가위, 도마뱀, 스포크는 확장된 바위, 보, 가위가 창조한 것이다Sam Kass and Karen Bryla.
그것은 텔레비전 연속극에 보급되었다.
우리는 최초의 게임부터 시작합시다.
- Scissors cuts Paper
- Paper covers Rock
- (and as it always has) Rock crushes Scissors
전통적인 돌, 보, 가위 규칙은 여전히 적용되지만, 게임에는 도마뱀과 스포크 두 가지 새로운 옵션이 추가되었다.
이 새로운 옵션과 관련된 가장 간단한 규칙을 소개합니다.
- Rock crushes Lizard
- Lizard poisons Spock
- Spock smashes Scissors
현재 큰 의외는 없다.다음 규칙을 추가합니다.
- Lizard eats Paper
우리는 화살표 그림에서 다음 모드를 추가할 때 확인할 수 있는 가능한 패턴을 상상할 수 있다.
- Spock vaporizes Rock
- Scissors decapitates Lizard
- Paper disproves Spock
모든 새로운 규칙을 하나하나 검사한 후에 우리는 틀림없이 하나의 모델이 존재한다는 결론을 얻을 수 있다.
우리도 복식 입력표에 이러한 규칙을 반영하여 이런 모델을 관찰할 수 있다. 전제는 우리가 돌, 보, 가위, 스포크, 도마뱀 순서(즉, 게임 이름에서 도마뱀과 스포크의 위치를 교환하는 것)를 사용하는 것이다.
충격적이지, 그렇지?이 게임의 가장 유행하는 이름은 돌, 보, 가위, 도마뱀, 스포크이다. 왜냐하면 대폭발 이론에서 이렇게 나타났기 때문이다.그러나 Sam's page에서 사용된 알파벳 줄임말에 따르면 그들의 창조자는 처음에 이를'right'(돌, 보, 가위, 스바크, 도마뱀)로 명명했다.
쉘든 리쿠퍼 선생님이 이걸 어떻게 놓쳤는지 알고 싶어요!
게임 해결
일단 모든 규칙을 적용하면 우리는 최종적으로 이 그림을 얻을 수 있다.
이 그림과/또는 우리가 위에서 본 표를 분석하면 우리는 우리가 확정한 모델을 쓸 수 있다.
기억하자:
- If both numbers are the same, no one wins
- If both numbers are consecutive, the bigger one wins
- If both numbers aren’t consecutive, the smaller one wins
우리는 우리의 모델을 위해 유사한 것을 찾아야 한다. 이것이 바로 우리가 위의 그림에 숫자를 추가한 이유이다.
예를 들어 이러한 모든 요구 사항을 충족하는 일반적인 규칙을 요약해 보겠습니다.
두 숫자 사이의 차이가 짝수인 경우
C#8을 사용하면 다음 함수를 얻을 수 있습니다.
int CalculateWinner(int player1, int player2)
{
return (Math.Abs(player1 - player2) % 2)
switch
{
0 => player1 == player2
? -1
: new[] { player1, player2 }.Min(),
1 => new[] { player1, player2 }.Max(),
_ => throw new Exception(@"¯\_(ツ)_/¯")
};
}
우리가 이를 비교할 때, 우리는 이 알고리즘이 우리가 그곳에서 사용하는 알고리즘의 보급임을 보았고, 우리가 현재 이 게임의 확장을 구하고 있는 것을 고려하면, 그것이 어떤 모습일지 알 수 있다.콘솔 응용 프로그램
이것은 인터랙티브 컨트롤러 응용 프로그램의 예시로 우리와 함께 돌, 보, 가위, 스포크, 도마뱀을 놀고 이전에 정의된 알고리즘을 바탕으로 한다.
만약 우리가
enum Item
(6 줄) 에서 스포크와 도마뱀을 삭제한다면 이 코드는 돌, 보, 가위 게임에도 사용할 수 있습니다.using System;
using System.Linq;
public static class Program
{
private enum Item { Rock, Paper, Scissors, Spock, Lizard }
private static readonly string[] ItemArray = Enum.GetNames(typeof(Item));
private static readonly Random Rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
public static void Main()
{
while (true)
{
Console.WriteLine($"Let's play! Type '{string.Join("', '", ItemArray[..^1])}' or '{ItemArray.Last()}'");
if (!Enum.TryParse(typeof(Item), Console.ReadLine().Trim('\''), ignoreCase: true, out var humanInput))
{
Console.WriteLine("\tComputer says \"no\": invalid input\n");
continue;
}
var computerInput = Enum.Parse(typeof(Item), ItemArray[Rnd.Next(0, ItemArray.Length)]);
Console.WriteLine($"\tYou've chosen {humanInput}\n\tComputer has chosen {computerInput}");
var result = CalculateWinner((int)humanInput, (int)computerInput);
PrintResultMessage((int)humanInput, result);
}
}
private static int CalculateWinner(int player1, int player2)
{
return (Math.Abs(player1 - player2) % 2)
switch
{
0 => player1 == player2
? -1
: new[] { player1, player2 }.Min(),
1 => new[] { player1, player2 }.Max(),
_ => throw new Exception(@"¯\_(ツ)_/¯")
};
}
private static void PrintResultMessage(int humanInput, int result)
{
var resultMessage = result == -1
? "It's a draw!"
: (result == humanInput) ? "You win!" : "You lose!";
Console.WriteLine($"\t{resultMessage}\n");
}
}
이 코드here를 찾을 수 있습니다.나는 당신이 돌, 보, 가위, 스포크, 도마뱀 및/또는 당신이 제공한 해결 방안에 대해 재미있는 분석을 하기를 희망합니다!
Reference
이 문제에 관하여(돌, 보, 가위, 도마뱀, 스포크), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/eduherminio/rock-paper-scissors-lizard-spock-44ei텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)