有沒有更簡單的方法可以在不引入大量數學的情況下做到這一點?也許也許是一個 switch 陳述句?
if (myChoice == "Rock" && compChoice == "Scissors")
{
winner = "player";
win ;
}
else if (myChoice == "Rock" && compChoice == "Lizard")
{
winner = "player";
win ;
}
else if (myChoice == "Paper" && compChoice == "Rock")
{
winner = "player";
win ;
}
else if (myChoice == "Paper" && compChoice == "Spock")
{
winner = "player";
win ;
}
else if (myChoice == "Scissors" && compChoice == "Paper")
{
winner = "player";
win ;
}
else if (myChoice == "Scissors" && compChoice == "Lizard")
{
winner = "player";
win ;
}
else if (myChoice == "Lizard" && compChoice == "Spock")
{
winner = "player";
win ;
}
else if (myChoice == "Lizard" && compChoice == "Paper")
{
winner = "player";
win ;
}
else if (myChoice == "Spock" && compChoice == "Scissors")
{
winner = "player";
win ;
}
else if (myChoice == "Spock" && compChoice == "Rock")
{
winner = "player";
win ;
}
else if (compChoice == "Rock" && myChoice == "Scissors")
{
winner = "computer";
lose ;
}
else if (compChoice == "Rock" && myChoice == "Lizard")
{
winner = "computer";
lose ;
}
else if (compChoice == "Paper" && myChoice == "Rock")
{
winner = "computer";
lose ;
}
else if (compChoice == "Paper" && myChoice == "Spock")
{
winner = "computer";
lose ;
}
else if (compChoice == "Scissors" && myChoice == "Paper")
{
winner = "computer";
lose ;
}
else if (compChoice == "Scissors" && myChoice == "Lizard")
{
winner = "computer";
lose ;
}
else if (compChoice == "Lizard" && myChoice == "Spock")
{
winner = "computer";
lose ;
}
else if (compChoice == "Lizard" && myChoice == "Paper")
{
winner = "computer";
lose ;
}
else if (compChoice == "Spock" && myChoice == "Scissors")
{
winner = "computer";
lose ;
}
else if (compChoice == "Spock" && myChoice == "Rock")
{
winner = "computer";
lose ;
}
else
{
winner = "none";
tie ;
}
我玩了一會兒,但正在尋找一種更簡單的方法來展示一些正在學習 c# 的朋友。我自己就是初學者,所以我無法提供更多幫助。我希望這里有人可以為我們指明正確的方向。提前感謝您提供的任何建議。
uj5u.com熱心網友回復:
我個人會盡可能多地擺脫這些字串。這是您可以與一對夫婦enums和一個支持班級一起玩一輪游戲的方法。
public enum Choice
{
Rock, Paper, Scissors, Spock, Lizard
}
public enum Result
{
Win, Lose, Draw
}
public static class Roshambo
{
// This is a lookup table of the choice against what it beats.
private static readonly Dictionary<Choice, List<Choice>> Any = new()
{
{Choice.Rock, new() {Choice.Scissors, Choice.Lizard}},
{Choice.Paper, new() {Choice.Rock, Choice.Spock}},
{Choice.Scissors, new() {Choice.Paper, Choice.Lizard}},
{Choice.Lizard, new() {Choice.Spock, Choice.Paper}},
{Choice.Spock, new() {Choice.Scissors, Choice.Rock}}
};
public static Result Play(Choice one, Choice theOther)
{
if (one == theOther) return Result.Draw;
return Any[one].Contains(theOther)
? Result.Win
: Result.Lose;
}
}
public static void Main(string[] args)
{
var result = Roshambo.Play(Choice.Scissors, Choice.Rock);
// Here you could switch over the result
Console.WriteLine(result); // Lose
}
uj5u.com熱心網友回復:
如果您的編譯器足夠新以支持它,那么這是一個很好的開關運算式候選者:
winner = myChoice switch
{
"Rock" => compChoice switch
{
"Rock" => "none",
"Scissors" or "Lizard" => "player",
"Paper" or "Spock" => "computer"
},
"Scissors" => compChoice switch
{
"Scissors" => "none",
"Paper" or "Lizard" => "player",
"Rock" or "Spock" => "computer"
}
// and so on
}
當然,這也適用于適當的enum變數。
但這仍然是多余的,因為您必須具有反對稱條目。我們可以利用這一點:
bool beats(string first, string second)
=> first switch
{
"Rock" => second is "Scissors" or "Lizard",
"Scissors" => second is "Paper" or "Lizard",
"Paper" => second is "Rock" or "Spock",
"Lizard" => second is "Paper" or "Spock",
"Spock" => second is "Rock" or "Scissors"
};
bool playerWins = beats(playerChoice, compChoice);
bool computerWins = beats(compChoice, playerChoice);
switch ((playerWins, computerWins)) {
case (true, false):
winner = "player";
wins ;
break;
case (false, true):
winner = "computer";
loss ;
break;
case (false, false):
winner = "none";
draw ;
break;
case (true, true):
MessageBox.Show("Problem with the rules!");
break;
}
這與代碼長度的查找表相比具有競爭力,并且可能更具可讀性。并且它檢查規則的一致性,你不能在玩家“Paper”擊敗計算機“Rock”的同時,意外地讓玩家“Rock”擊敗計算機“Paper”。
uj5u.com熱心網友回復:
如果我們有所有的狀態
static List<string> states = new List<string> {
"Scissors", "Paper", "Rock", "Lizzard", "Spock"
};
規則很簡單:
AB當且僅當其中一個indexB - indexB == 1或時獲勝indexB - indexA == 2。
Eg Rock勝Scissors和Lizzard
但是請注意,我們應該計算回圈差分(-1 ~ 4、-2 ~ 3等-3 ~ -2),例如Spockwins Scissors;我可以在模算術的幫助下做到這一點:
private static bool FirstWins(string first, string second) {
int difference = (states.IndexOf(first) - states.IndexOf(second) states.Count)
% states.Count;
return difference == 2 || difference == states.Count - 1;
}
最后
static string Winner(string user, string computer) =>
FirstWins(user, computer) ? "User"
: FirstWins(computer, user) ? "Computer"
: "Draw";
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523875.html
標籤:C#算法
上一篇:在另一個物件陣列中傳遞陣列
