如何使图片框显示也不重复的随机图像?

时间:2013-07-07 11:23:33

标签: vb.net image random picturebox repeat

我是Visual Basic的新手,我正在尝试创建一个游戏,向用户呈现两个图像,并需要选择正确的一个(像测验一样)。但是,我希望它具有挑战性,因此每当用户再次播放时,希望图像随机配对。

为此,我有大约10张图片,一次呈现两张。如果玩家点击正确的图像,他们可以继续并接收将使用标签记录的点,并且两个新图像将替换它们并重复该过程,但如果它们不正确则会出现一条消息,说“不正确! “然后他们将失去一个标记,两个新的图像将取代他们。

我使用TableLayoutPanel和两个图片框创建了界面。我已经制作了一些生成随机图片的代码,但最终会重复自己,这是我不想要的!但是,如果我在代码的末尾放置RemoveAt它们不会重复,但是在玩家点击图片6次之后会产生一个错误,说“索引超出范围”,这发生在游戏结束之前,所以不要不想要那个!

这是我到目前为止的代码:

首先:

Public Sub New()
    ' This call is required by Windows Form Designer
    InitializeComponent()
    ' Add any initialization after the InitializeComponent() call
    AssignImagesToSquares()
End Sub

Private random As New Random

Private images =
    New List(Of Image) From {My.Resources.Aeroplane, My.Resources.Bicycle, My.Resources.Beginner_button, My.Resources.Bird, My.Resources.Butterfly,
                             My.Resources.Cartoon_Background_Wallpaper_719574, My.Resources.cartoon_farm, My.Resources.Clock, My.Resources.Egg_Timer,
                             My.Resources.Moderate_background, My.Resources.Tree, My.Resources.Umbrella, My.Resources.Woman}

Private Sub AssignImagesToSquares()

    For Each Control In TableLayoutPanel1.Controls
        Dim imageLabel = TryCast(Control, PictureBox)
        If imageLabel IsNot Nothing Then
            Dim randomNumber = random.Next(images.Count)
            imageLabel.Image = images(randomNumber)
            images.RemoveAt(randomNumber)
        End If
    Next
End Sub

 Private Sub picturebox_clicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click,
    PictureBox1.Click

    Dim clickedLabel = TryCast(sender, PictureBox)

    If clickedLabel.Image Is My.Resources.Butterfly Then
        MsgBox("This is incorrect")
        AssignImagesToSquares()
    Else
        AssignImagesToSquares()
    End If
End Sub

代码按顺序编写。使用Visual Basic 2010 Express。非常感谢任何帮助,如果您需要更多细节,请告诉我!我绝望了!

基本上,如何阻止图像重复并停止显示错误。此外,没有错误发生,但如果点击蝴蝶图像然后它没有显示msgbox,那么那里有什么问题?

3 个答案:

答案 0 :(得分:1)

创建自己的继承自Image的对象,但也包含一个指示'used'的标志。您也可以轻松地包含其他控制信息。

答案 1 :(得分:1)

将十张图像放入一个数组中,随机播放,一次挑两个,五次。

答案 2 :(得分:1)

可以使用数组或图像列表。只需使用tag属性来表示已使用。也许是这样的:

Public Sub New()
    ' This call is required by Windows Form Designer
    InitializeComponent()
    ' Add any initialization after the InitializeComponent() call
    AssignImagesToSquares()
End Sub

Private random As New Random

Private images =
    New List(Of Image) From {My.Resources.Aeroplane, _
                             My.Resources.Bicycle, _
                             My.Resources.Beginner_button, _
                             My.Resources.Bird, _
                             My.Resources.Butterfly, _
                             My.Resources.Cartoon_Background_Wallpaper_719574, _
                             My.Resources.cartoon_farm, _
                             My.Resources.Clock, _
                             My.Resources.Egg_Timer, _
                             My.Resources.Moderate_background, _
                             My.Resources.Tree, _
                             My.Resources.Umbrella, _
                             My.Resources.Woman}

Private Sub AssignImagesToSquares()

    For Each Control In TableLayoutPanel1.Controls
        Dim imageLabel = TryCast(Control, PictureBox)
        If imageLabel IsNot Nothing Then
            Dim Done as Boolean = False
            'Loop until it finds an image that hasn't been used.  Then set Done 
            'to true to exit the while loop
            While Not Done
                Dim randomNumber = random.Next(images.Count-1)
                If images(randomNumber).Tag.ToString <> "Used"  Then
                    imageLabel.Image = images(randomNumber)
                    images(randomNumber).Tag = "Used"
                    Done = True
                 End If
            End While
        End If
    Next
End Sub

 Private Sub picturebox_clicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click,
    PictureBox1.Click

    Dim clickedLabel = TryCast(sender, PictureBox)

    If clickedLabel.Image Is My.Resources.Butterfly Then
        MsgBox("This is incorrect")
        AssignImagesToSquares()
    Else
        AssignImagesToSquares()
    End If
End Sub

你的索引越界错误可能来自于设置random.Next到images.Count的上限。伯爵总是比最高指数多一个。因此,如果随机数等于Count,则会出现错误。使用images.Count-1应该可以解决这个问题。