我刚刚发布了我当前的代码。但是我收到此错误:错误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
答案 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