Сравнение целых чисел в контрактах - PullRequest
0 голосов
/ 10 октября 2018

Я создаю небольшое приложение, основанное на контрактах кода, есть ли способ написать спецификацию, которая бы работала как камень, бумага, ножницы?Я хотел бы сделать спецификацию, которая будет выглядеть примерно так:

0- rock
1- paper
2- scissors 

, поэтому, если вы получите 0 и 1 - 1 побед, если вы получите 1 и 2 - 2 выигрывает, а если вы получаете 0 2, 0 выигрывает.Я хотел бы написать спецификацию для метода, который определил бы этот случай, возможно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я бы сделал что-то похожее на object.CompareTo () и сделал бы несколько по модулю.Следующий в круге всегда выигрывает, поэтому добавьте 1 к руке и отметьте остаток от деления на 3, чтобы спроецировать его обратно на наши 3 варианта.

Сравните с секундной стрелкой.Если он равен: первая рука проигрывает, другая - вторая рука.

public int CompareHands(int hand1, int hand2)
{
   if (hand1 == hand2) return 0; //tie
   return ((hand1 + 1) % 3) == hand2 ? -1 : 1; //we have a winner
}
0 голосов
/ 10 октября 2018

Вместо выполнения арифметики (сравнения значений), вероятно, лучше использовать доменную логику (правила игры):

public enum Hand
{
    Rock,
    Paper,
    Scissors,
}

public static Hand? Check(Hand h1, Hand h2)
{
    // same hand draw
    if (h1 == h2) return default;

    var winningHands = new Dictionary<Hand, Hand>
    {
        [Hand.Rock] = Hand.Paper,
        [Hand.Paper] = Hand.Scissors,
        [Hand.Scissors] = Hand.Rock,
    };
    return h2 == winningHands[h1] ? h2 : h1;
}
...