Programmēšana Datorspēles var būt tehniski grūtākais (un, iespējams, vislabāk atalgojošais) darbs, kas a programmētājs var piederēt. Augstākā līmeņa spēles prasa labāko no programmētājiem un datoriem.
Visual Basic 6 tagad ir pilnībā apiets kā spēļu programmēšanas platforma. (Tas nekad īsti nebija viens. Pat “labajās dienās” nopietni spēļu programmētāji nekad neizmantotu tādu augsta līmeņa valodu kā VB 6, jo jūs vienkārši nevarējāt izgriezt izcilu sniegumu, kas nepieciešams lielākajai daļai spēļu.) Bet vienkāršā spēle “Tic Tac Toe” ir lielisks ievads programmēšanā, kas ir nedaudz modernāka nekā "Sveika pasaule!"
Šis ir lielisks ievads daudziem programmēšanas pamatjēdzieniem, jo tajā ir apvienotas tehnikas, tostarp:
- Pielietojums masīvi. X un O marķieri tiek turēti atsevišķos masīvos, un viss bloks tiek nodots starp funkcijām, lai sekotu spēles gaitai.
- VB 6 līmeņa grafikas izmantošana: VB 6 nepiedāvā lieliskas grafiskās iespējas, taču spēle ir labs ievads pieejamajā. Liela daļa pārējo šīs sērijas ir izpēte, kā GDI +, nākamās paaudzes Microsoft grafika, aizstāj VB 6 līmeņa grafiku.
- Matemātisko aprēķinu izmantošana programmas vadībai: programma izmanto gudru modulo (Mod) un veselu skaitli dalījuma aprēķini, izmantojot divu spēļu marķieru masīvus, lai noteiktu, kad ir trīs elementu "win" notika.
Programmēšanas klase šajā rakstā varbūt ir tikai nedaudz virs sākuma līmeņa, taču tai vajadzētu būt noderīgai “starpposma” programmētājiem. Bet sāksim elementārā līmenī, lai ilustrētu dažus jēdzienus un sāktu jūs ar savu Visual Basic spēles programmēšanas karjera. Pat pieredzējušākiem studentiem var šķist, ka ir diezgan grūti izjust objektus pareizā formā.
Kā spēlēt Tic Tac Toe
Ja jūs nekad neesat spēlējis Desas spēle, šeit ir noteikumi. Divi spēlētāji pārmaiņus ievieto X un Os 3 x 3 spēles laukumos.
Pirms spēles sākuma abiem spēlētājiem jāvienojas par to, kurš brauks pirmais un kurš ar kuru simbolu atzīmēs viņa gājienus. Pēc pirmā gājiena spēlētāji pārmaiņus ievieto savas zīmes jebkurā tukšā kamerā. Spēles mērķis ir būt pirmajam spēlētājam ar trim atzīmēm horizontālā, diagonālā vai vertikālā līnijā. Ja nav tukšu šūnu un nevienam spēlētājam nav uzvarošu kombināciju, spēle ir neizšķirts.
Pirms faktiskās kodēšanas uzsākšanas vienmēr ir ieteicams mainīt izmantoto komponentu nosaukumus. Tiklīdz jūs sākat kodēšana, vārdu Visual Basic izmantos automātiski, tāpēc jūs vēlaties, lai tas būtu pareizais vārds. Mēs izmantosim veidlapas nosaukumu frmTicTacToe un mēs arī mainīsim parakstu uz “About Tic Tac Toe”.
Kad forma ir izveidota, izmantojiet līnijas rīklodziņa vadības ierīci, lai uzzīmētu 3 x 3 režģi. Noklikšķiniet uz līnijas rīka un pēc tam uzzīmējiet līniju, kur vēlaties. Šādā veidā jums būs jāizveido četras līnijas un jāpielāgo to garums un novietojums, lai tās izskatās pareizi. Visual Basic izvēlnē Formatēt ir arī daži ērti rīki, kas palīdzēs. Šī ir lieliska iespēja praktizēt kopā ar viņiem.
Papildus spēles režģim mums būs nepieciešami daži objekti X un O simboliem, kas tiks novietoti uz režģa. Tā kā režģī ir deviņas atstarpes, mēs izveidosim objektu masīvu ar deviņām atstarpēm, ko Visual Basic sauc par elementiem.
Ir vairāki veidi, kā izdarīt gandrīz visu Visual Basic izstrādes vidē, un vadības masīvu izveidošana nav izņēmums. Droši vien vienkāršākais veids ir izveidot pirmo etiķeti (noklikšķināt un zīmēt tāpat kā līnijas rīku), nosaukt to, iestatīt visus atribūtus (piemēram, Fonts un ForeColor) un pēc tam nokopēt to. VB 6 jautās, vai vēlaties izveidot vadības masīvu. Pirmajai etiķetei izmantojiet vārdu lblPlayGround.
Lai izveidotu pārējos astoņus režģa elementus, atlasiet pirmo etiķetes objektu, iestatiet Indeksa īpašību uz nulli un nospiediet CTRL + C (kopēt). Tagad jūs varat nospiest taustiņu kombināciju CTRL + V (ielīmēt), lai izveidotu citu etiķetes objektu. Kopējot objektus, piemēram, šo, katrs eksemplārs mantos visus rekvizītus, izņemot indeksu no pirmā. Katrā eksemplārā indekss palielinās par vienu. Šī ir vadības masīva, jo tām visām ir vienāds nosaukums, bet atšķirīgas indeksa vērtības.
Ja masīvu izveidojat šādā veidā, visas kopijas tiks sakrautas viena virs otras formas augšējā kreisajā stūrī. Katru etiķeti velciet uz vienu no režģa pozīcijām. Pārliecinieties, ka indeksa vērtības ir secīgas režģī. Programmas loģika ir atkarīga no tā. Etiķetes objektam ar indeksa vērtību 0 jābūt augšējā kreisajā stūrī, un apakšējā labajā etiķetē jābūt 8. indeksam. Ja etiķetes sedz spēles režģi, atlasiet katru etiķeti, ar peles labo pogu noklikšķiniet un atlasiet Sūtīt atpakaļ.
Tā kā ir astoņi iespējamie veidi, kā uzvarēt spēli, mums būs vajadzīgas astoņas dažādas līnijas, lai parādītu uzvaru spēles režģī. Jūs izmantosit to pašu paņēmienu, lai izveidotu citu vadības masīvu. Vispirms novilkt līniju, nosaukt to par linWin un indeksa īpašību iestatīt uz nulli. Pēc tam izmantojiet copy-paste tehniku, lai iegūtu vēl septiņas līnijas. Šajā ilustrācijā parādīts, kā pareizi iestatīt indeksa numurus.
Papildus etiķetes un līnijas objektiem jums ir vajadzīgas dažas komandu pogas, lai spēlētu spēli, un vairāk etiķetes, lai saglabātu rezultātu. To izveides soļi šeit nav sīki aprakstīti, taču šie ir vajadzīgie objekti.
Divas pogas objekti:
- cmdNewGame
- cmdResetScore
Kadru objekts fraPlayFirst, kas satur divas opciju pogas:
- optXPlayer
- optOPlayer
Kadru objekts fraScoreBoard, kurā ir sešas etiķetes. Programmas kodā tiek mainītas tikai lblXScore un lblOScore.
- lblX
- lblXScore
- lblO
- lblOScore
- lblMinus
- lblColon
Visbeidzot, jums ir nepieciešams arī etiķetes objekts lblStartMsg, lai “maskētu” pogu cmdNewGame, kad uz tā nevajadzētu noklikšķināt. Zemāk redzamajā attēlā tas nav redzams, jo formā tas aizņem tikpat lielu vietu kā komandu poga. Jums, iespējams, uz laiku būs jāpārvieto komandu poga, lai veidlapā uzzīmētu šo etiķeti.
Pagaidām nav veikta VB kodēšana, taču beidzot esam gatavi to darīt.
Inicializācija
Tagad jūs beidzot varat sākt kodēt programmu. Ja vēl neesat to izdarījis, iespējams, vēlēsities lejupielādēt avota kodu, kam sekot, kā izskaidrota programmas darbība.
Viens no pirmajiem dizaina lēmumiem, kā sekot spēles pašreizējam “stāvoklim”. Citiem vārdiem sakot, kādi pašreizējie Xs un Os ir uz spēles režģa un kurš pārvietojas tālāk. “Stāvokļa” jēdziens ir kritisks daudzās programmēšanas jomās, un jo īpaši tas ir svarīgi ASP un ASP.NET programmēšanā tīmeklim.
To var izdarīt vairākos veidos, tāpēc tas ir kritisks analīzes solis. Ja jūs pats atrisinātu šo problēmu, pirms kodēšanas sākšanas, iespējams, vēlēsities uzzīmēt blokshēmu un izmēģināt dažādas iespējas, izmantojot “skrāpējošo papīru”.
Mūsu risinājums izmanto divus "divdimensiju masīvus", jo tas palīdz sekot "stāvoklim", vienkārši mainot masīva indeksus programmas cilpās. Augšējā kreisā stūra stāvoklis ir masīva elementā ar indeksu (1, 1), augšējais labais stūris atrodas (1, 3), apakšējais labais ir (3,3) utt.. Divi šādi masīvi:
iXPos (x, y)
un
iOPos (x, y)
To var izdarīt ļoti dažādos veidos, un šīs sērijas VB.NET galīgais risinājums parāda, kā to izdarīt tikai ar vienu viendimensiju masīvu.
Programmēšana šo masīvu pārvēršanai spēlētāju lēmumos par uzvaru un formā redzamie displeji ir nākamajā lapā.
Jums nepieciešami arī daži globālie mainīgie, kā norādīts tālāk. Ievērojiet, ka tie ir veidlapas vispārīgajā un deklarācijas kodā. Tas viņus padara "moduļa līmenis" mainīgie, uz kuriem var atsaukties jebkur šīs formas kodā. Plašāku informāciju skatiet Visual Basic palīdzības sadaļā Izpratne par mainīgo jomu.
Ir divas jomas, kurās mainīgie tiek inicializēti mūsu programmā. Pirmkārt, tiek ielādēti daži mainīgie, kamēr tiek ielādēta frmTicTacToe forma.
Privāta apakšforma_lodze ()
Otrkārt, pirms katras jaunas spēles visi mainīgie, kas jāiestata sākuma vērtībām, tiek piešķirti inicializācijas apakšprogrammā.
Sub InitPlayGround ()
Ņemiet vērā, ka formas ielādes inicializācija izsauc arī rotaļu laukuma inicializēšanu.
Viena no programmētāja kritiskajām prasmēm ir spēja izmantot atkļūdošanas iespējas, lai saprastu, ko kods dara. Varat izmantot šo programmu, lai izmēģinātu:
- Pārkāpiet kodu ar taustiņu F8
- Pulksteņa iestatīšana galvenajiem mainīgajiem, piemēram, sPlaySign vai iMove
Pārrāvuma punkta iestatīšana un mainīgo vērtības vaicāšana. Piemēram, inicializācijas iekšējā cilpā:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""
Ņemiet vērā, ka šī programma skaidri parāda, kāpēc ir laba programmēšanas prakse datus glabāt masīvā, kad vien iespējams. Ja jums šajā programmā nebija masīvu, jums būs jāraksta kaut kas līdzīgs šim:
0 rinda.Visible = Nepatiesa
1. rinda.Visible = Nepatiess
Line2.Visible = Nepatiess
3.rinda.Visible = Nepatiess
4.rinda.Visible = Nepatiess
5. rinda.Visible = Nepatiess
6.rinda.Visible = Nepatiess
7.rinda.Visible = Nepatiess
tā vietā:
Ja i = 0 līdz 7
linWin (i) .Visible = False
Nākamais i
Pārvietošanās
Ja kādu sistēmas daļu var uzskatīt par “sirdi”, tā ir apakšprogramma lblPlayGround_Click. Šī apakšprogramma tiek izsaukta katru reizi, kad spēlētājs noklikšķina uz spēles režģa. (Klikšķiem jāatrodas vienā no deviņiem lblPlayGround elementiem.) Ievērojiet, ka šai apakšprogrammai ir arguments: (indekss kā vesels skaitlis). Lielākā daļa citu “notikumu apakšprogrammu”, piemēram, cmdNewGame_Click (), to nedara. Indekss norāda uz kuru etiķetes objektu ir noklikšķināts. Piemēram, indekss satur nulles vērtību režģa augšējā kreisajā stūrī un apakšējā labajā stūrī astoņu vērtību.
Pēc tam, kad spēlētājs noklikšķina uz kvadrāta spēles režģī, komandas poga, lai sāktu citu spēli, cmdNewGame, tiek “ieslēgta”, padarot to redzamu. Šīs komandas pogas stāvoklis veic dubultu slodzi, jo vēlāk to izmanto arī kā Būla lēmumu mainīgo. Īpašuma vērtības kā lēmuma mainīgā izmantošanu parasti nevēlas, jo, ja kādreiz rodas vajadzība mainīt programmu (teiksim, piemēram, komandu poga cmdNewGame, kas redzama visu laiku), tad programma negaidīti neizdosies, jo, iespējams, neatceraties, ka tā tiek izmantota arī kā programmas daļa loģika. Šī iemesla dēļ vienmēr ir laba ideja meklēt, izmantojot programmas kodu, un pārbaudīt visu, ko maināt, veicot programmas uzturēšanu, pat īpašuma vērtības. Šī programma daļēji pārkāpj noteikumu, lai norādītu uz šo punktu, un daļēji tāpēc, ka šis ir samērā vienkāršs koda gabals, kurā ir vieglāk redzēt, kas tiek darīts, un vēlāk izvairīties no problēmām.
Spēļu laukuma spēlētāju atlase tiek apstrādāta, izsaucot apakšprogrammu GamePlay ar indeksu kā argumentu.
Notiek apstrāde
Vispirms pārbaudiet, vai nav noklikšķināts uz neaizņemta laukuma.
Ja lblPlayGround (xo_Move) .Caption = "" Tad
Kad esam pārliecinājušies, ka šī rīcība ir likumīga, pārvietošanās skaitītājs (iMove) tiek palielināts. Nākamās divas līnijas ir ļoti interesantas, jo tās tulko koordinātas no vienas dimensijas Ja komponentu lblPlayGround masīvs ir divdimensiju indeksi, kurus varat izmantot gan iXPos, gan iOPos. Mods un vesels skaitlis (“slīpsvītra”) ir matemātiskas operācijas, kuras jūs neizmantojat katru dienu, taču šeit ir lielisks piemērs, kas parāda, kā tās var būt ļoti noderīgas.
Ja lblPlayGround (xo_Move) .Caption = "" Tad
iMove = iMove + 1
x = Int (xo_Move / 3) + 1
y = (xo_Move 3. mod.) + 1
Xo_Move vērtība 0 tiks tulkota šādā formātā: (1, 1), 1 - (1, 2)... 3 līdz (2, 1)... 8 līdz (3, 3).
Vērtībā sPlaySign, mainīgajā ar moduļa darbības jomu, tiek uzskaitīts, kurš spēlētājs veica kustību. Kad pārvietošanas bloki ir atjaunināti, etiķetes komponentus spēlējošajā režģī var atjaunināt ar atbilstošu zīmi.
Ja sPlaySign = "O", tad
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
Citur
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
Beigt ja
lblPlayGround (xo_Move) .Caption = sPlaySign
Piemēram, kad X atskaņotājs noklikšķina uz režģa augšējā kreisā stūra, mainīgajiem būs šādas vērtības:
Lietotāja ekrānā augšējā kreisajā lodziņā ir redzams tikai X, savukārt iXPos augšējā kreisajā lodziņā ir 1 un visos pārējos - 0. IOPos katrā lodziņā ir 0.
Vērtības mainās, kad O spēlētājs noklikšķina uz režģa centra kvadrāta. Tagad th iOPos rāda simbolu centrālajā lodziņā, kamēr lietotāja ekrāns rāda X augšējā kreisajā stūrī un O centrālo lodziņu. IXPos augšējā kreisajā stūrī tiek parādīts tikai viens, bet visās pārējās rūtiņās ir 0.
Tagad, kad jūs zināt, kur spēlētājs noklikšķināja un kurš spēlētājs noklikšķināja (izmantojot vērtību sPlaySign), viss, kas jums jādara, ir uzzināt, vai kāds uzvarēja spēli, un izdomāt, kā to parādīt displejs.
Laimētāja atrašana
Pēc katras kustības CheckWin funkcija pārbauda uzvarošo kombināciju. CheckWin darbojas, pievienojot katras rindas, katras kolonnas un diagonāles. Darbību izsekošana caur CheckWin, izmantojot Visual Basic atkļūdošanas funkciju, var būt ļoti izglītojoša. Laimesta atrašana vispirms ir jautājums, kurā jāpārbauda, vai mainīgajā iScore katrā individuālajā pārbaudē ir atrasti trīs 1, un pēc tam unikālas "paraksta" vērtības atgriešana Checkwin, kas tiek izmantota kā masīva indekss, lai mainītu linWin viena elementa rekvizītus Visible komponentu masīvs. Ja uzvarētāja nav, CheckWin saturēs vērtību -1. Ja ir uzvarētājs, displejs tiek atjaunināts, mainīts rezultātu tablo, tiek parādīts apsveikuma ziņojums un spēle tiek atsākta.
Sīki apskatīsim vienu no pārbaudēm, lai redzētu, kā tā darbojas. Pārējie ir līdzīgi.
'Pārbaudiet 3. rindas
Ja i = 1 līdz 3
iScore = 0
CheckWin = CheckWin + 1
J = 1 līdz 3
iScore = iScore + iPos (i, j)
Nākamais j
Ja iScore = 3 Tad
Izejas funkcija
Beigt ja
Nākamais i
Pirmais, kas jāievēro, ir tas, ka pirmais indeksa skaitītājs i skaita rindas, bet otrais j - skaitās pāri kolonnām. Pēc tam ārējā cilpa vienkārši pārvietojas no vienas rindas uz nākamo. Iekšējā cilpa skaita pašreizējā rindā esošos 1. Ja ir trīs, tad jums ir uzvarētājs.
Ņemiet vērā, ka jūs arī sekojat līdzi kopējam pārbaudīto kvadrātu skaitam mainīgajā CheckWin, kas ir vērtība, kas nodota atpakaļ, kad šī funkcija tiek pārtraukta. Katrai uzvarošajai kombinācijai CheckWin būs unikāla vērtība no 0 līdz 7, kuru izmanto, lai atlasītu kādu no elementiem linWin () komponentu masīvā. Tas padara arī svarīgu koda secību funkcijā CheckWin! Ja pārvietojāt vienu no blokiem cilpas kods (tāpat kā iepriekš), kad kāds uzvar, spēles režģī tiks novilkta nepareiza līnija. Izmēģiniet to un redziet!
Apdares detaļas
Vienīgais kods, kas vēl nav apspriests, ir jaunas spēles apakšprogramma un apakšprogramma, kas atjaunos rezultātu. Pārējā loģika sistēmā padara to izveidi diezgan vienkāršu. Lai sāktu jaunu spēli, jums ir tikai jāizsauc apakšprogramma InitPlayGround. Kā spēlētāju ērtības, jo pogai varēja noklikšķināt spēles vidū, pirms došanās uz priekšu lūdzat apstiprinājumu. Pirms restartējat tablo, jūs arī lūdzat apstiprinājumu.