C# 在方法中放置矩形颜色和消息框的选择
做了一个简单的剪刀纸石头游戏。当你按下一个按钮(3个不同的按钮,每种选择一个剪刀/纸/石头),如果你赢了,输了或抽签,它会返回。它还为人类和计算机选择的选项(矩形)加上一条信息,告诉人们是赢了还是输了 game.play方法根据其参数输入计算谁赢了。1是石头,2是纸,3是剪刀。计算机的选择是随机的 下面的代码可以工作,但会发现它很混乱,并试图找到一种方法将所有颜色放在一个方法中,将所有消息放在一个方法中。考虑到有这么多的颜色和信息选项,我感到相当困惑。以下代码用于选择由人类制作的纸张。做建议。多谢各位C# 在方法中放置矩形颜色和消息框的选择,c#,xaml,C#,Xaml,做了一个简单的剪刀纸石头游戏。当你按下一个按钮(3个不同的按钮,每种选择一个剪刀/纸/石头),如果你赢了,输了或抽签,它会返回。它还为人类和计算机选择的选项(矩形)加上一条信息,告诉人们是赢了还是输了 game.play方法根据其参数输入计算谁赢了。1是石头,2是纸,3是剪刀。计算机的选择是随机的 下面的代码可以工作,但会发现它很混乱,并试图找到一种方法将所有颜色放在一个方法中,将所有消息放在一个方法中。考虑到有这么多的颜色和信息选项,我感到相当困惑。以下代码用于选择由人类制作的纸张。做建议。多
private void button2_Paper(object sender, RoutedEventArgs e) // Human chose Paper
{
if (game.play(2) == "Draw")
{
rect2.Fill = red;
MessageBox.Show("It is a draw. both chose Paper");
}
else if (game.play(2) == "Win")
{
rect2.Fill = green;
rect1.Fill = yellow;
MessageBox.Show("Congratulations! Paper beats Rock");
}
else if (game.play(2) == "Lose")
{
rect2.Fill = green;
rect3.Fill = yellow;
MessageBox.Show("You lose. Scissor beats Paper");
}
gameReset();
}
如果你想清理你的代码,你应该尝试搜索那些看起来像是复制粘贴的东西。我假设你有一个类似的方法,你张贴在这里的“岩石”和“剪刀” 在这种情况下,您可以重新构造您的游戏类以保存一个临时的游戏结果,该结果指示谁赢了。此外,还可以用枚举替换“字符串结果” 这里有一个小班来说明我的意思。注意,我还没有测试这个类,所以它可能会返回不正确的结果
namespace RockPaperScissor.GameEngine
{
public enum Move
{
Rock = 0,
Paper = 1,
Scissor = 2
}
public enum MoveResult
{
PlayerWon,
ComputerWon,
Draw
}
public class RPSEngine
{
public Move ComputerMove { get; set; }
public Move PlayerMove { get; set; }
public MoveResult Result
{
get
{
if(ComputerMove == PlayerMove)
{
return MoveResult.Draw;
}
else if(ComputerMove > PlayerMove || (ComputerMove == Move.Rock && PlayerMove == Move.Scissor))
{
return MoveResult.ComputerWon;
}
else
{
return MoveResult.PlayerWon;
}
}
}
}
}
这将允许您更新中心方法中的颜色,如本例中所示:
private void RockButton_Click(object sender, RoutedEventArgs e)
{
engine.PlayerMove = GameEngine.Move.Rock;
displayResult();
}
private void PaperButton_Click(object sender, RoutedEventArgs e)
{
engine.PlayerMove = GameEngine.Move.Paper;
displayResult();
}
private void ScissorButton_Click(object sender, RoutedEventArgs e)
{
engine.PlayerMove = GameEngine.Move.Scissor;
displayResult();
}
private void displayResult()
{
switch(engine.Result)
{
case GameEngine.MoveResult.Draw:
//Display message and change color
break;
case GameEngine.MoveResult.PlayerWon:
break;
case GameEngine.MoveResult.ComputerWon:
break;
}
}
因为您将问题标记为XAML,所以还可以创建类似ViewModel的东西,它存储要显示的颜色和消息字符串。
NotifyPropertyChanged
将导致您的GUI更新。您是否考虑过从UI中抽象实际的游戏?目前看来,用户界面和游戏并没有真正分开。通过将代码结构化为自定义类,您应该能够使代码看起来更结构化。所有的游戏逻辑计算都发生在游戏类中。这些消息和矩形的着色在主类中更具装饰性。我计划将这些方法存储在方法中,但将这些方法保留在主类中。在这种情况下,您的思路是正确的。但是你应该用一种方法来封装颜色。我看看能不能弄一个小样品。给我几分钟…谢谢。谢谢。关于封装颜色,我没有这样做,因为这些字段是在main方法中声明的。