Informaticasite van het Sondervick College te Veldhoven                 © L.J.M van Haperen (bron : R.J. van der Beek)
 

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 !