Hallo,
ich erstelle gerade ein kleines TicTacToe-Spiel.
Ich möchte dieses Skalierbar anbieten, d.h. man soll nicht nur 3x3 Spielfelder spielen können sondern auch 4x4, 5x5....
Ich steh gerade vor einem kleine Problem beim Skalieren.
Ich vergebe von Links nach Rechts und Von Oben Nach unten jeden Feld eine Nummer.
Wenn ich die Spielfeldgröße ändere muss ich jeden Button eine neue Nummer vergeben.
Das funktioniert soweit auch super und ohne Probleme.
Probleme gibt es aber den Punkt, wenn ich die Spielfeldgröße runterskaliere und Buttons zu viel da sind.
Diese Lösche ich dann mit einer ForEach-Schleife, wobei ich Prüfe ob der Button noch in der Feldgröße liegt.
Wenn also z.B. ein 3x3 Feld vorliegt, werden alle Buttons welche in Spalte oder Zeile größer 3 liegen, z.B. 4, gelöscht.
Nun das Problem: Es werden nicht alle Buttons gelöscht. Und nur deswegen, weil sie nicht mit der ForEach durchlaufen werden. So ganz verstehen tue ich das nicht, weil ich teoretisch jeden Button im gleichen Panel erstelle. Und manche Buttons dann doch nicht durchlaufen werden.
Naja schaut selbst.
Hier ein auf das Problem gekürzter Quelltext. Buttons erstelle ich alle im Code, ihr müsst nur den Code ausführen.
Ich hoffe ihr könnt irgendwie helfen.
LG
Julian
Nachtrag: Achso, anfangs habe ich immer alle Buttons gelöscht und alle Buttons wiedererstellt. Das hat zwar funktioniert, aber hat zu viel geflaktert.
ich erstelle gerade ein kleines TicTacToe-Spiel.
Ich möchte dieses Skalierbar anbieten, d.h. man soll nicht nur 3x3 Spielfelder spielen können sondern auch 4x4, 5x5....
Ich steh gerade vor einem kleine Problem beim Skalieren.
Ich vergebe von Links nach Rechts und Von Oben Nach unten jeden Feld eine Nummer.
Wenn ich die Spielfeldgröße ändere muss ich jeden Button eine neue Nummer vergeben.
Das funktioniert soweit auch super und ohne Probleme.
Probleme gibt es aber den Punkt, wenn ich die Spielfeldgröße runterskaliere und Buttons zu viel da sind.
Diese Lösche ich dann mit einer ForEach-Schleife, wobei ich Prüfe ob der Button noch in der Feldgröße liegt.
Wenn also z.B. ein 3x3 Feld vorliegt, werden alle Buttons welche in Spalte oder Zeile größer 3 liegen, z.B. 4, gelöscht.
Nun das Problem: Es werden nicht alle Buttons gelöscht. Und nur deswegen, weil sie nicht mit der ForEach durchlaufen werden. So ganz verstehen tue ich das nicht, weil ich teoretisch jeden Button im gleichen Panel erstelle. Und manche Buttons dann doch nicht durchlaufen werden.
Naja schaut selbst.
Hier ein auf das Problem gekürzter Quelltext. Buttons erstelle ich alle im Code, ihr müsst nur den Code ausführen.
Quellcode
- Public Class Form1
- Dim l As Integer
- Dim Field(5, 5) As Button
- Dim Button(3) As RadioButton
- Dim Panel1 As New Panel
- Function ToX(ByVal Num As Integer, ByVal level As Integer) As Integer
- Return Num Mod level + 1
- End Function
- Function ToY(ByVal Num As Integer, ByVal level As Integer) As Integer
- Return ((Num - ToX(Num, level) + 1) / level) + 1
- End Function
- Function ToNum(ByVal X As Integer, ByVal Y As Integer, ByVal level As Integer) As Integer
- Return X + (level * (Y - 1)) - 1 'Nullbasiert
- End Function
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Controls initialisieren
- Me.Size = New Size(600, 600)
- For i = 3 To 5
- Button(i - 2) = New RadioButton
- With Button(i - 2)
- .Location = New Point(52 + (100 * (i - 3)), 10)
- .Size = New Size(98, 25)
- .Text = Str(i) + " x " + Str(i)
- AddHandler .Click, AddressOf Button_Click
- End With
- Button(1).Checked = True
- Me.Controls.Add(Button(i - 2))
- Next
- With Panel1
- .Location = New Point(50, 50)
- .Size = New Size(500, 500)
- End With
- Me.Controls.Add(Panel1)
- End Sub
- Private Sub Button_Click(ByVal sender As RadioButton, ByVal e As System.EventArgs)
- For Each i As RadioButton In Me.Controls.OfType(Of RadioButton)()
- If sender Is Button(1) Then
- InitButtons(3)
- ElseIf sender Is Button(2) Then
- InitButtons(4)
- ElseIf sender Is Button(3) Then
- InitButtons(5)
- End If
- Next
- End Sub
- Function InitButtons(ByVal size As Integer) As Boolean
- If size <> l Then
- For Each i As Control In Panel1.Controls.OfType(Of Button)() 'In Field?
- If TypeOf i Is Button Then
- If (ToX(i.TabIndex, l) > size) Or (ToY(i.TabIndex, l) > size) Then 'überflüssige Buttons entfernen
- MessageBox.Show("Button " + Str(i.TabIndex) + " wurde gelöscht") '+ ((ToY(i.TabIndex, l) - 1) * (size - l))
- Panel1.Controls.Remove(i)
- Else 'existierende Buttons neu durchnummerieren
- MessageBox.Show("Button " + Str(i.TabIndex) + " bleibt erhalten")
- i.TabIndex += ((ToY(i.TabIndex, l) - 1) * (size - l))
- Field(ToX(i.TabIndex, size), ToY(i.TabIndex, size)) = i
- i.Text = Str(i.TabIndex)
- End If
- End If
- Next
- For i = 0 To size ^ 2 - 1
- If (ToX(i, size) > l) Or (ToY(i, size) > l) Then 'Fehlende Buttons erstellen
- Field(ToX(i, size), ToY(i, size)) = New Button
- MessageBox.Show("Button " + Str(i) + " wurde erstellt")
- With Field(ToX(i, size), ToY(i, size))
- .Location = New Point(100 * (ToX(i, size) - 1) + 2, 100 * (ToY(i, size) - 1) + 2)
- .Size = New Size(98, 98)
- .TabStop = True
- .TabIndex = i
- .Text = Str(i)
- End With
- Panel1.Controls.Add(Field(ToX(i, size), ToY(i, size)))
- End If
- Next
- l = size
- End If
- End Function
- End Class
Ich hoffe ihr könnt irgendwie helfen.
LG
Julian
Nachtrag: Achso, anfangs habe ich immer alle Buttons gelöscht und alle Buttons wiedererstellt. Das hat zwar funktioniert, aber hat zu viel geflaktert.