剪纸石的算法
我使用以下方法,但有点想知道是否有更好的算法来执行测试。 有没有更好的方法呢? 在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
。 我想出了我的答案,将ComputerIn
与ComputerIn-1
和UserInput
一起使用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); } }