【问题标题】:How do I make pictureboxes show random images that also don't repeat?如何让图片框显示不重复的随机图像?
【发布时间】:2013-07-07 11:23:33
【问题描述】:

我是 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 速成版。非常感谢任何帮助,如果您需要更多详细信息,请告诉我!我在这里绝望了!!

基本上,我如何阻止图像重复并阻止错误出现。另外,没有错误发生,但是如果单击蝴蝶图像,则它不会显示 msgbox,那是什么问题?

【问题讨论】:

    标签: vb.net image random picturebox repeat


    【解决方案1】:

    将你的十张图片放在一个数组中,随机播放,一次选择两张,五次。

    【讨论】:

    • 我已经完成了数组部分,但是我该如何打乱它们以便它们被随机分配到两个图片框之一?非常感谢。
    • 别担心!弄清楚了。感谢您的想法 - 工作得很好!
    【解决方案2】:

    创建您自己的从 Image 继承的对象,但还包括一个指示“已使用”的标志。您也可以轻松地包含其他控制信息。

    【讨论】:

      【解决方案3】:

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

      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 应该可以解决这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 2014-12-17
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多