剪纸石的算法

我使用以下方法,但有点想知道是否有更好的算法来执行测试。 有没有更好的方法呢? 在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"; } 

 if ((ComputerIn) % 3 + 1 == userInput) return "Win"; else if ((userInput) % 3 + 1 == ComputerIn) return "Lose" else return "Draw" 

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

当你使用0-2时,这种方法更自然,在这种情况下我们将使用(ComputerIn+1)%3 。 我想出了我的答案,将ComputerInComputerIn-1UserInput一起使用UserInput-1并简化了表达式。

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

 if (ComputerIn == 1) return "Win"; else if (ComputerIn == 2) return "Lose" else return "Draw" 

这甚至可以进一步简化为

 return new String[]{"Win", "Lose", "Draw"}[ComputerIn-1]; 

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

这是许多可能的解决方案之一。 这将打印Win。

 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Input userInput = Input.Rock; Result result = Play(userInput); Console.WriteLine(Enum.GetName(result.GetType(), result)); Console.ReadKey(); } static Result Play(Input userInput) { Input computer = Input.Scissors; switch (userInput) { case Input.Paper: switch (computer) { case Input.Paper: return Result.Draw; case Input.Rock: return Result.Win; case Input.Scissors: return Result.Lose; default: throw new Exception("Logic fail."); } case Input.Rock: switch (computer) { case Input.Paper: return Result.Lose; case Input.Rock: return Result.Draw; case Input.Scissors: return Result.Win; default: throw new Exception("Logic fail."); } case Input.Scissors: switch (computer) { case Input.Paper: return Result.Win; case Input.Rock: return Result.Lose; case Input.Scissors: return Result.Draw; default: throw new Exception("Logic fail."); } default: throw new Exception("Logic fail."); } } } enum Input { Rock, Paper, Scissors } enum Result { Lose, Draw, Win } } 

我就是这样做的:

 public class Program { public enum RPSPlay { Rock, Scissors, Paper } public enum RPSPlayResult { Win, Draw, Loose } public static readonly int SIZE = Enum.GetValues(typeof(RPSPlay)).Length; static RPSPlayResult Beats(RPSPlay play, RPSPlay otherPlay) { if (play == otherPlay) return RPSPlayResult.Draw; return ((int)play + 1) % SIZE == (int)otherPlay ? RPSPlayResult.Win : RPSPlayResult.Loose; } static void Main(string[] args) { Random rand = new Random(); while (true) { Console.Write("Your play ({0}) (q to exit) : ", string.Join(",", Enum.GetNames(typeof(RPSPlay)))); var line = Console.ReadLine(); if (line.Equals("q", StringComparison.OrdinalIgnoreCase)) return; RPSPlay play; if (!Enum.TryParse(line, true, out play)) { Console.WriteLine("Invalid Input"); continue; } RPSPlay computerPlay = (RPSPlay)rand.Next(SIZE); Console.WriteLine("Computer Played {0}", computerPlay); Console.WriteLine(Beats(play, computerPlay)); Console.WriteLine(); } } } 

我宁愿使用静态3×3矩阵来存储可能的结果。 但这是一个品味问题,我是一名数学家。

这是我们在午餐时间创建的单行程。

 using System; public class Rps { public enum PlayerChoice { Rock, Paper, Scissors }; public enum Result { Draw, FirstWin, FirstLose}; public static Result Match(PlayerChoice player1, PlayerChoice player2) { return (Result)((player1 - player2 + 3) % 3); } public static void Main() { Rps.Test(Match(PlayerChoice.Rock, PlayerChoice.Rock), Result.Draw); Rps.Test(Match(PlayerChoice.Paper, PlayerChoice.Paper), Result.Draw); Rps.Test(Match(PlayerChoice.Scissors, PlayerChoice.Scissors), Result.Draw); Rps.Test(Match(PlayerChoice.Rock, PlayerChoice.Scissors), Result.FirstWin); Rps.Test(Match(PlayerChoice.Rock, PlayerChoice.Paper), Result.FirstLose); Rps.Test(Match(PlayerChoice.Paper, PlayerChoice.Rock), Result.FirstWin); Rps.Test(Match(PlayerChoice.Paper, PlayerChoice.Scissors), Result.FirstLose); Rps.Test(Match(PlayerChoice.Scissors, PlayerChoice.Paper), Result.FirstWin); Rps.Test(Match(PlayerChoice.Scissors, PlayerChoice.Rock), Result.FirstLose); } public static void Test(Result sample, Result origin) { Console.WriteLine(sample == origin); } }