| U bent hier: schouppe.net > computerlogica > objectgeoriënteerd programmeren > oefeningen > oef606 |
6 . Schrijf een race programma (zie Flash movie hiernaast). Op het scherm verschijnen 3 rechthoeken in verschillende kleur. Iedere rechthoek groeit op toevallige wijze. Wie eerst de finish haalt (aangegeven met de zwarte balk), is gewonnen. Deze oefening borduurt verder op het voorbeeld uit het handboek (blz 99-101).
Analyse van de opgave: Het programma start met het tonen van de 'deelnemers' (balkjes). Daarna verschijnt het startsein. Het programma stopt als één van de deelnemers de finish heeft bereikt. De andere deelnemers blijven dan 'ter plaatse' hangen.
De balkjes zijn eigenlijk AutoVormen (we hadden ook cellen van het rekenblad kunnen gebruiken; zie uitbreiding). Het 'groeien' van de rechthoeken wordt gerealiseerd door de eigenschap Width in te stellen. Hiertoe tellen we steeds een willekeurig getal bij de reeds bestaande breedte van de rechthoek. Een willekeurig getal kan gegenereerd worden door de Rnd-functie van Excel VBA. Deze functie geeft echter een willekeurig getal 0 <= x < 1. In de Help-file staat de formule om een willekeurig getal tussen een onder- en bovengrens te genereren: Int((bovengrens - benedengrens + 1) * Rnd + benedengrens). De bovengrens wordt in de oplossing 'speed' genoemd, omdat het de snelheid aangeeft waarmee de balkjes groeien. Doordat de meeste huidige PC's erg snel zijn dient er ook een wachtroutine ingebouwd te worden. Anders is de race in een mum van tijd voorbij. Hiertoe is het voorbeeld van blz 82 van het handboek genomen.
Oplossing :
Het algoritme/PSD van dit programma is vrij eenvoudig. Bij de implementatie in Excel VBA zult u een aantal moeilijkheden tegenkomen. In het PSD gebruiken we de notatie met de dot-operator om eigenschappen van objecten te lezen en in te stellen. Zo stelt de instructie a.width ¬ 10 de breedte van het rechthoekje a in op 10 pixels. Omgekeerd, w ¬ a.width leest de breedte van het rechthoekje a in de variabele w.

De procedure 'maakBalk' verbergt de implementatie van de creatie van een AutoVorm. De procedure aanvaardt 5 parameters: de positie (x,y), de afmetingen (b,h) en de kleur. In Excel VBA zal dit uiteraard nog verder uitgewerkt moeten worden. De code volgt hieronder.
Option Explicit
Sub race()
Dim a As Shape, b As Shape, c As Shape, d As Shape
Dim x As Single, y As Single, breedte As Single, hoogte As Single
Dim speed As Byte, einde As Integer, kleur As Byte
x = 20: y = 15: breedte = 5: hoogte = 10
speed = 10: einde = 150: kleur = 1
Set a = maakBalk(x, y, breedte, hoogte, kleur)
Set b = maakBalk(x, y + 2 * hoogte, breedte, hoogte, kleur + 1)
Set c = maakBalk(x, y + 4 * hoogte, breedte, hoogte, kleur + 2)
Set d = maakBalk(x, y + 7 * hoogte, einde, hoogte, kleur + 3)
MsgBox "3-2-1 - Go!"
Do While a.Width <= einde And b.Width <= einde And c.Width <= einde
a.Width = a.Width + willek_getal(speed)
b.Width = b.Width + willek_getal(speed)
c.Width = c.Width + willek_getal(speed)
Application.ScreenUpdating = True
Call wachten(1)
Loop
End Sub
Function maakBalk(ByVal l As Single, ByVal t As Single, ByVal w As Single, h As Single, k As Byte) As Shape
Dim temp As Shape
Set temp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, l, t, w, h)
Select Case k
Case 1: temp.Fill.ForeColor.RGB = vbRed
Case 2: temp.Fill.ForeColor.RGB = vbGreen
Case 3: temp.Fill.ForeColor.RGB = vbBlue
Case 4: temp.Fill.ForeColor.RGB = vbBlack
End Select
Set maakBalk = temp
End Function
Function willek_getal(s As Byte) As Byte
willek_getal = Int(s * Rnd)
End Function
Sub wachten(t As Integer)
Dim w As Long
Const type_computer = 1000000
For w = 1 To t * type_computer
Next w
End Sub
De instructie Application.ScreenUpdating = True
is nodig om het scherm te laten verversen. Doordat deze schermverversing meestal
erg tijdsintensief is, zal Excel VBA deze taak uitbesteden aan het besturingssysteem
en verder gaan in de verwerking. Dit betekent dat de macro soms al kan afgelopen
zijn als de eerste schermhertekening pas afgewerkt is. Met deze screenUpdating
zorgt de macro ervoor dat de schermverversing uitdrukkelijk gebeurt en wacht
de macro op de uitvoering ervan.
Uitbreiding
In plaats van met AutoVormen te werken kan men ook cellen kleuren van het werkblad.Dit geeft wel de bijkomende implicatie dat de macro moet bijhouden hoeveel cellen van iedere deelnemer reeds gekleurd zijn.
Op het einde van de macro zou de winnaar kunnen bekend gemaakt worden. Hiervoor is een bijkomende test nodig. De parameters 'speed' en 'einde' zouden kunnen opgevraagd worden bij de gebruiker, evenals de wachttijd.
Ook het aantal deelnemers zou variabel kunnen gemaakt worden. Dit veronderstelt echter wat meer aanpassingswerk.
| ©
H. Schouppe Laatste wijziging: 2004-05-12 |