2011-10-27 8 views
0

私はMinesweeperを作り直しています。私のすべてのコードは実行時に作成され、トラブルシューティングに役立つようにC & pにお気軽に。VB.NET .Name = varの絵文字に文を書く方法

ランダムな鉱山でピクチャボックスのグリッド(pbxNewZone)を作成するループがあり、そのボックスが地雷の場合はタグをtrueに設定し、そうでない場合はfalseに設定します。

「pbxNewZoneClicked」というクリックイベントのピクチャボックス(現在は「pb」と呼ばれています)をダイレクトキャストし、そのタグを読み取ります。現在、テスト目的の鉱山を示しています。タグの状態に応じてピクチャボックスをクリックすると、ヒットした鉱山が表示され、imgがクリアされます。

今、私は画像をクリックして鉱山のためにその周りの8つの画像を確認する必要があります。すべての鉱山は、グリッド上のx &のy座標(文字通り、form_loadに作成されたInteger xとyに基づいています)によって命名され、1ベースです。つまり、最初の地雷は "0、0"ではなく "1,1"となります。

したがって、「8,7」という名前のpb(名前を変更したダイレクトキャストされたピクチャボックス)をクリックすると、xValueCheckおよびyValueCheck変数をそれぞれ「8」および「7」としてサブリングします。私は1つずつ減算し(ボックスを左上に)、Dim Box1 As Stringとします。この場合、「7,6」となります。

ここに私が持っている論理があります。

クリックしないと、クリックイベント内のpbのタグを確認するにはどうすればよいですか?ここで

は、私がこれまでに得たものです:

Public Class Form1 
Inherits System.Windows.Forms.Form 
Dim active As Boolean = True 
Dim images(8) As Image 'declares image array 

Dim zonesY As Integer = 9 
Dim zonesX As Integer = 9 

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("clear.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("blank.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/5) 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(6) 
       End If 
      End If 
      pbxNewZone.Height = 16 
      pbxNewZone.Width = 16 
      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) 

    If active = True Then 
     Dim pb As PictureBox = DirectCast(sender, PictureBox) 

     Dim Status As String = "Clear" ' Status - Testing Purposes Only 
     If pb.Tag = True Then ' Status - Testing Purposes Only 
      Status = "Mine" ' Status - Testing Purposes Only 
     End If 
     MsgBox(pb.Name & vbCrLf & "Status: " & Status, , "Test") ' Post Statistics of box. 

     Dim xValueCheck As Integer = pb.Name.Substring(0, 1) 
     MsgBox(xValueCheck) ' To spit out y value from name 
     Dim yValueCheck As Integer = pb.Name.Substring(3, 1) 
     MsgBox(yValueCheck) ' To spit out y value from name 

     Dim Box1 As String = (xValueCheck - 1) & ", " & (yValueCheck - 1) 
     MsgBox("Box1 = " & Box1, , "Test") 
     Dim count As Integer = 0 

     If pb.Tag = True Then 
      pb.Image = images(7) ' Hit Image 
      active = False 
      MsgBox("No Longer Active", , "Test") ' Testing Purposes Only 
     ElseIf pb.Tag = False Then 
      'ENTER CODE THAT WILL READ BOXES AROUND IT 
      'ENTER CODE THAT WILL READ BOXES AROUND IT 
      'ENTER CODE THAT WILL READ BOXES AROUND IT 
      'ENTER CODE THAT WILL READ BOXES AROUND IT 
      'ENTER CODE THAT WILL READ BOXES AROUND IT 

      pb.Image = images(count) ' Clear Image by default. 
     End If 

    End If 
End Sub 

End Class 

答えて

1

Yipes。ピクチャボックスを保持するために2D配列を使用することを検討してください。それ以外の場合は、あなたのコントロールを見つけるために(あまりにも複雑な)反射コードが必要になります。

2D配列:あなたはグリッドセルを表すために、新しいユーザーコントロールを作成する場合はもちろん

Private oGrid(10,10) As PictureBox 

Private Sub SetupGrid() 
    ' 
    ' Initialize the grid here 
    ' 
    ' Place the coordinate of the cell in the .Tag property. 
    ' 
End Sub 

Private Sub GridCellClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim tLocation As Point = sender.Tag 
    ' 
    ' Scan around the other 8 cells 
    ' eg. oGrid(tLocation.X - 1, tLocation.Y) 
    ' 
End Sub 

すべてこの余分なデータ論争がはるかに容易になります。

+0

ユーザーコントロールを使用するために既存のコードを変更するにはどうすればよいですか? –

関連する問題