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

时间:2013-12-08 15:42:34

标签: 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();
        }  

1 个答案:

答案 0 :(得分:0)

如果要清理代码,应尝试搜索看起来像是复制和粘贴的内容。我假设你有一个类似于你在这里发布的“Rock”和“Scissor”的方法。

在这种情况下,你可以重组你的游戏类来保存一个临时游戏结果,表明谁赢了。此外,您可以用枚举替换“字符串结果”。

这是一个小班来说明我的意思。请注意,我尚未测试此类,因此可能会返回错误的结果

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更新。