C# 在方法中放置矩形颜色和消息框的选择

C# 在方法中放置矩形颜色和消息框的选择,c#,xaml,C#,Xaml,做了一个简单的剪刀纸石头游戏。当你按下一个按钮(3个不同的按钮,每种选择一个剪刀/纸/石头),如果你赢了,输了或抽签,它会返回。它还为人类和计算机选择的选项(矩形)加上一条信息,告诉人们是赢了还是输了 game.play方法根据其参数输入计算谁赢了。1是石头,2是纸,3是剪刀。计算机的选择是随机的 下面的代码可以工作,但会发现它很混乱,并试图找到一种方法将所有颜色放在一个方法中,将所有消息放在一个方法中。考虑到有这么多的颜色和信息选项,我感到相当困惑。以下代码用于选择由人类制作的纸张。做建议。多

做了一个简单的剪刀纸石头游戏。当你按下一个按钮(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方法中声明的。