我应该在何处放置此if语句,以便在单击每个按钮时执行它?

时间:2019-02-25 13:35:48

标签: c# .net forms winforms function

我正在为Rock Paper Scissors Windows Forms游戏编程,可以选择使用键盘箭头与计算机或其他播放器对战。 该表格尚未完成,因为根据用户的玩法,它会在图片框上显示一些图片。

选中checkbox1时,它看起来像这样: enter image description here

选中checkbox2时,它看起来像这样:

enter image description here

我已经编写了函数computer_choiceCheck_Winner,它们分别返回随机的计算机选择和每一轮的获胜者。 当有人单击带有选项的按钮时,choice1将设置为按钮对应的选项。 然后我写了这段代码,我不知道将它放在哪里。因为我希望程序仅在两个玩家都玩过的情况下介绍获胜者和每个选择。基本上,我希望在单击屏幕上的图标之一并且玩家两个也按下箭头之一后执行此操作。基本上,当choice1choice2都不同于null且等于三个选择之一时。我已经在Rock_click函数上写了choice1 = "Rock";之类的内容。 另外,我想知道将此函数添加到class1是否是个好主意,如果是,那么应该如何做才能使用form1变量。

我写了这样的东西,但我不知道如何使用它,以便它考虑到我刚才提到的事件。

if (checkBox1.Checked && choice1 != null)
{
    string choice2 = class1.computer_choice();

    MessageBox.Show("Winner is " + class1.Check_Winner(choice1, chocie2);
    MessageBox.Show("Player one chose " + choice1 + " and computer chose " + choice2);
    choice1= null;
}
else if (checkBox2.Checked && choice2 != null && choice1 != null)
{
    MessageBox.Show("Winner is " + class1.Check_Winner(choice1, choice2 ));
    MessageBox.Show("Player one chose " + choice1+ "and player two chose " + choice2);
    choice1 = choice2 null;
}

2 个答案:

答案 0 :(得分:0)

您快到了!我看到您将关注点分开了:您有不同的操作过程,让计算机选择一个值并确定获胜者。

现在您要做的就是将输入和输出也分开。

操作员可以按三个按钮。配置您的窗体,以便当按下这三个按钮中的任何一个时,将调用以下功能:

bool IsTwoPlayerGame => return this.CheckBoxTwoPlayers.Checked;

void OnPlayButtonPressed(object sender, EventArgs e)
{
    // operator pressed one of the playButtons. Which button is in the sender
    if (Object.ReferenceEquals(sender, buttonRock))
       Play(Choice.Rock);
    else if (Object.ReferenceEquals(sender, buttonPaper))
       Play(Choice.Paper);
    else
       Play(Choice.Scissors);
}

显然,我们需要Play函数,其中包含一个说明此Played内容的参数。该功能必须等待其他播放器做出选择(无论是人还是计算机都没有关系)。一旦其他玩家做出选择,我们将检查获胜者:

void Play(Choice thisPlayersChoice)
{
    var otherPlayersCoice = this.FetchOtherPlayersChoice();
    var winner = this.CheckWinner(thisPlayersChoice, otherPlayersChoice);
    DislayWinner(thisPlayersChoice, otherPlayersChoice, winner);
}

Choice FetchOtherPlayersChoice()
{
    return this.IsTwoPlayerGame ??
       this.OtherPlayersChoice() :
       this.ComputerChoice();
}

void Display(Choice choice1, Choice choice2, Winner winner)
{
    string displayText = this.IsTwoPlayerGame ?
        $"Player 1 chose {choice1}, Player 2 chose {choice2}. Winner: {winner}" :
        $"Player 1 chose {choice1}, Computer chose {choice2}. Winner: {winner}";
    MessageBox.Show(displayText);
}

由于您分离了关注点,因此您的过程不会因各种in和output而混乱。例如:一种改进是用两个单选按钮更改您的两个复选框,因此始终很清楚我们是单人游戏还是两人游戏。您代码中的更改将很小。另外,如果您决定只选择一个复选框,上面写着“与计算机对抗”

顺便说一句,如果其他玩家花一些时间回答他的问题,您将遇到问题:您的窗口在此期间无法更新。但是这个问题是一个全新的问题

答案 1 :(得分:0)

首先,您不应使用复选框,因为它既是播放器还是AI还是播放器还是播放器,不能两者都使用。相反,请尝试RadioButton

无论如何,您编写的代码很好,您只需要从6个按钮的单击事件中的每个调用它即可。如果所有6个事件都使用这些if语句调用一个方法,那么您应该很好。