Számkitaláló A gép „gondol” egy számot 1 és 100 között, s a felhasználónak ezt a számot kell tippeléssel eltalálnia. Minden tipp után a program megmondja, hogy az kisebb vagy nagyobb-e, mint a gondolt szám. A következő ábrán programunk képernyőjét láthatjuk futás közben:
Készítsük el az űrlapot frmSZK néven, és helyezzük el rajta a megfelelő vezérlőket az ábra szerint! A címke sorába egyenlőre kerüljön a Számkitaláló szöveg, a játékok számolását később oldjuk meg. A címkék és a szövegmező megjelenése további beállításokat igényel. Mindkét címke AutoSize tulajdonsága False, míg a lblTsz címke BorderStyle tulajdonsága Fixed3D, az lblÉrt címkéé pedig FixedSingle. Végül az lblTsz és a txtTipp mezők az adatokat jobbra igazítva tartalmazzák, míg az lblÉrt középen, így ennek megfelelően módosítanunk kell TextAlign tulajdonságukat is. Legyen a konstans neve x, értéke pedig 50. Vezessük be továbbá a tipp nevű változót, melybe a felhasználó által megadott tippet olvassuk át a txtTipp szövegmezőből. Eddigi tudásunk alapján az OK gombhoz rendelt kód a következő: Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click Dim tipp As Integer Const x = 50
'Const=konstans, amit ki kell találnunk
tipp = Val(txtTipp.Text) ' a megadott tippet olvassuk be If tipp > x Then lblÉrt.Text = "A tipp nagy!" If tipp < x Then lblÉrt.Text = "A tipp kicsi!" If tipp = x Then lblÉrt.Text = "Gratulálok, eltalátad!" End Sub
Véletlenszám generálása Az Új_játék gombra kattintva egy új számot kell a gépnek elrejtenie. Ezt a véletlenszámgenerátor segítségével oldhatjuk meg, amely egy 0 és 1 közé eső véletlenszerű számot állít 1
elő. Ebből 1 és 100 közé eső egész szám úgy keletkezik, hogy megszorozzuk 100-zal és lefelé kerekítjük: MsgBox(Math.Floor(100 * Rnd()) + 1)
Ha az előző sort többször egymás után végrehajtjuk, a kapott számok egyenletesen oszlanak el 1 és 100 között, de a programot újraindítva ugyanazt a sorozatot kapjuk. Az Rnd függvény tehát ún. álvéletlen számokat generál. Ez úgy történik, hogy kiindulva egy adott számból, a sorozat következő tagját rendre az előzőből számolja ki. Ha a sorozat első tagja ugyanaz, a többi tag is meg fog egyezni. A sorozatot úgy tehetjük véletlenszerűvé, hogy tagját a Randomize() utasítás használatával a rendszeridőből állítjuk be.
Új szám elrejtése Töröljük ki az OK_Click eljárásból a const x=50 sort, mert a továbbiakban az x véletlenszámot az új Új_játék gombra kattintva kívánjuk előállítani: Private Sub Új_játék_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Új_játék.Click x = Math.Floor(100 * Rnd()) + 1 End Sub
A változó deklarációját elvégezhetjük a modul deklarációs részében is, ekkor a változó az egész modulból elérhető lesz. Az ilyen, ún. modulváltozók deklarációjában a Dim utasítás is használható, azonban a Private áttekinthetőbbé teszi programunkat: Private x, tsz As Integer
A tippek száma A felhasználó tippjeit egy változó segítségével számolhatjuk. Ennek neve legyen tsz. Azonnal látható, hogy ezt is a modul elején kell deklarálnunk, mivel csal az OK_Click eljárásban használjuk ugyan, án új szám elrejtésénél mindig törölni kell az értéket, amit az Új_játék_Click eljárásban tehetünk meg. Így a modul deklarációs része a következő lesz: Private s, tsz As Integer
2
Az Új_Játék_Click eljárást bővítenünk kell a tsz=0 sorral, az OK_Click eljárás végét pedig a következő két sorral: tsz = tsz + 1 lblTsz.Text = tsz.ToString
A játékok száma Hasznos lehet, ha a játékok számát is követjuk pl. úgy, hogy az űrlap címsorába mindig kiírjuk, hányadik „menet” zajlik. Ehhez egy újabb változót kell bevezetnünk, ezúttal az Új_Játék_Click eljárásbal pl. jsz néven. A változót a többi eljárásban nem használjuk, tehát deklarálhatjuk ebben az eljárásban. Az éppen aktuális űrlapra a Visual Basicben Me kulcsszóval hivatkozhatunk, így bóvítés után az eljárás a következő: Private Sub Új_játék_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Új_játék.Click Dim jsz As Integer tsz = 0 x = Math.Floor(100 * Rnd()) + 1 'új játék esetén frissíteni kell a címkéket: lblTsz.Text = tsz.ToString lblÉrt.Text = "" 'Érdemes törölni a szövegmező tartalmát is: txtTipp.Text = "" 'A játékok számának megadása jsz=0+1-ről fog indulni: jsz = jsz + 1 'Me az aktív űrlapot jelöli: Me.Text = "Számkitaláló - " & jsz & ".játék" End Sub
Kipróbálva a programot, mindig a Számkiatláló – 1.játék szöveg jelenik meg a címkében! A Dim kulcsszóval létrehozott változó az End Sub sornál törlődik a memóriából, majd amikor a felhasználó ismét rákattint az Új_Játék gombra, a Dim-mel kezdődő sorban újra létrejön a 0 kezdőértékkel, melyet a jsz=jsz+1 sor megnövel Használjuk a Dim helyett a Static kulcsszót! A Static kulcsszóval deklarált ún. statukus változó az eljárásából való kilépéskor nem szűnik meg és értékét is megtartja, ám a program más eljárásaiból nem érhető el. Private Sub Új_játék_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Új_játék.Click Static jsz As Integer
Utolsó simítások Felhasználóbarát megoldás, ha a program eleve egy elrejett számmal kezd, vagyis induláskor mitegy rákattint az Új_Játék gombra. Erre a lehetőséget az űrlap Load eseménye adja meg. 3
Az űrlapok Load eseménye akkor következik be, amikor az űrlap betöltödik. Ennek megfelelően ebbe az eseménykezelő eljárásba helyezhetjük az űrlap egyéni beállításait, de itt adhatjuk meg az űrlaphoz tartozó változók kezdeti értákeit is. Ezt a folyamatot inicializáslásnak nevezik. Az űrlap ilyenkor még nem látható, tehát ha valamit rajzolunk rá, az nem tud megjelenni. Az frmSZK_Load eseményt legegyszerűbben úgy érhetjük el, hogy kettőt kattintunk tervező nézetben az űrlap egy üres területére. Az Új_Játék_Click esemény meghívásátn túl ide kell tennünk a véletleszám-generátor kezdeti értékét beállító Randomize utasítást is: Private Sub frmSZk_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Randomize() ' véletlen szám generálás Új_játék_Click(sender, e) 'Új játék click eseményének meghívása End Sub
1. Számkitaláló 1.1 Fejlesszük tovább programunkat úgy, hogy amikor a felhasználó eltalálta a számot, a program értékelje a felhasználó ügyességét! Bővítsük a OK gomb klikk eleményét: Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click Dim stat As Double ' (2)hanyadik tippnél járunk stat = 1 / tsz ' (6) statisztikánk = 1 (a majdani találat) / a tippek száma lblStat.Text = stat * 100 ' (6) megszorozzuk 100-zal hogy százalékosan kapjuk meg
2. Számkitaláló 2.0 Fordítsuk meg a programot! A gép tippeljen az általunk kitalált számra! Legfeljebb hány tippel található el a gondolt szám?
4
Public Class frmSZK
Private gondolt, tippelt, tippszám, tsz As Integer Private Sub Tovább_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tovább.Click gondolt = Val(txtGondolt.Text) lblTippelt.Text = tippelt tippszám = tippszám + 1 lblTippszám.Text = tippszám If tippelt > gondolt Then tippelt = Math.Floor(tippelt * Rnd()) + 1 lblÉrt2.Text = "Kisebb a gongolt szám!" ElseIf tippelt < gondolt Then tippelt = Math.Floor((100 - tippelt) * Rnd()) + 1 lblÉrt2.Text = "Nagyobb a gondolt szám!" Else lblÉrt2.Text = "Talált!" End If End Sub Private Sub Új_játék_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Új_játék.Click Static jsz As Integer 'A Static kulcsszóval deklarált ún. statikus változó az eljárásból való kilépéskor nem szűnik meg és értékét is megtartja, ám a program más eljárásaiból nem érhető le. tsz = 0 '(2)tippszám txtGondolt.Text = tsz.ToString tippszámot szövegként jsz = jsz + 1
' (3) kiírjuk a
' (3) a játék számának növelése
'Me az aktív űrlapot jelöli: Me.Text = "Számkitaláló - " & jsz & ". játék" futó programunk fejlécbe való kiiratás tippszám = 0 lblTippszám.Text = tippszám lblTippelt.Text = 0
' (3) a
End Sub End Class
3. Alakítsuk át az eredeti programunkat hideg meleg barkochbává! Azaz a tippre adott értékelés az eltérés mértékétől függően legyen hideg, langyos, meleg, forró!
5