【问题标题】:rock paper scissors auto submitting石头剪刀布自动提交
【发布时间】:2015-04-08 14:45:37
【问题描述】:

我正在制作一个石头、纸、剪刀游戏,但当我实际运行该程序时遇到了麻烦。我在代码中没有收到错误,但是当我运行程序时,在用户可以选择他们的选项并点击提交按钮之前,消息框(我如何显示谁赢、输、平)已经弹出。我试过改变我的方法,但这也没有帮助。我不知道还能做什么。

private int choice(int min,int max)
    {

        Random ran = new Random();
        return ran.Next(min,max);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        int number = choice(1, 3);

        if (number == 1)
        {
        textBox1.Text = number.ToString("Rock");
        }
        else if (number == 2)
        {
        textBox1.Text = number.ToString("Paper");
        }
        else if (number == 3)
        {
        textBox1.Text = number.ToString("Scissors");
        }
        else
        {
        MessageBox.Show("The T-Rex broke.Sorry");
        }

      }
    private void rockRadioButton_CheckedChanged(object sender, EventArgs e)
    {
        int number = choice(1, 3);

        if (number == 3)
        {
            MessageBox.Show("Rock beats Scissors. You win!");
        }
        else if (number == 2)
        {
            MessageBox.Show("Paper beats Rock.You lose!");
        }
        else if (number == 1)
        {
            MessageBox.Show("Rock vs Rock. Tie!");
        }
        else{
            MessageBox.Show("T-Rex is off hunting.Come back later.");
        }
    }

    private void paperRadioButton_CheckedChanged(object sender, EventArgs e)
    {
        int number = choice(1, 3);

       if (number == 3)
       {
           MessageBox.Show("Scissors beats Paper.You lose!");
       }
       else if (number == 2)
       {
           MessageBox.Show("Paper vs Paper.Tie!");
       }
       else if (number == 1)
       {
           MessageBox.Show("Paper beats Rock.You win!");
       }
       else
       {
           MessageBox.Show("T-Rex is off hunting. Come back later.");
       }
    }

    private void scissorsRadioButton_CheckedChanged(object sender, EventArgs e)
    {
        int number = choice(1, 3);

        if (number == 3)
        {
            MessageBox.Show("Scissors vs Scissors.Tie!");
        }
        else if (number == 2)
        {
            MessageBox.Show("Scissors beats Paper.You win!");
        }
        else if (number == 1)
        {
            MessageBox.Show("Rock beats Scissors.You lose!");
        }
        else
        {
            MessageBox.Show("T-Rex is off hunting.Come back later.");
        }
    }
}

}

【问题讨论】:

  • 一个有价值的技术来确定像这样的简单错误(这不是错误,事情只是乱序发生)是en.wikipedia.org/wiki/Rubber_duck_debugging
  • 虽然我觉得我姐姐生气了,但我还是把她的玩具弄碎了,这真的很有帮助。我想到了。谢谢你的建议。
  • 大声笑!不用担心 Niomi。

标签: c#


【解决方案1】:

我完全不知道您实际上是如何设计要玩的游戏,但是,据我所知,每次您选择一个新的单选按钮时,您的程序实际上都会对游戏的结果做出决定,这不是你想要什么。

因此,您可能希望在各种 CheckedChanged 方法中推迟 MessageBox.Show();。让我们保持非常简单,只需使用enum 来保持您选择的状态。

    public enum Move
    {
        Rock, 
        Paper, 
        Scissors
    }

    private Move CurrentlySelectedMove = Move.Paper;

如果您不了解枚举,I suggest you check them out, as they are very useful。有了这对我们的帮助,您可以在通过单选按钮选择新的移动时保存移动。

关于那个话题,如果我没记错的话,您目前正在收听单选按钮上的 checkedChange 事件,这并不完全好,因为被选中的按钮 未选择的将触发事件,这有点破坏了选择移动的逻辑。因此,您实际上应该检查状态刚刚更改的按钮是否被选中。你可以这样做:

    private void rockRadioButton_CheckedChanged(object sender, EventArgs e)
    {
        if (rockRadioButton.Checked)
        {
            CurrentlySelectedMove = Move.Rock;
        }
    }

在这里,我们检查是否选中了此单选按钮。如果这是真的,我们将选定的移动设置为用户选择的移动。

现在,当玩家按下按钮时,我们需要做的就是从对手那里生成一个随机动作,并与我们自己当前选择的动作进行检查,如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        int number = int number = choice(0, 2);

        Move opponentMove = (Move) number;

        if (CurrentlySelectedMove == opponentMove)
        {
            MessageBox.Show("Draw !");  
        }
        else if ((CurrentlySelectedMove == Move.Rock && opponentMove == Move.Paper) ||
                (CurrentlySelectedMove == Move.Paper && opponentMove == Move.Scissors) ||
                (CurrentlySelectedMove == Move.Scissors && opponentMove == Move.Rock))
        {
            MessageBox.Show("You loose !");  
        }
        else
        {
            MessageBox.Show("You win !");     
        }
    }

枚举的有趣之处在于它们实际上只是伪装的整数,这意味着您可以轻松地从数字转换为 enum,正如您在 Move opponentMove = (Move) number; 行中看到的那样

大约有 10 亿件事情可以让这变得更好(我想我们将把关于 Binding 的课程留到下一次),但我建议您尝试理解这一点并自己尝试一下。

【讨论】:

    【解决方案2】:

    在您当前的设置下,每次单选按钮选择更改时,计算机都会运行。将您在 fooRadioButton_CheckedChanged 方法中的代码移动到 button1_Click 消息并在单选按钮选择更改时更新 textbox1.Text。

        private int choice(int min,int max)
        {
    
            Random ran = new Random();
            return ran.Next(min,max);
        }
    
    
        private void button1_Click(object sender, EventArgs e)
        {
    
            int number = choice(1, 3);
    
            if (number == 1)
            {
            //Computer selects rock
                if (rockRadioButton.IsChecked==true)
                {
                    MessageBox.Show("Rock vs Rock. Tie!");
                }
                else if(paperRadioButton.IsChecked==true)
                {
                    MessageBox.Show("Paper vs Rock. You win!");
                }
                else if(scissorsRadioButton.IsChecked==true)
                {
                    MessageBox.Show("Scissors vs Rock. You lose!");
                }
            }
            else if (number == 2)
            {
                //Computer selects Paper
                if (rockRadioButton.IsChecked == true)
                {
                    MessageBox.Show("Rock vs Paper. You lose!");
                }
                else if (paperRadioButton.IsChecked == true)
                {
                    MessageBox.Show("Paper vs Paper. Tie!");
                }
                else if (scissorsRadioButton.IsChecked == true)
                {
                    MessageBox.Show("Scissors vs Paper. You win!");
                }
            }
            else if (number == 3)
            {
               //Computer selects Scissors
               if (rockRadioButton.IsChecked == true)
               {
                   MessageBox.Show("Rock vs Scissors. You win!");
               }
               else if (paperRadioButton.IsChecked == true)
               {
                   MessageBox.Show("Paper vs Scissors. You lose!");
               }
               else if (scissorsRadioButton.IsChecked == true)
               {
                   MessageBox.Show("Scissors vs Scissors. Tie!");
               }
            }
            else
            {
            MessageBox.Show("The T-Rex broke.Sorry");
            }
    
          }
        private void rockRadioButton_CheckedChanged(object sender, EventArgs e)
        {
            textBox1.Text = "Rock";
        }
    
        private void paperRadioButton_CheckedChanged(object sender, EventArgs e)
        {
            textBox1.Text = "Paper";
        }
    
        private void scissorsRadioButton_CheckedChanged(object sender, EventArgs e)
        {
            textBox1.Text = "Scissors";
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多