Hoofdstuk 8: Visual Basic
8.8. Meer arrays.
8.8.1. Gooien met twee dobbelstenen.
We willen een programma maken waarvan de interface er uit ziet zoals hiernaast.
Als je op de button met de tekst "Gooi 1000 keer met twee dobbelstenen" klikt dan wordt er inderdaad 1000 keer
met twee dobbelstenen gegooid en er
wordt dan afgedrukt hoe vaak het resultaat van de twee dobbelstenen samen 2, 3, 4 t/m 12 was.
De computer moet die aantallen bijhouden.
Daarvoor heb je 11 variabelen nodig, en dat kan natuurlijk het handigst
met een array.
Het aantal keren dat er 2 is gegooid wordt vastgelegd met de variabele aantalkeer(2)
In de variabele aantalkeer(3) wordt vastgelegd hoevaak
er 3 is gegooid, enz. t/m aantalkeer(12)
Je moet die variabelen declareren, en dat doe je zo: Dim aantalkeer(12) As Integer
8.8.2. Een array van controls.
Er moeten 11 labels en 11 tekstvensters op het formulier worden gezet.
Daar kun je ook arrays van maken.
Je kunt de labels bijvoorbeeld lAantal(2), lAantal(3), lAantal(4) t/m lAantal(12) noemen.
En de tekstvensters noem je bijv. tAantal(2), tAantal(3), tAantal(4) t/m tAantal(12)
Dat kun je in het Propertiesvenster aangeven.
Als je het bovenste label en het bovenste tekstvenster op het formulier hebt gezet, zoals hiernaast is te zien, dan geef je als naam voor het label lAantal, en bij de index zet je 2.
Dan wordt de naam van het label lAantal(2) zie je bovenin het Propertiesvenster.
Als je dus een array wilt maken van labels of iets dergelijks, dan doe je dat door bij de index een getal in te vullen.
Het kan ook nog anders:
Als je het eerste label hebt gemaakt, en je maakt een kopie van dat label door te kopieren en plakken, dan wordt er gevraagd of je er een array van wilt maken.
Als je die vraag met yes beantwoordt dan wordt het ook een array.
8.8.3. Labels en tekstvensters programmeren.
Je kunt die 11 labels en tekstvensters allemaal zelf op het formulier tekenen.
Maar dat kost nogal wat tijd en het kan ook anders.
Je kunt die labels en tekstvensters ook aanmaken met behulp van programmaregels.
Het gaat het handigst als je eerst al één label en één tekstvenster op het formulier hebt getekend, en daar een array van hebt gemaakt.
Als je een label hebt getekend dat lAantal(2) heet, dan kun je m.b.v. de programmaregel Load lAantal(3) een kopie van dat label aanmaken.
Als je er niets aan verandert dan is dat een echte kopie, dat wil zeggen dat het op precies de zelfde plaats staat, dat het even groot is, dat het de zelfde kleuren heeft en het zelfde opschrift. Maar het is onzichtbaar, dus m.b.v. de opdracht
lAantal(3).Visible=true moet je het eerst zichtbaar maken.
Maar dan zie je het nog niet, want het staat op precies de zelfde plaats dus je ziet er maar
één !
Je moet er voor zorgen dat het een beetje lager staat.
Dat kun je bijv. met de opdracht lAantal(3).Top = lAantal(2).Top + 400
Dan staat het 400 twips lager dan de vorige, en dan is het wel zichtbaar.
8.8.4. Het volledige programma.
Die labels en tekstvensters moeten direkt als het programma start al op het formulier staan.
Dat moet dus in de procedure Sub Form_Load staan.
Private Sub Form_Load()
Dim i As Integer
For i = 3 To 12
Load lAantal(i)
lAantal(i).Visible = True
lAantal(i).Top = lAantal(i - 1).Top + 400
lAantal(i).Caption = "aantal keer " + Str(i)
Load tAantal(i)
tAantal(i).Visible = True
tAantal(i).Top = tAantal(i - 1).Top + 400
Next i
End Sub
De knop waarop staat dat er 1000 keer gegooid moet worden is "Gooi" genoemd.
Als daar op geklikt wordt moet de volgende procedure worden uitgevoerd:
Private Sub Gooi_Click()
Dim aantal(12), i, som, d1, d2 As Integer
Randomize
For i = 1 To 1000
d1 = Int(Rnd * 6) + 1
d2 = Int(Rnd * 6) + 1
som = d1 + d2
aantal(som) = aantal(som) + 1
tAantal(som).Text = Str(aantal(som))
Next i
End Sub
8.8.5. Vier op een rij, tweedimensionale rij.
We willen nu een programma maken waarvan de interface er uit ziet zoals hieronder.
Om en om moeten X en O op de button boven een kolom klikken. De X of de O valt dan in
die kolom naar beneden.
En dan gaat het er om wie het eerst vier op een rij heeft.
Hier moet in ieder geval door het programma worden bijgehouden welk teken in welk hokje zit.
Het is handig om daar een tweedimensionale rij voor te nemen.
Met vulling(1,1) = 1 geef je bijv. aan dat in het hokje linksonder een X staat,
met vulling(1,2) = 2 geef je aan dat in het hokje boven de vorige een O staat.
En de inhoud van het hokje rechtsboven geef je aan met vulling(10,5)
Je gebruikt dus de volgende rij (met twee indices): vulling(kolom,rij)
8.8.6. De interface
Je begint natuurlijk weer met de interface.
Die kun je maken zoals in de figuur hier onder.
Je hoeft maar één hokje op het formulier te zetten, de andere 49 kun je via het programma laten genereren.
Hetzelfde geldt voor de buttons boven de kolommen.
Het label linksboven heb ik lBeurt genoemd.
De labels rechts heb ik lAantalx en lAantalo genoemd.
De button waarop "Nieuw spel" staat heb ik bNieuwspel genoemd.
De 50 hokjes heb ik lHok(1) t/m lHok(50) genoemd en daarbij zit lHok(1) linksonder.
De buttons boven de kolommen heb ik lGooi(1) t/m lGooi(10) genoemd, en daarbij zit bGooi(1) links.
8.8.7. Het volledige programma.
We beginnen met de globale variabelen.
Kies dus in het programmavenster General en Declarations uit.
Declareer daar de volgende globale variabelen:
Option Explicit
Dim vulling(10,5),speler,aantalwinstx,aantalwinsto,aantalkeergegooid
As Integer
Dim teken(2) As String
Dim uitslag As Boolean
Als het programma start dan moeten alle hokjes er staan.
En er moeten nog een aantal dingen gebeuren.
Dat zet je dus in Sub Form_Load():
Private Sub Form_Load()
Dim i, rij, kolom As Integer
teken(1) = "X"
teken(2) = "O"
speler = 1
For i = 2 To 50
Load lHok(i)
lHok(i).Visible = True
lHok(i).Caption = ""
kolom = (i - 1) / 5 + 1
rij = (i - 1) Mod 5 + 1
If rij = 1 And kolom > 1 Then
lHok(i).Left = lHok(i - 1).Left + 700
lHok(i).Top = lHok(i - 5).Top
Else
lHok(i).Top = lHok(i - 1).Top - 620
lHok(i).Left = lHok(i - 1).Left
End If
Next
For i = 2 To 10
Load bGooi(i)
bGooi(i).Visible = True
bGooi(i).Left = bGooi(i - 1).Left + 700
Next
bNieuwspel.Visible = False
End Sub
Als er op een gooi-button wordt geklikt, dan moet het volgende gebeuren:
Private Sub bGooi_Click(Index As Integer)
Dim i, j, rijaanbeurt As Integer
rijaanbeurt = 0
If bNieuwspel.Visible = True Then
Beep
Exit Sub
End If
For j = 1 To 5
If vulling(Index, j) = 0 Then
rijaanbeurt = j
Exit For
End If
Next j
If rijaanbeurt = 0 Then
Beep
Exit Sub
Else
vulling(Index, rijaanbeurt) = speler
i = (Index - 1) * 5 + rijaanbeurt
lHok(i).Caption = teken(speler)
aantalkeergegooid = aantalkeergegooid + 1
controleer
If uitslag = True Then
lBeurt.Caption = " " + teken(speler) + " heeft gewonnen !"
If teken(speler) = "X" Then
aantalwinstx = aantalwinstx + 1
Else
aantalwinsto = aantalwinsto + 1
End If
lWinstx.Caption =
" Aantal keer dat X gewonnen heeft:" + Str(aantalwinstx)
lWinsto.Caption =
" Aantal keer dat O gewonnen heeft:" + Str(aantalwinsto)
bNieuwspel.Visible = True
Else
If aantalkeergegooid = 50 Then
lBeurt.Caption = " Geen van beiden heeft gewonnen !"
bNieuwspel.Visible = True
Else
speler = speler + 1
If speler = 3 Then speler = 1
lBeurt.Caption = " " + teken(speler) + " is aan de beurt !"
End If
End If
End If
End Sub
Hierboven wordt een procedure gebruikt die controleer genoemd is.
In die procedure wordt er gecontroleerd of er ook vier gelijke tekens op een rij zijn.
Dat kan op vier manieren: vertikaal, horizontaal en diagonaal in twee richtingen.
Als in die procedure blijkt dat er vier-op-een-rij is dan krijgt de variabele uitslag de waarde true.
Die procedure controleer moet je in het programma-venster vlak onder de globale variabelen invoeren.
En daar voer je het volgende in:
Sub controleer()
Dim kolom, rij, i, j As Integer
uitslag = False
For kolom = 1 To 10
For j = 1 To 2
If vulling(kolom, j) = speler And
vulling(kolom, j + 1) = speler And
vulling(kolom, j + 2) = speler And
vulling(kolom, j + 3) = speler Then
uitslag = True
lHok((kolom - 1) * 5 + j).BackColor = vbYellow
lHok((kolom - 1) * 5 + j + 1).BackColor = vbYellow
lHok((kolom - 1) * 5 + j + 2).BackColor = vbYellow
lHok((kolom - 1) * 5 + j + 3).BackColor = vbYellow
Exit Sub
End If
Next j
Next kolom
For rij = 1 To 5
For j = 1 To 7
If vulling(j, rij) = speler And vulling(j + 1, rij) = speler And
vulling(j + 2, rij) = speler And vulling(j + 3, rij) = speler Then
uitslag = True
lHok((j - 1) * 5 + rij).BackColor = vbYellow
lHok(j * 5 + rij).BackColor = vbYellow
lHok((j + 1) * 5 + rij).BackColor = vbYellow
lHok((j + 2) * 5 + rij).BackColor = vbYellow
Exit Sub
End If
Next j
Next rij
For kolom = 1 To 7
For j = 1 To 2
If vulling(kolom, j) = speler And
vulling(kolom + 1, j + 1) = speler And
vulling(kolom + 2, j + 2) = speler And
vulling(kolom + 3, j + 3) = speler Then
uitslag = True
lHok((kolom - 1) * 5 + j).BackColor = vbYellow
lHok(kolom * 5 + j + 1).BackColor = vbYellow
lHok((kolom + 1) * 5 + j + 2).BackColor = vbYellow
lHok((kolom + 2) * 5 + j + 3).BackColor = vbYellow
Exit Sub
End If
Next j
Next kolom
For kolom = 1 To 7
For j = 4 To 5
If vulling(kolom, j) = speler And
vulling(kolom + 1, j - 1) = speler And
vulling(kolom + 2, j - 2) = speler And
vulling(kolom + 3, j - 3) = speler Then
uitslag = True
lHok((kolom - 1) * 5 + j).BackColor = vbYellow
lHok(kolom * 5 + j - 1).BackColor = vbYellow
lHok((kolom + 1) * 5 + j - 2).BackColor = vbYellow
lHok((kolom + 2) * 5 + j - 3).BackColor = vbYellow
Exit Sub
End If
Next j
Next kolom
End Sub
Als een spelletje is afgelopen kan er met een nieuw spel worden begonnen door
op de button met "Nieuw spel" te klikken.
Dat moet ook nog geprogrammeerd worden.
Dat doe je als volgt:
Private Sub bNieuwspel_Click()
Dim i, j As Integer
For i = 1 To 50
lHok(i).Caption = ""
lHok(i).BackColor = vbWhite
Next
For i = 1 To 10
For j = 1 To 5
vulling(i, j) = 0
Next j
Next i
aantalkeergegooid = 0
uitslag = False
speler = speler + 1
If speler = 3 Then speler = 1
lBeurt.Caption = " " + teken(speler) + " is aan de beurt !"
bNieuwspel.Visible = False
End Sub
en daarmee is het spel klaar !
|