剪纸石的算法

kar*_*kar 1 c# java algorithm

我正在使用以下方法,但是想知道是否有更好的算法来执行测试.有没有更好的方法呢?在C#中执行此操作但将语法放在一边,相信在OOP语言中算法将是相同的.谢谢.

public String play(int userInput)
        {   //ComputerIn is a randomly generated number between 1-3
            ComputerIn = computerInput();

            if (ComputerIn == userInput)
                return "Draw";

            else if (ComputerIn == 1 && userInput == 2)
                return "Win";

            else if (ComputerIn == 2 && userInput == 3)
                return "Win";

            else if (ComputerIn == 3 && userInput == 1)
                return "Win";

            else if (ComputerIn == 1 && userInput == 3)
                return "Lose";

            else if (ComputerIn == 2 && userInput == 1)
                return "Lose";

            else
                return "Lose";
        }
Run Code Online (Sandbox Code Playgroud)

Cru*_*her 11

if ((ComputerIn) % 3 + 1 == userInput)
    return "Win";
else if ((userInput) % 3 + 1 == ComputerIn)
    return "Lose"
else
    return "Draw"
Run Code Online (Sandbox Code Playgroud)

如果你将3换成1(使用%),那么胜利者总是比失败者大1.

当你使用0-2时,这种方法更自然,在这种情况下我们会使用(ComputerIn+1)%3.我通过底涂来到了我的回答ComputerInComputerIn-1,并UserInputUserInput-1和简化的表达.

编辑,很长一段时间后看着这个问题.如上所述,如果在ComputerIn其他地方没有使用,并且仅用于确定赢/输/抽奖,那么这个方法实际上相当于:

if (ComputerIn == 1)
    return "Win";
else if (ComputerIn == 2)
    return "Lose"
else
    return "Draw"
Run Code Online (Sandbox Code Playgroud)

这甚至可以进一步简化为

return new String[]{"Win", "Lose", "Draw"}[ComputerIn-1];
Run Code Online (Sandbox Code Playgroud)

由此得出的结果完全无法区分.除非随机生成的数字暴露在此方法之外.无论你的输入是什么,所有可能性总是有1/3的可能性.也就是说,你所要求的只是一种以相同概率返回"胜利","失败"或"平局"的复杂方式.