2017-07-15 303 views
1

我試圖詢問用戶他們是否想通過程序再次玩遊戲。如果用戶選擇Yes,則所有變量將被設置回開始狀態,並且如果他們選擇No,則它們只返回到表單。我遇到的問題是我不希望使用Application.Restart(),有沒有辦法在不使用Application.Restart()的情況下重新初始化程序?在VB中重新初始化變量回到開始狀態

代碼對於程序:

'This Procedure Disables Play Continuation, Asks User To Play Again, & Initializes Starting Status 
Sub DisplayPlayAgain() 

    'Disable Button That Allows User To Continue Play 
    cmdGuess.Enabled = False 

    'Display A Button Asking User To Play Again 
    Dim answer As DialogResult 
    MessageBox.Show("Would You Like To Play Again?", " Confirmation of Quit", MessageBoxButtons.YesNo) 
    If answer = vbYes Then 

     'Reset Variables back to Starting Status 
     lstNumberGuess.Items.Clear() 
     lblTotalCount.Text = String.Empty 
     lblAnswer.Text = String.Empty 
     txtUserGuess.Text = String.Empty 
     lblAnswer.BackColor = Color.FromKnownColor(KnownColor.Control) 
     shrtCounterTotal = 0 
     shrtSecret = shrtRandom.Next(1, 100) 

     'Set Focus Back to textbox 
     txtUserGuess.Select() 

     'Allow User to Play Again 
     Application.Restart() 
    Else 
     'Or if No is selected, return to the form 
    End If 
End Sub 
+0

未重置變量返回到起始狀態就夠了嗎?究竟是什麼問題? –

+0

沒有什麼魔法可以做。如果您希望將字段設置爲特定值,請將其設置爲特定值。就是這樣,就是這樣。唯一的另一種方法是將所有這些字段放入一個類中,以便在需要默認值時創建一個新實例。 – jmcilhinney

+0

如果您重新啓動應用程序,重置變量將不起作用,因爲重新啓動時會再次發生。我假設你需要重新啓動你的應用程序啓動邏輯中的遊戲初始化邏輯。我會推薦的是從一個你可以從你的啓動邏輯和再次播放邏輯調用的方法中獲得這種方法,然後你不需要調用'Application.Restart()' – Fabulous

回答

1

不能使用Application.Restart()

與您的代碼的問題是這樣的:

Dim answer As DialogResult 
MessageBox.Show("Would You Like To Play Again?", " Confirmation of Quit", MessageBoxButtons.YesNo) 
If answer = vbYes Then 

你永遠分配MessageBox結果你answer變量。試試這個:

Dim answer As DialogResult = MessageBox.Show("Would You Like To Play Again?", " Confirmation of Quit", MessageBoxButtons.YesNo) 
If answer = vbYes Then 

至於重置您的變量。

您有兩種選擇。首先,您正在嘗試執行手動重置它們。簡化的東西可以讓你使用初始化了一個方法裏面你的遊戲,始終都調用該方法啓動或重新啓動遊戲:

Sub InitGame() 
    lstNumberGuess.Items.Clear() 
    lblTotalCount.Text = String.Empty 
    lblAnswer.Text = String.Empty 
    txtUserGuess.Text = String.Empty 
    lblAnswer.BackColor = Color.FromKnownColor(KnownColor.Control) 
    shrtCounterTotal = 0 
    shrtSecret = shrtRandom.Next(1, 100) 

    'Set Focus Back to textbox 
    txtUserGuess.Select() 

End Sub 

所以重新啓動:

Sub DisplayPlayAgain() 

    'Disable Button That Allows User To Continue Play 
    cmdGuess.Enabled = False 

    'Display A Button Asking User To Play Again 
    Dim answer As DialogResult = MessageBox.Show("Would You Like To Play Again?", " Confirmation of Quit", MessageBoxButtons.YesNo) 
    If answer = vbYes Then 
     InitGame() 
    Else 
     'Or if No is selected, return to the form 
    End If 
End Sub 

你的另一種選擇是在自己的課堂上定義你的遊戲,並且每次你想要開始或重新開始遊戲時,只需創建一個新的課程實例。

例如,您可以將您的遊戲移動到自己的控件中,併爲遊戲完成時連接事件。父控制可以決定創建一個新遊戲,創建一個新的控件實例並加載它。

事情是這樣的:

Public Class GameFinishedArgs 
    Inherits EventArgs 
    Public PlayAgain As Boolean 

    Public Sub New(PlayAgain As Boolean) 
     Me.PlayAgain = PlayAgain 
    End Sub 
End Class 

Public Class Game 
    Inherits Control 
    Public Event GameFinished As EventHandler 
    Public Sub New() 
     lstNumberGuess.Items.Clear() 
     lblTotalCount.Text = String.Empty 
     lblAnswer.Text = String.Empty 
     txtUserGuess.Text = String.Empty 
     lblAnswer.BackColor = Color.FromKnownColor(KnownColor.Control) 
     shrtCounterTotal = 0 
     shrtSecret = shrtRandom.Next(1, 100) 
    End Sub 
    Public Sub Game_Load(Sender As Object, E As EventArgs) Handles MyBase.load 
     StartGame() 
    End Sub 
    Sub DisplayPlayAgain() 

     'Disable Button That Allows User To Continue Play 
     cmdGuess.Enabled = False 

     'Display A Button Asking User To Play Again 
     Dim answer As DialogResult 
     answer = MessageBox.Show("Would You Like To Play Again?", " Confirmation of Quit", MessageBoxButtons.YesNo) 
     RaiseEvent GameFinished(Me, New GameFinishedArgs(answer = vbYes)) 

    End Sub 
End Class 

Public Class Form1 
    Inherits System.Windows.Forms.Form 
    Public Sub Form1_Load(Sender As Object, E As EventArgs) Handles MyBase.Load 
     LoadGame() 
    End Sub 
    Public Sub LoadGame() 
     Dim GameControl As New Game() 
     AddHandler GameControl.GameFinished, New EventHandler(AddressOf OnGameFinished) 
     GameControl.Top = 0 
     GameControl.Left = 0 
     GameControl.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right Or AnchorStyles.Bottom 
     GameControl.Dock = DockStyle.Fill 
     Me.Controls.Add(GameControl) 
    End Sub 
    Public Sub OnGameFinished(Sender As Object, E As GameFinishedArgs) 
     Dim GameControl As Game = Sender 

     RemoveHandler GameControl.GameFinished, New EventHandler(AddressOf OnGameFinished) 

     If (E.PlayAgain) Then 
      LoadGame() 
     End If 
    End Sub 
End Class 
+0

謝謝亞歷山大 – MB9