Как я могу нацелить одну из моих картинных коробок, созданных во время выполнения? VB.NET - PullRequest
2 голосов
/ 18 октября 2011

Таким образом, в основном, я успешно рандомизировал определенные ящики с картинками в сетке, чтобы содержать мины, и показываю, что мои и для целей тестирования эти мины в настоящее время отображаются.Как вы думаете, что мне нужно сделать, чтобы иметь возможность сказать:

Если вы щелкнете по этой ячейке, а моя = 1 (есть моя), то вы проиграете.
Иначе, продолжайте.

достаточно просто, но я хочу применить это ко всем полям, независимо от того, насколько велика сетка.(ZonesX * Zones Y)

Самое большее, что я получил, это всплывающее окно MsgBox () при нажатии на кого-либо из них.

Все это создается во время выполнения.Вот мой код.

Public Class Form1
Inherits System.Windows.Forms.Form

Dim images(8) As Image 'declares image array

Dim zonesY As Integer = 10
Dim zonesX As Integer = 10

Dim Guy As Object
Dim pbxNewZone As PictureBox = DirectCast(Guy, PictureBox)  'declares pbxNewZone as a picturebox variable

Dim generator As New Random

Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    images(0) = Image.FromFile("blank.png")
    images(1) = Image.FromFile("1.png")
    images(2) = Image.FromFile("2.png")
    images(3) = Image.FromFile("3.png")
    images(4) = Image.FromFile("4.png")
    images(5) = Image.FromFile("5.png")
    images(6) = Image.FromFile("clear.png")
    images(7) = Image.FromFile("hit.png")
    images(8) = Image.FromFile("mine.png")

    Dim x As Integer  'declares x as an integer variable
    Dim y As Integer  'declares y as an integer variable
    Me.SuspendLayout()  'suspends creation of layout

    For y = 1 To zonesY 'starts a For loop (1 to zonesY number of loops)
        For x = 1 To zonesX  'starts a For loop (1 to zonesX number of loops)
            Dim zonesize1 As Integer
            Dim zonesize2 As Integer

            pbxNewZone = New PictureBox

            Dim blockStatus As Integer
            Dim allZones As Integer
            allZones = zonesX * zonesY
            blockStatus = generator.Next(0, allZones)

            pbxNewZone.Name = y & ", " & x
            If blockStatus < (allZones / 10) Then
                pbxNewZone.Tag = True
                If pbxNewZone.Tag = True Then
                    pbxNewZone.Image = images(8)
                End If
            Else
                pbxNewZone.Tag = False
                If pbxNewZone.Tag = False Then
                    pbxNewZone.Image = images(0)
                End If
            End If
            pbxNewZone.Height = 16
            pbxNewZone.Width = 16
            pbxNewZone.Tag = 0
            zonesize1 = pbxNewZone.Height 'sets out all of the boxes on the form.
            zonesize2 = pbxNewZone.Width
            pbxNewZone.Left = ((x - 1) * zonesize1 + 15)
            pbxNewZone.Top = ((y - 1) * zonesize2 + 15)
            Me.Controls.Add(pbxNewZone)
            '  Wire this control up to an appropriate event handler
            AddHandler pbxNewZone.Click, AddressOf pbxNewZoneClicked

        Next
    Next
    Me.Height = (pbxNewZone.Height * zonesY + 63)  'sets the height of fmmGame
    Me.Width = (pbxNewZone.Width * zonesX + 40)  'sets the width of frmGame

End Sub

Private Sub pbxNewZoneClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)

    Dim pb As PictureBox = DirectCast(sender, PictureBox)
    Dim pbTag As Boolean = DirectCast(sender, Boolean)

        If pb.Tag = True Then
            pb.Image = images(7) 'Hit Image
        Else
            pb.Image = images(6) 'Clear Image
        End If

    MsgBox(pb.Tag)

End Sub
End Class

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

Быстрый способ сделать это - использовать элемент Tag в PictureBox, чтобы отслеживать, есть ли мина или нет (или любые другие ваши условия).

pbxnewzone.Tag = 1   'can assign tags to all of your pictureboxes in a loop or at random if need be

Затем получите доступ к свойству Tag, приведя аргумент sender вашего метода pbxNewZoneClicked обратно к PictureBox:

Dim pb As PictureBox = DirectCast(sender, PictureBox)
If (pb.Tag = 1) Then
    'change game accordingly
End If
1 голос
/ 18 октября 2011

Я думаю, что одной панелью для всей сетки будет проще управлять и она будет менее ресурсоемкой, чем картинка для каждой ячейки.

Но для вашей проблемы с кликом:

Private Sub pbxNewZoneClicked(ByVal sender As Object, ByVal e As EventArgs)
  With DirectCast(sender, PictureBox)
    MsgBox(.Name)
  End With
End Sub
1 голос
/ 18 октября 2011

Если я что-то упустил, установите minePictureBox1.Tag = true, а затем проверьте его по событию clickИли вы можете установить его на 1 или что-то еще.Тег - это объект.

Это то, что вы ищете?Просто способ узнать, шахта это или нет?

...