Programmeerimine Arvutimängud võib olla kõige tehniliselt keerulisem (ja võib-olla ka kõige paremini tasustatav) töö, mida a programmeerija võib olla. Tipptasemel mängud nõuavad parimat nii programmeerijatelt kui ka arvutitelt.
Visual Basic 6 on nüüd mängude programmeerimise platvormist põhjalikult mööda hiilitud. (See polnud kunagi tegelikult üks. Isegi "heade päevade" ajal ei kasutaks tõsised mänguprogrammeerijad kunagi sellist kõrgetasemelist keelt nagu VB 6, sest te ei saanud lihtsalt lõiku parem jõudlus, mida enamik mänge nõuab.) Kuid lihtne "Tic Tac Toe" mäng on suurepärane sissejuhatus programmeerimisse, mis on pisut keerukam kui "Tere, Maailm!"
See on suurepärane sissejuhatus paljudesse programmeerimise põhimõistetesse, kuna see ühendab endas järgmisi tehnikaid:
- Kasutamine massiivid. X- ja O-markereid hoitakse eraldi massiivides ja mängu edenemise jälgimiseks antakse kogu massiivi funktsioonide vahel.
- VB 6 taseme graafika kasutamine: VB 6 ei paku suurepäraseid graafilisi võimalusi, kuid mäng on hea sissejuhatus sellesse, mis saadaval. Suur osa ülejäänud seeriast on uurimine sellest, kuidas GDI +, Microsofti järgmise põlvkonna graafika, asendab VB 6 taseme graafikat.
- Matemaatikaarvutuste kasutamine programmi juhtimiseks: programm kasutab nutikat modulo (Mod) ja täisarvu jagunemisarvutused kahe mängumarkeri massiivide abil, et teha kindlaks, millal kolmeelemendiline "võit" on toimunud.
Selles artiklis sisalduv programmeerimisklass on võib-olla veidi algetapist möödas, kuid see peaks olema hea nn vaheprobleemide jaoks. Kuid alustame elementaarselt mõne mõiste illustreerimiseks ja oma asjadega alustamiseks Visual Basic mängude programmeerimise karjäär. Isegi kaugemalt arenenud õpilased võivad leida, et vormil olevate objektide õigeks saamiseks on keeruline.
Kuidas mängida Tic Tac Toe
Kui te pole kunagi mänginud Tic Tac Toe, siin on reeglid. Kaks mängijat vaheldumisi asetavad Xs ja Os 3 x 3 mänguväljale.
Enne mängu algust peavad mõlemad mängijad kokku leppima, kes esimesena läheb ja kes millise sümboliga tähistab tema käike. Pärast esimest käiku paigutavad mängijad vaheldumisi oma märgid tühja lahtrisse. Mängu eesmärk on olla esimene mängija, kellel on kolm horisontaal-, diagonaal- või vertikaaljoont. Kui puuduvad tühjad lahtrid ja kummalgi mängijal pole võidukombinatsiooni, on mäng viik.
Enne tegeliku kodeerimise alustamist on alati hea mõte muuta kasutatavate komponentide nimesid. Kui sa alustad kodeerimine, kasutab Visual Basic seda nime automaatselt, nii et soovite, et see oleks õige nimi. Kasutame vormi nime frmTicTacToe ja muudame pealdise ka pealkirjaks „About Tic Tac Toe”.
Kui vorm on loodud, joonistage tööriistakasti rea abil 3 x 3 ruudustikku. Klõpsake jooneriistal ja tõmmake joon sinna, kuhu soovite. Sel viisil peate looma neli rida ja kohandama nende pikkust ja positsiooni, et need näeksid välja õigesti. Visual Basicus on ka menüü Vorming all mõned mugavad tööriistad, mis aitavad. See on suurepärane võimalus nendega koos harjutada.
Lisaks mänguvõrgule vajame X-i ja O-sümbolite jaoks mõnda objekti, mis ruudustikule paigutatakse. Kuna ruudustikus on üheksa tühikut, loome objekti massiivi koos üheksa tühikuga, mida Visual Basicus nimetatakse elementideks.
Peaaegu kõike Visual Basicu arenduskeskkonnas saab teha mitmel viisil ja juhtimismassiivide loomine pole erand. Tõenäoliselt on kõige lihtsam moodustada esimene silt (klõpsata ja joonistada täpselt nagu joontööriist), anda sellele nimi, seada kõik atribuudid (näiteks Font ja ForeColor) ning seejärel sellest koopiad teha. VB 6 küsib, kas soovite luua juhtmassiivi. Esimese sildi jaoks kasutage nime lblPlayGround.
Võrgustiku kaheksa ülejäänud elemendi loomiseks valige esimene sildiobjekt, määrake atribuudi Index väärtus nulliks ja vajutage CTRL + C (koopia). Nüüd saate uue sildiobjekti loomiseks vajutada CTRL + V (kleepida). Niisuguste objektide kopeerimisel pärib iga koopia kõiki atribuute, välja arvatud indeks esimesest. Indeks suureneb iga eksemplari kohta ühe võrra. See on kontrollmassiiv, kuna neil kõigil on sama nimi, kuid erinevad indeksi väärtused.
Kui loote massiivi sel viisil, virnastatakse kõik eksemplarid vormi ülanurgas üksteise peale. Lohistage iga silt ühele ruudustiku positsioonile. Veenduge, et indeksi väärtused on ruudustikus järjestikused. Sellest sõltub programmi loogika. Sildiobjekt indeksi väärtusega 0 peaks olema vasakus ülanurgas ja alumises paremas sildis peaks olema indeks 8. Kui sildid katavad mänguruudustiku, valige iga silt, paremklõpsake ja valige Saada tagasi.
Kuna mängu võitmiseks on kaheksa võimalikku viisi, vajame võidu näitamiseks ruudustikus kaheksat erinevat rida. Uue juhtmassiivi loomiseks kasutate sama tehnikat. Esiteks tõmmake joon, pange sellele linWin ja määrake atribuudi Index väärtus nulliks. Seejärel kasutage veel seitsme rea tootmiseks copy-paste tehnikat. Järgmine illustratsioon näitab, kuidas indeksinumbreid õigesti seadistada.
Lisaks siltidele ja reaobjektidele vajate mängu mängimiseks käsunuppe ja veel punkte siltide hoidmiseks. Nende loomise sammud pole siin detailsed, kuid need on objektid, mida vajate.
Kaks nuppu objektid:
- cmdNewGame
- cmdResetScore
Raamiobjekt fraPlayFirst, mis sisaldab kahte valikunuppu:
- optXPlayer
- optOPlayer
Raamiobjekt fraScoreBoard, mis sisaldab kuut silti. Programmikoodis muudetakse ainult lblXScore ja lblOScore.
- lblX
- lblXScore
- lblO
- lblOScore
- lblMinus
- lblColon
Lõpuks vajate ka siltide objekti lblStartMsg, et "maskeerida" nuppu cmdNewGame, kui seda ei tohiks klõpsata. Seda ei ole alloleval illustratsioonil näha, kuna see võtab vormis sama ruumi kui käsunupp. Selle sildi vormile joonistamiseks peate võib-olla ajutiselt käsunuppu liigutama.
Siiani pole VB kodeerimist tehtud, kuid lõpuks oleme selleks valmis.
Initsialiseerimine
Nüüd saate lõpuks programmi kodeerima hakata. Kui te pole seda veel teinud, võiksite alla laadida lähtekoodi, mida järgida programmi toimimise selgitamisel.
Üks esimesi tehtud disainilahendusi on see, kuidas mängu hetkeolukorda jälgida. Teisisõnu, millised on praegused X-id ja Os-id ruudustikul ja kes liigub järgmisena. Mõiste „olek” on paljudes programmeerimistes kriitiline ja eriti oluline on veebi jaoks ASP ja ASP.NET programmeerimisel.
Seda saab teha mitmel viisil, seega on see analüüsi kriitiline samm. Kui lahendaksite selle probleemi iseseisvalt, võiksite enne kodeerimise alustamist joonistada vooskeemi ja proovida kriimustuspaberiga erinevaid võimalusi.
Meie lahendus kasutab kahte "kahemõõtmelist massiivi", kuna see aitab "olekut" jälgida, muutes lihtsalt massiivi indekseid programmi ahelates. Ülemise vasakpoolse nurga olek on massiivi elemendis indeksiga (1, 1), parem ülanurk on sisse lülitatud (1, 3), all paremal all (3,3) ja nii edasi. Kaks massiivi, mis seda teevad, on järgmised:
iXPos (x, y)
ja
iOPos (x, y)
Selle tegemiseks on palju erinevaid võimalusi ja selle sarja lõplik VB.NET-lahendus näitab teile, kuidas seda teha vaid ühe ühemõõtmelise massiivi abil.
Programm nende massiivide tõlkimiseks mängija võiduotsusteks ja vormi nähtavad kuvarid on järgmisel lehel.
Teil on vaja ka järgmisi globaalseid muutujaid. Pange tähele, et need on vormi üld- ja deklaratsioonikoodis. See teeb neist "moodulitase" muutujad, millele saab selle vormi koodis ükskõik kus viidata. Selle kohta lisateabe saamiseks vaadake jaotist Visual Basici spikker Muutujate ulatuse mõistmine.
On kaks valdkonda, kus muutujad meie programmis initsialiseeritakse. Esiteks lähtestatakse vorm frmTicTacToe laadimisel mõned muutujad.
Privaatne alavorm_koormus ()
Teiseks, enne iga uut mängu omistatakse initsialiseerimise alamprogrammis kõik muutujad, mille algväärtused tuleb lähtestada.
Sub InitPlayGround ()
Pange tähele, et vormi laadimise initsialiseerimine kutsub ka mänguvälja initsialiseerimist.
Üks programmeerija kriitilisi oskusi on võime kasutada silumisvõimalusi, et mõista, mida kood teeb. Selle programmi abil saate proovida:
- Koodist F8-klahvi abil läbi astudes
- Vaate seadistamine peamistele muutujatele, näiteks sPlaySign või iMove
Murdepunkti määramine ja muutujate väärtuse küsimine. Näiteks lähtestamise sisesilmus:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""
Pange tähele, et see programm näitab selgelt, miks on hea programmeerimistava hoida andmeid massiivides igal võimalusel. Kui teil pole selles programmis massiive, peaksite kirjutama koodi umbes selline:
Line0.Visible = Vale
Line1.Visible = Vale
Rida2.Visible = Vale
Rida3.Visible = Vale
Line4.Visible = Vale
Line5.Visible = Vale
Line6.Visible = Vale
Line7.Visible = Vale
selle asemel:
Kui i = 0 kuni 7
linWin (i) .Visible = Vale
Järgmine i
Liikumise tegemine
Kui mõnda süsteemi osa võib pidada südameks, on see alamprogramm lblPlayGround_Click. Seda alamprogrammi kutsutakse iga kord, kui mängija klõpsab mänguruudul. (Klõpsud peavad olema üheksa elemendi lblPlayGround sees.) Pange tähele, et sellel alamprogrammil on argument: (Indeks täisarvuna). Enamik teisi sündmuse alamprogramme, nagu cmdNewGame_Click (), seda ei tee. Indeks näitab, millisele sildiobjektile on klõpsatud. Näiteks sisaldaks indeks ruudustiku vasakpoolses ülanurgas nullväärtust ja paremas alanurgas väärtust kaheksa.
Pärast seda, kui mängija on klõpsanud ruudul mänguruudul, lülitatakse uue mängu käivitamiseks käsunupp cmdNewGame sisse, muutes selle nähtavaks. Selle käsunupu olek täidab topeltkohustust, kuna seda kasutatakse ka hiljem tõeväärtusliku otsustusmuutujana. Omandiväärtuse kasutamist otsustusmuutujana tavaliselt ei soovitata, sest kui on kunagi vaja programmi muuta (näiteks öelda, käsunupp cmdNewGame kogu aeg nähtav), siis ebaõnnestub programm ebaõnnestumisel, kuna te ei mäleta, et seda kasutatakse ka programmi osana loogika. Sel põhjusel on alati hea mõte otsida programmi koodist ja kontrollida programmi hoolduse käigus muudetud asjade kasutamist, isegi atribuutide väärtusi. See programm rikub reeglit osutada sellele punktile ja osalt seetõttu, et tegemist on suhteliselt lihtsa kooditükiga, kus on lihtsam näha, mida tehakse, ja hiljem probleeme vältida.
Mänguruumi mängija valitud mäng töödeldakse, kutsudes mängu alamprogrammi GamePlay, mille argumendiks on Indeks.
Töötlemise käik
Kõigepealt kontrollige, kas pole hõivatud ruudu klõpsuga.
Kui lblPlayGround (xo_Move) .Caption = "" Siis
Kui oleme kindlad, et see on õigustatud käik, suurendatakse käigu loendurit (iMove). Kaks järgmist rida on väga huvitavad, kuna need tõlgivad koordinaadid ühemõõtmelisest Kui komponent lblPlayGround on massiivne kahemõõtmeliste indeksiteni, mida saate kasutada nii iXPos kui ka iOPos. Modifikatsioon ja täisarv jaotus ('tagasilõige') on matemaatilised toimingud, mida te ei kasuta iga päev, kuid siin on suurepärane näide, mis näitab, kuidas need võivad olla väga kasulikud.
Kui lblPlayGround (xo_Move) .Caption = "" Siis
iMove = iMove + 1
x = keskmine (xo_Move / 3) + 1
y = (xo_Modu 3. mod.) + 1
Xo_Move väärtus 0 tõlgitakse järgmiselt: (1, 1), 1 - (1, 2)... 3 kuni (2, 1)... 8 kuni (3, 3).
Mooduli ulatusega muutuja sPlaySign väärtus hoiab silma peal, milline mängija liikus. Kui teisaldamismassiivid on värskendatud, saab mänguvõrgu sildikomponente vastava tähisega värskendada.
Kui sPlaySign = "O", siis
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
Muu
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
Lõpeta If
lblPlayGround (xo_Move) .Caption = sPlaySign
Näiteks kui X-mängija klõpsab ruudustiku vasakus ülanurgas, on muutujatel järgmised väärtused:
Kasutaja ekraanil kuvatakse vasakus ülanurgas ainult X, samas kui iXPos on vasakus ülanurgas 1 ja kõigis teistes 0. IOPos on igas kastis 0.
Väärtused muutuvad, kui O-mängija klõpsab ruudustiku keskmisel ruudul. Nüüd näitab iOPos keskosas kasti 1, samal ajal kui kasutaja ekraanil vasakus ülanurgas on X ja keskel kastis O. IXPos näitab vasakus ülanurgas ainult ühte ja kõigis teistes kastides 0.
Nüüd, kui teate, kus mängija klõpsas ja milline mängija klõpsas (kasutades väärtust sPlaySign), peate vaid välja uurima, kas keegi on mängu võitnud, ja välja mõtlema, kuidas seda väljapanek.
Võitja leidmine
Pärast iga käiku kontrollib funktsioon CheckWin võidukombinatsiooni olemasolu. CheckWin töötab, lisades iga rea alla, iga veeru ja diagonaali kaudu. CheckWini kaudu toimingute jälgimine Visual Basicu silumisfunktsiooni abil võib olla väga hariv. Võidu leidmine on kõigepealt küsimus, kontrollides, kas muutuja iScore iga üksiku kontrollimise käigus leiti kolm 1-d, ja siis tagastades Checkwinis unikaalse "allkirja" väärtuse, mida kasutatakse massiivi indeksina linWini ühe elemendi Visible omaduse muutmiseks komponentide massiiv. Kui võitjat pole, sisaldab CheckWin väärtust -1. Võitja olemasolul värskendatakse kuva, muudetakse tulemustabelit, kuvatakse õnnitlusteade ja mäng taasalustatakse.
Vaatame üksikasjalikult läbi ühe kontrolli, kuidas see töötab. Teised on sarnased.
'Kontrollige, kas read on 3
Kui i = 1 kuni 3
iScore = 0
CheckWin = CheckWin + 1
Kui j = 1 kuni 3
iScore = iScore + iPos (i, j)
Järgmine j
Kui iScore = 3 Siis
Funktsioonist väljumine
Lõpeta If
Järgmine i
Esimene asi, mida tuleb tähele panna, on see, et esimene indeksloendur i loendab ridu, teine j loendab veerge. Väline silmus liigub siis lihtsalt ühelt realt teisele. Sisemine silmus loeb praeguses reas olevad 1-d. Kui neid on kolm, on teil võitja.
Pange tähele, et jälgite ka muutuja CheckWin testitud ruutude koguarvu, mis on väärtus, mis selle funktsiooni lõppedes tagasi antakse. Igal võidetud kombinatsioonil on CheckWinis unikaalne väärtus vahemikus 0 kuni 7, mida kasutatakse linWin () komponendi massiivi ühe elemendi valimiseks. See muudab ka funktsiooni CheckWin koodi järjekorra oluliseks! Kui teisaldasite ühe saidi silmuskood (nagu ülaltoodud) tõmmatakse mänguvõrgule vale joon, kui keegi võidab. Proovi ja vaata!
Viimistlusdetailid
Ainus kood, mida veel ei arutatud, on uue mängu alamprogramm ja skoori lähtestav alamprogramm. Ülejäänud süsteemi loogika muudab nende loomise üsna lihtsaks. Uue mängu alustamiseks peate helistama ainult alamprogrammile InitPlayGround. Mängijate mugavuse huvides, kuna nuppu võidi mängu keskel klõpsata, paluge enne jätkamist kinnitust. Enne tulemustabeli taaskäivitamist küsite ka kinnitust.