Visual Basics游戏构建错误,如何处理WithEvents?

时间:2014-11-25 19:57:22

标签: vb.net windows visual-studio visual-studio-2012 visual-studio-2013

我刚刚发布了我当前的代码。但是我收到此错误:错误1 Handles子句需要在包含类型或其基本类型之一中定义的WithEvents变量。 C:\ Users \ Admin \ Documents \ Visual Studio 2013 \ Projects \ dicegamefolder \ NewDiceBattleGame \ NewDiceBattleGame \ Form1.vb 12 117 NewDiceBattleGame

我如何解决我的问题,以便我看到骰子滚动,我可以看到结果和分数?我对旧代码进行了更改,但仍然没有按照我想要的方式进行操作。如果有人能在这个问题上和我在一起,直到我让整场比赛正常运转,我真的非常感谢你的帮助。再一次感谢,并希望很快收到你的消息!

我将发布我的GUI快照,代码和游戏说明。再次感谢大家的帮助!

http://imageshack.com/a/img673/5584/jV0f0c.png

人类玩家使用VB内置的随机数生成器与计算机对战。游戏的目标是让对手获得比其他人更高的分数,以1到99的最佳奇数匹配格式赢得比赛(如1,3,5,7,9,11, 13等等。

说明如下:1。必须检查输入的匹配数是否有效,必须弹出一个消息框,并显示相应的消息以指示输入无效。弹出窗口必须显示输入是否无效。 2.游戏开始后,应禁用(或灰显)最佳游戏输入框(文本框),直到按下重启按钮或匹配结束。 3.必须跟踪对手得分,遵循游戏用户界面截图格式和下面的其他详细信息。 PC vs You框(标签)应显示当前分数。 4.结果框(标签)应显示谁赢了当前比赛或者是否有平局(即"你赢了#34;," PC胜利","它是一个平局& #34)。 5.每个Roll Total Boxes(标签)应相应地显示PC的总数和人类玩家的掷骰。 6.只有一个得分高于另一个得分的游戏,并列游戏不会。 7.应根据集合的结果显示以下消息框弹出窗口。 8.按“退出”按钮应显示以下弹出窗口:是否要退出?

 Public Class DiceBattle

Dim randomObject As New Random() 'Create Random object
Dim BestOfGamesCounter As Integer
Dim PC As Integer = 0
Dim You As Integer = 0

Private Function GetRandom() As Integer
    Return randomObject.Next(1, 7)
End Function

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress
    If Not Char.IsLetter(e.KeyChar) Then e.Handled = True 'ignore everything but letter keys
End Sub

Private Sub RollButton_Click(sender As Object, e As EventArgs) Handles RollButton.Click
    If CInt(GameTextBox.Text) <= 0 Then
        MsgBox("Number of Games > 0", MsgBoxStyle.Critical)
        Application.Restart()
    End If

    If CInt(GameTextBox.Text) > 0 Then
        BestOfGamesCounter = Convert.ToInt32(GameTextBox.Text)
    End If


    Dim tempRandom As Integer = GetRandom()
    PC1.Image = ImageList1.Images(tempRandom - 1)
    PC = PC + tempRandom
    tempRandom = GetRandom()
    PC2.Image = ImageList1.Images(tempRandom - 1)
    PC = PC + tempRandom
    PC3.Image = ImageList1.Images(tempRandom - 1)
    PC = PC + tempRandom
    tempRandom = GetRandom()
    You4.Image = ImageList1.Images(tempRandom - 1)
    PC = You + tempRandom
    You5.Image = ImageList1.Images(tempRandom - 1)
    You = You + tempRandom
    tempRandom = GetRandom()
    You6.Image = ImageList1.Images(tempRandom - 1)
    PC = You + tempRandom
    If (PC > You) Then
        'You lost
    ElseIf (PC = You) Then
        'Tie
    Else
        'You win
    End If

End Sub

Private Sub DisplayDie(diePictureBox As PictureBox)

    Dim face As Integer = randomObject.Next(1, 7)

    ' adjust pip count to image index by subtracting one
    diePictureBox.Image = ImageList1.Images(face - 1)

End Sub


Private Sub ExitButton_Click(sender As Object, e As EventArgs) Handles ExitButton.Click
    Dim RESPONSE As MsgBoxResult
    RESPONSE = MsgBox("Do you want to exit?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question)
    If RESPONSE = MsgBoxResult.Yes Then
        Me.Dispose()
    End If
End Sub


Private Sub GameTextBox_Validating(sender As Object, e As EventArgs) Handles GameTextBox.TextChanged
    If GameTextBox.Text > "0" Then
        Do
            MsgBox(GameTextBox.Text + " round(s) will be played, enjoy!")
        Loop While GameTextBox.Text = "STOP"
    End If
    GameTextBox.Enabled = False
End Sub
End Class

1 个答案:

答案 0 :(得分:0)

这样的行,

If GameTextBox.Text <= "0" Then

这个,

If GameTextBox.Text > "0" Then

会导致无法预测的结果。这样做是将数字字符串(TextBox中的文本)与另一个字符串(“0”)进行比较。这没有多大意义,尽管VB.Net Uzis非常善于解决问题,但有时它不知道你想要做什么。

始终进行自己的显式转换,而不是将其留给编译器:

If CInt(GameTextBox.Text) <= 0 Then

If CInt(GameTextBox.Text) > 0 Then

注意Text属性显式转换为Integer,并且零周围缺少引号。这允许编译器在没有任何不确定性的情况下进行直接数值比较。这应该解决您在TextBox中输入“1”后重新启动应用程序的问题。


为了显示游戏结果(例如“You Win!”),您必须跟踪骰子卷的值。一种方法是为每个玩家创造一个价值。在课程的顶部,这可能类似于:

Dim dicePC As Integer = 0
Dim dicePlayer As Integer = 0

然后你可以在这些变量中计算每个骰子。我会重新安排一些事情......

Private Function GetRandom() As Integer
    Return randomObject.Next(1, 7)
End Function

然后,在RollButton_Click

的末尾
Dim tempRandom As Integer = GetRandom
PC1.Image = ImageList1.Images(tempRandom - 1)
dicePC = dicePC + tempRandom
tempRandom = GetRandom
PC2.Image = ImageList1.Images(tempRandom - 1)
dicePC = dicePC + tempRandom

等等,对于其他四个骰子......

然后你将有两个变量包含骰子卷的分数,你可以比较。

If (dicePC > dicePlayer) Then
    'You lost
ElseIf (dicePC = dicePlayer) Then
    'Tie
Else
    'You win
End If

使用这些提示可以让您更进一步。


编辑:解决您的InvalidCastException

听起来像TextBox中的某些内容无法转换为整数,从而导致错误。在this answer中,我提出了一个使用IsLetter的解决方案,以确保只允许将字母字符输入到特定的TextBox中。您可以通过检查Char.IsDigit在您希望仅输入数字的任何TextBox上以类似的方式使用此技术。务必将该行复制到正确的按钮的KeyPress处理程序中。

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress
    If Not Char.IsDigit(e.KeyChar) Then e.Handled = True  'ignore everything but number keys
End Sub

此外,您的骰子滚动代码有点误导。当您应该添加到dicePC时,您仍然会添加diceYou分数。试试这个:

Dim tempRandom As Integer = GetRandom()
PC1.Image = ImageList1.Images(tempRandom - 1)
dicePC = dicePC + tempRandom
tempRandom = GetRandom()
PC2.Image = ImageList1.Images(tempRandom - 1)
dicePC = dicePC + tempRandom
tempRandom = GetRandom()
PC3.Image = ImageList1.Images(tempRandom - 1)
dicePC = dicePC + tempRandom
tempRandom = GetRandom()
You4.Image = ImageList1.Images(tempRandom - 1)
diceYou = diceYou + tempRandom
tempRandom = GetRandom()
You5.Image = ImageList1.Images(tempRandom - 1)
diceYou = diceYou + tempRandom
tempRandom = GetRandom()
You6.Image = ImageList1.Images(tempRandom - 1)
diceYou = diceYou + tempRandom

您还可以删除DisplayDie的所有旧调用,包括函数本身:

DisplayDie(PC1)

编辑:第12行的错误是因为您复制/粘贴了我提供的代码而没有重命名该功能。这一行:

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress

两个地方它说“TextBox”需要重命名为你输入游戏数量的TextBox。我认为你打电话给你GameTextBox,所以这行应该是这样的:

Private Sub GameTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles GameTextBox.KeyPress