2017-11-16 2 views
0

私はvb.netの三項演算子を使用して動作するロックペーパーはさみゲームを取得しようとしていますが、実際の結果がIE、R対P =損失、R対S =損失、R対R =損失に関係なく、同じ結果を出力し続けます)ロックペーパーはさみIIFしかしIIFは結果の名前のconstの値を変更していません

私はもともと試したことがありますoutcome/draw boolをプレースホルダーとして使用し、最後にifを付けて結果を表示し、IIFの直後のifs内にexitスイッチを追加しましたが、それでも結果を変更しないループが発生します。

Public Class Form1 
    Const ROCK As Integer = 1 
    Const PAPER As Integer = 2 
    Const SCISSORS As Integer = 3 
    Dim computerThrow As Integer 
    Dim comThrow As String = "Rock" 
    Dim wins As Integer 
    Dim losses As Integer 
    Dim draws As Integer 
    Dim outcome As Boolean = True 
    Dim draw As Boolean = True 

    'Spent two days debugging, kept getting more broken. hmm 
    Private Sub btnThrow_Click(sender As Object, e As EventArgs) Handles btnThrow.Click 

     'Generate computer throw 
     Randomize() 
     computerThrow = Int(3 * Rnd() + 1) 

     'Select case block 
     Select Case computerThrow 
      Case ROCK 
       comThrow = "rock" 
       IIf(Me.radRock.Checked = True, draw = True, 1 = 1) 'Ternarys to decide outcome/draw 
       If draw = True Then 'If to decide whether to exit or not 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", it's a draw!" 
        draws = draws + 1 
       End If 
       IIf(Me.radPaper.Checked = True, outcome = True, 1 = 1) 
       If outcome = True Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", you win!" 
        wins = wins + 1 
       End If 
       IIf(Me.radScissors.Checked = True, outcome = False, 1 = 1) 
       If outcome = False And draw = False Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", you lose!" 
        losses = losses + 1 
       End If 
      Case PAPER 
       comThrow = "paper" 
       IIf(Me.radRock.Checked = True, outcome = False, 1 = 1) 
       If outcome = False And draw = False Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", you lose!" 
        losses = losses + 1 
       End If 
       IIf(Me.radPaper.Checked = True, draw = True, 1 = 1) 
       If draw = True Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", it's a draw!" 
        draws = draws + 1 
       End If 
       IIf(Me.radScissors.Checked = True, outcome = True, 1 = 1) 
       If outcome = True Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", you win!" 
        wins = wins + 1 
       End If 
      Case SCISSORS 
       comThrow = "scissors" 
       IIf(Me.radRock.Checked = True, outcome = True, 1 = 1) 
       If outcome = True Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", you win!" 
        wins = wins + 1 
       End If 
       IIf(Me.radPaper.Checked = True, outcome = False, 1 = 1) 
       If outcome = False And draw = False Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", you lose!" 
        losses = losses + 1 
       End If 
       IIf(Me.radScissors.Checked = True, draw = True, 1 = 1) 
       If draw = True Then 
        Me.lblWinner.Text = "Computer throws " + comThrow + ", it's a draw!" 
        draws = draws + 1 
       End If 
     End Select 

     Me.lblResults.Text = "wins: " + wins.ToString() + " Lose: " + losses.ToString() + " draws: " + draws.ToString() 

    End Sub 
End Class 
+2

チェックし、[ドキュメント](httpsを書くことができます:// MSDNをMicrosoft.com/ja-ja/library/27ydhh0d(v = 90).aspx)、私はそれがあなたの考えであるとは思わない。 IIfは変数を設定するのではなく、変数を返すことを意味します。今のところ、IIfの戻り値はどこにも使用していません。 –

+0

@the_lotus IIFの中でlblWinner.Textを設定しようとしましたが、うまくいかないでしょうか?それは表現を期待していると私に言った? – Zen72901

+0

@ Zen72901それは、値を設定するのではなく比較を行います。 –

答えて

5

IIFはVB.NETの3項演算子ではありません。 IIF is a functionであり、真部分と偽部分の両方が評価される。つまり、チェックボックスのチェック状態が何であっても、IIF関数の真の部分が常に実行されるため、常に変数にtrueまたはfalseが割り当てられます。 shortcircuit evaluationを使用しています(表現、真の部分、偽の一部)は、式の値を選択した場合はVB.NETでconditional ternary operatorある一方

。 したがって、この方法で

draw = If(Me.radRock.Checked, True, False) 
    If draw Then 
    .... 

をあなたのコードを書き直す必要があります。しかし、この時点であなたは、単に

draw = Me.radRock.Checked 
    If draw Then 
    .... 

または

outcome = Not Me.radRock.Checked 
    .... 
関連する問題