|
Die
FIELD-Struktur |
[ Top ]
|
Um
jetzt mit den spannenden Routinen zu beginnen, schauen wir
uns den Datentyp FIELD noch einmal etwas genauer an. |
|
|
Public Type FIELD
Graphic As GRAPHIC_CONSTANTS
Value As VALUE_CONSTANTS
Clicked As Boolean
End Type
|
|
|
Die Variable Graphic sagt nur aus, welche Grafik verwendet wird (Freies Feld, Eins, Zwei, Fahne, usw.). Um es einfacher zu machen hat diese Variable den Datentyp
GRAPHIC_CONSTANTS. Dies ermöglicht, dass wir nicht umständlich schreiben müssen "Graphic = 5" und uns dabei immer merken müssen, welchen Wert 5 eigentlich repräsentiert, sondern wir sagen "Graphic = gc_One", so dass sofort klar ist, dass damit die Eins gemeint ist. |
Die Variable Value repräsentiert den eigentlichen Wert, der sich "unter dem Feld verbirgt". Dies kann "Frei", "Mine", "Rote Mine" (also eine Mine auf die man gerade geklickt hat) oder eine Zahl sein. |
Die Variable Clicked
gibt lediglich an, ob dieses Feld bereits angeklickt wurde, denn dann muss nicht extra noch einmal der ganze Aufruf von Funktionen durchlaufen werden, wie wir ihn gleich sehen werden. |
Nun benötigen wir noch ein paar Prozeduren, um diese Eigenschaften vereinfacht zu setzen, so dass sich z.B. beim Klicken eines Feldes automatisch das Bild ändert. |
|
|
' Wert eines Feldes setzen
Public Sub SetValue(Index As Integer,
New_Value As VALUE_CONSTANTS)
m_Fields(Index).Value = New_Value
End Sub
' Status "geklickt" setzen
Public Function SetClicked(Index As Integer, _
Optional ByVal New_Clicked As Boolean
= True) As Boolean
SetClicked = False
With m_Fields(Index)
If
.Clicked = False Then
.Clicked = New_Clicked
If
New_Clicked Then mPlay.Clicked = mPlay.Clicked + 1
Else
.Clicked = New_Clicked
End If
If
Clicked = Fields_X * Fields_Y - MineCount Then
' Gewonnen ;-)
SetClicked = True
End If
End With
End Function
' Grafik ermitteln
Public Function GetGraphic(Index As Integer) As GRAPHIC_CONSTANTS
GetGraphic = m_Fields(Index).Graphic
End Function
'
Grafik setzen (für Flag und Fragezeichen)
Public Sub SetGraphic(Index As Integer,
NewGraphic As _
GRAPHIC_CONSTANTS,
Optional ByVal ReDraw As Boolean = True)
m_Fields(Index).Graphic = NewGraphic
DrawField Index, ReDraw
End Sub
|
|
|
Der Parameter
ReDraw gibt immer an, ob das Bildfeld picPlay neugezeichnet werden soll oder nicht. |
Jetzt
kommen wir unserem Ziel immer näher. Es geht nun darum, die
Funktion zu schreiben, die ein Feld mit einer Zahl belegt,
weil im Nachbarfeld eine Mine ist. |
|
|
' Wenn keine Mine, um eins erhöhen
' bzw. beim ersten Eintrag auf vb_One setzen
Public Sub IncreaseField(fld As Integer)
If fld <> -1 Then
With m_Fields(fld)
If .Value <> vc_Mine Then
If
.Value >= vc_One Then
.Value = .Value + 1
Else
.Value = vc_One
End If
End If
End With
End If
End Sub
|
|
|
IncreaseField heißt soviel wie "Feld erhöhen" und macht aus freien Feldern Felder mit einer 1. Bei Feldern, die bereits eine Zahl haben wird diese um 1 erhöht. Der maximale Wert ist, wie wir bereits wissen, 8. Dies geschieht aber nur, wenn dieses Feld keine Mine besitzt (m_Fields(fld).Value <>
vc_Mine). |
Nun
folgt die Prozedur zum Verteilen der Minen. Im Prinzip ist
sie ganz einfach, aber trotzdem etwas länger auf Grund der
Funktionsaufrufe:
|
|
|
' Minen verteilen
Public Sub InitMines()
Dim n As Integer
Dim fld As Integer
For n = 1 To MineCount
Do
fld = Int(Fields_X * Fields_Y * Rnd)
Loop While
m_Fields(fld).Value = vc_Mine
m_Fields(fld).Value = vc_Mine
Next n
For n = 0 To Fields_X * Fields_Y - 1
With m_Fields(n)
If .Value = vc_Mine
Then
' Nachbarfelder setzen
IncreaseField GetTopLeftField(n)
IncreaseField GetTopField(n)
IncreaseField GetTopRightField(n)
IncreaseField GetLeftField(n)
IncreaseField GetRightField(n)
IncreaseField GetBottomLeftField(n)
IncreaseField GetBottomField(n)
IncreaseField GetBottomRightField(n)
ElseIf
.Value = 0
Then
.Value = vc_Free
End If
End With
Next n
End Sub
|
|
|
Zuerst werden in einer For-Schleife alle Minen verteilt. Es wird so lange ein Index durch eine Zufallszahl ermittelt, bis keine Mine gefunden wird, damit nicht zwei Minen auf ein Feld gesetzt werden.
|
|
|