Превращение «Что, если» в регистр выбора

#.net #vb.net

#.net #vb.net

Вопрос:

Вопрос в том, что я в основном написал игру «Камень, ножницы, бумага» в VB.NET используя инструкции If и задаваясь вопросом, как именно я бы попытался вместо этого применить это к Select Case.

Профессор был довольно ужасен в обучении вещам и до сегодняшнего дня не сообщал нам, что это должен быть Select Case (это должно быть завтра ._.)

Открытый класс Form1

     Dim randomGenerator As New Random


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub


    Private Sub rdoROCK_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdoROCK.CheckedChanged
        If rdoROCK.Checked = True Then
            picROCK.Visible = True
        Else
            picROCK.Visible = False
        End If
    End Sub

    Private Sub rdoPAPER_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdoPAPER.CheckedChanged
        If rdoPAPER.Checked = True Then
            picPAPER.Visible = True
        Else
            picPAPER.Visible = False
        End If
    End Sub

    Private Sub rdoSCISSORS_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdoSCISSORS.CheckedChanged
        If rdoSCISSORS.Checked = True Then
            picSCISSORS.Visible = True
        Else
            picSCISSORS.Visible = False
        End If
    End Sub


    Private Sub btnSTART_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSTART.Click
        Dim computerChoice As Integer

        randomGenerator.Next(1, 4)
        computerChoice = randomGenerator.Next(1, 4)

        'If computerChoice = 1 Then
        'picROCK2.Visible = True
        'ElseIf computerChoice = 2 Then
        'picPAPER2.Visible = True
        'ElseIf computerChoice = 3 Then
        'picSCISSORS2.Visible = True
        'End If

        If computerChoice = 1 Then
            picROCK2.Visible = True
            If rdoROCK.Checked = True Then
                lbltie.Visible = True
            ElseIf rdoPAPER.Checked = True Then
                lblwin.Visible = True
            ElseIf rdoSCISSORS.Checked = True Then
                lbllose.Visible = True
            End If
        End If

        If computerChoice = 2 Then
            picPAPER2.Visible = True
            If rdoROCK.Checked = True Then
                lbllose.Visible = True
            ElseIf rdoPAPER.Checked = True Then
                lbltie.Visible = True
            ElseIf rdoSCISSORS.Checked = True Then
                lblwin.Visible = True
            End If
        End If

        If computerChoice = 3 Then
            picSCISSORS2.Visible = True
            If rdoROCK.Checked = True Then
                lblwin.Visible = True
            ElseIf rdoPAPER.Checked = True Then
                lbllose.Visible = True
            ElseIf rdoSCISSORS.Checked = True Then
                lbltie.Visible = True
            End If
        End If




    End Sub

    Private Sub Label5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblwin.Click

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        picROCK.Visible = False
        picROCK2.Visible = False
        picPAPER2.Visible = False
        picPAPER.Visible = False
        picSCISSORS.Visible = False
        picSCISSORS2.Visible = False
        lblwin.Visible = False
        lbltie.Visible = False
        lbllose.Visible = False
        rdoROCK.Checked = False
        rdoPAPER.Checked = False
        rdoSCISSORS.Checked = False

    End Sub
End Class
  

Комментарии:

1. не используйте SHOTGUN() для получения другого случая 😉

2. Настоящий программист ™ использовал бы массивы элементов управления, поэтому ни операторы If, ни Select не используются. Поиск ЗАКОНЧЕН (не повторяйтесь).

Ответ №1:

Я полагаю, вы ищете, чтобы 1, 2 или 3 были вашими Select Case — это выглядело бы примерно так:

 Select Case computerChoice
    Case 1
        ' Do what's currently in your [if computerChoice = 1] section
    Case 2
        ' Do what's currently in your [if computerChoice = 2] section
    Case 3
        ' Do what's currently in your [if computerChoice = 3] section
End Select
  

Комментарии:

1. таким образом, Case # будет соответствовать случайно сгенерированному числу, чтобы решить, что выберет компьютер?

2. Не глядя на логику вашей программы, Select Case оператор — это то же самое, что и If оператор, просто с несколькими другими правилами. Если ваши If computerChoice = инструкции работают правильно, то Select Case будет делать точно то же самое.

3. итак, в предыдущем я бы превратил это во что-то подобное? pastebin.com/A39nujdw

4. Кроме obv, вместо End case был бы End Select, мой плохой ^^

5. Нет, это было бы больше похоже на: pastebin.com/tyafq3dX — вы не можете Select Case установить несколько флажков — их вам придется делать по старинке. A Select Case позволяет вам взять одно значение (например, computerChoice ) и сравнить его с несколькими значениями. Это не предназначено для того, чтобы помочь вам, когда вы проверяете несколько сценариев (например, установлены ли три разных флажка).

Ответ №2:

Вы могли бы провести рефакторинг своего кода с помощью Select Case :

 Select Case rdoROCK.Checked
        Case True
            picROCK.Visible = True
        Case False
            picROCK.Visible = False
 End Select
  

Или для краткости:

 picROCK.Visible = rdoROCK.Checked
  

На вашем основном я бы также создал enum для удобства чтения:

 Enum RPS
    Paper = 1
    Rock = 2
    Scissors = 3
End Enum

'now deciding what to show for win, lose or draw:
    Select Case computerChoice
        Case RPS.Paper
            UpdateFormOnPaper()
        Case RPS.Rock
            UpdateFormOnRock()
        Case RPS.Scissors
            UpdateFormOnScissors()
    End Select

 'a method to update the for Win, Lose or Draw for each choice.
 Sub UpdateFormOnRock()        
    picROCK2.Visible = True

    Select Case True
        Case rdoROCK.Checked
            lbltie.Visible = True
        Case rdoPAPER.Checked
            lblwin.Visible = True
        Case rdoSCISSORS.Checked
            lbllose.Visible = True
    End Select
End Sub
  

Комментарии:

1. 1 за краткий вариант; -1 даже за предложение select case проверить логическое значение.

2. @Чао: ты бы проголосовал против меня за это? Он явно спросил: «как это можно сделать с помощью select case»? 🙂

3. @p.campbell: Чертовски верно, я бы проголосовал против тебя за это. Еще следующее, что я знаю, я закончу тем, что посмотрю на это в реальном коде, когда кто-то другой увидит это и подумает, что это хорошая идея. 🙂

4. @chao: невероятно; вы отклонили мой ответ за то, что ответили на вопрос парня, а также предложили abosolute лучшее решение ниже? Для ясности: я не «предлагал выбрать регистр для проверки логического значения». Я только ответил на его прямой вопрос, а также на несколько полезных советов.

5. @p.campbell: Нет … я не снижал голос. 1 отменяет значение -1. Чистая оценка: 0. 🙂