programovanie počítačové hry môže byť technicky najnáročnejšou (a možno najlepšie platenou) prácou, ktorá a programátor môže mať. Hry najvyššej úrovne vyžadujú to najlepšie od programátorov aj od počítačov.
Visual Basic 6 bola teraz dôkladne obídená ako platforma pre programovanie hier. (Nikdy to tak nebolo. Dokonca aj v „dobrých dňoch“ by seriózni herní programátori nikdy nepoužívali jazyk na vysokej úrovni, ako je VB 6, pretože ste jednoducho nemohli rezať špičkový výkon, ktorý väčšina hier vyžaduje.) Jednoduchá hra „Tic Tac Toe“ je skvelým úvodom do programovania, ktorý je trochu pokročilejší než "Ahoj svet!"
Toto je skvelý úvod do mnohých základných pojmov programovania, pretože kombinuje techniky vrátane:
- Použitie polí. Značky X a O sa uchovávajú v samostatných poliach a celé polia sa prenášajú medzi funkciami, aby sa sledoval priebeh hry.
- Použitie grafiky na úrovni VB 6: VB 6 neponúka veľké grafické možnosti, ale hra je dobrým úvodom k tomu, čo je k dispozícii. Väčšina zo zvyšku tejto série je skúmaním toho, ako GDI +, ďalšia generácia grafiky spoločnosti Microsoft, nahrádza grafiku na úrovni VB 6.
- Použitie matematických výpočtov na riadenie programu: Program využíva inteligentné modulo (Mod) a celé číslo Výpočty rozdelenia pomocou polí dvojzložkových markerov určujú, kedy má trojkomponentné „víťazstvo“ došlo.
Trieda programovania v tomto článku je možno len trochu za začiatočnou úrovňou, ale mala by byť dobrá pre „stredných“ programátorov. Začnime však na základnej úrovni, aby sme ilustrovali niektoré z týchto pojmov a začali s tým Visual Basic kariéra programovania hier. Dokonca aj študenti vyspelejší, ako to môže zistiť, že je trochu náročné dostať objekty do formy v poriadku.
Ako hrať Tic Tac Toe
Ak si nikdy nehral Piškôrky, tu sú pravidlá. Dvaja hráči sa striedajú pri umiestňovaní Xs a O na hracie pole 3 x 3.
Pred začiatkom hry sa obaja hráči musia dohodnúť na tom, kto bude prvý a kto označí svoje pohyby týmto symbolom. Po prvom ťahu hráči striedavo umiestňujú svoje značky do akejkoľvek prázdnej bunky. Cieľom hry je byť prvým hráčom s tromi značkami v horizontálnej, diagonálnej alebo vertikálnej línii. Ak nie sú k dispozícii žiadne prázdne bunky a ani jeden z nich nemá výhernú kombináciu, hra je remíza.
Pred začatím akéhokoľvek skutočného kódovania je vždy vhodné zmeniť názvy všetkých použitých komponentov. Akonáhle začnete kódovanie, názov sa automaticky použije v jazyku Visual Basic, takže chcete, aby bol správnym názvom. Použijeme názov formulára frmTicTacToe a tiež zmeníme nadpis s nadpisom „O Tic Tac Toe.“
Po vytvorení formulára pomocou ovládacieho panela nástrojov čiar nakreslite mriežku 3 x 3. Kliknite na nástroj čiar a potom nakreslite čiaru, kde ju chcete. Týmto spôsobom budete musieť vytvoriť štyri riadky a upraviť ich dĺžku a polohu tak, aby vyzerali správne. Visual Basic má tiež niekoľko užitočných nástrojov v ponuke Formát, ktoré vám pomôžu. Je to veľká šanca si s nimi precvičiť.
Okrem hracej mriežky potrebujeme aj niektoré objekty pre symboly X a O, ktoré budú umiestnené na mriežke. Pretože v mriežke je deväť medzier, vytvoríme pole objektov s deviatimi medzerami, ktoré sa v jazyku Visual Basic nazývajú prvky.
Existuje niekoľko spôsobov, ako urobiť takmer všetko v vývojovom prostredí jazyka Visual Basic, a vytvorenie riadiacich polí nie je výnimkou. Pravdepodobne najjednoduchším spôsobom je vytvoriť prvú menovku (kliknúť a nakresliť rovnako ako riadkový nástroj), pomenovať ju, nastaviť všetky atribúty (napríklad Font a ForeColor) a potom z nej vytvoriť kópie. VB 6 sa opýta, či chcete vytvoriť kontrolné pole. Pre prvé označenie použite názov lblPlayGround.
Ak chcete vytvoriť ďalších osem prvkov mriežky, vyberte prvý objekt štítka, nastavte vlastnosť Index na nulu a stlačte klávesy CTRL + C (kópia). Teraz môžete stlačiť CTRL + V (vložiť) a vytvoriť ďalší objekt štítka. Keď kopírujete objekty, ako je tento, každá kópia zdedí všetky vlastnosti okrem indexu z prvej. Index sa zvýši o jednu pre každú kópiu. Toto je kontrolné pole, pretože všetky majú rovnaký názov, ale rôzne hodnoty indexu.
Ak vytvoríte pole týmto spôsobom, všetky kópie budú naskladané na seba v ľavom hornom rohu formulára. Presuňte jednotlivé štítky na jednu z pozícií na hracej ploche. Uistite sa, že hodnoty indexu sú v sieti postupné. Logika programu závisí od toho. Objekt štítka s hodnotou indexu 0 by mal byť v ľavom hornom rohu a štítok vpravo dole by mal mať index 8. Ak štítky pokrývajú hraciu mriežku, vyberte jednotlivé štítky, kliknite pravým tlačidlom myši a vyberte položku Odoslať naspäť.
Pretože existuje osem možných spôsobov, ako vyhrať hru, potrebujeme osem rôznych riadkov, aby sme mohli na výhre ukázať výhru. Rovnakú techniku použijete na vytvorenie iného riadiaceho poľa. Najprv nakreslite čiaru, pomenujte ju linWin a nastavte vlastnosť Index na nulu. Potom pomocou techniky kopírovania a prilepenia vytvorte ďalších sedem riadkov. Nasledujúci obrázok ukazuje, ako správne nastaviť indexové čísla.
Okrem objektov štítkov a riadkov potrebujete na hranie hry niektoré príkazové tlačidlá a ďalšie štítky na udržanie skóre. Kroky na ich vytvorenie tu nie sú podrobne opísané, ale sú to objekty, ktoré potrebujete.
Dve tlačidlá objektov:
- cmdNewGame
- cmdResetScore
Rámový objekt fraPlayFirst obsahujúci dve voliteľné tlačidlá:
- optXPlayer
- optOPlayer
Rámový objekt fraScoreBoard obsahujúci šesť štítkov. V programovom kóde sa zmenia iba lblXScore a lblOScore.
- lblX
- lblXScore
- lblO
- lblOScore
- lblMinus
- lblColon
Nakoniec musíte tiež označiť objekt lblStartMsg, aby ste „maskovali“ tlačidlo cmdNewGame, keď naň nemožno kliknúť. Toto nie je viditeľné na obrázku nižšie, pretože zaberá rovnaké miesto vo formulári ako príkazové tlačidlo. Možno budete musieť dočasne presunúť príkazové tlačidlo, aby ste mohli tento štítok na formulári nakresliť.
Doposiaľ sa neuskutočnilo žiadne kódovanie VB, ale sme na to konečne pripravení.
inicializácia
Teraz môžete konečne začať programovať program. Ak ste to ešte neurobili, možno budete chcieť stiahnuť zdrojový kód, ktorý bude nasledovať spolu s vysvetlením fungovania programu.
Jedným z prvých rozhodnutí o dizajne je, ako sledovať aktuálny stav hry. Inými slovami, aké sú súčasné Xs a O na hracej mriežke a kto sa pohne ďalej. Pojem „stav“ je v mnohých programoch kritický, a najmä v programovaní ASP a ASP.NET pre web.
Existuje niekoľko spôsobov, ako sa to dá urobiť, takže je to kritický krok v analýze. Ak ste tento problém riešili sami, možno budete chcieť nakresliť vývojový diagram a pred začatím kódovania vyskúšať rôzne možnosti pomocou „stieracieho papiera“.
Naše riešenie používa dve „dvojrozmerné polia“, pretože to pomáha sledovať „stav“ jednoduchou zmenou indexov polí v programových slučkách. Stav ľavého horného rohu bude v prvku poľa s indexom (1, 1), pravý horný roh bude v (1, 3), pravý dolný v (3,3) atď., Sú to tieto dve polia:
iXPos (x, y)
a
iOPos (x, y)
Existuje veľa rôznych spôsobov, ako to dosiahnuť a konečné riešenie VB.NET v tejto sérii vám ukáže, ako to urobiť pomocou jediného jednorozmerného poľa.
Programovanie na preklad týchto polí do rozhodnutí o výhre hráča a viditeľných obrazoviek vo formulári je na nasledujúcej stránke.
Potrebujete tiež niekoľko globálnych premenných nasledovne. Všimnite si, že sú uvedené v kóde Všeobecné a Vyhlásenie. To z nich robí „úroveň modulu“ premenné, na ktoré je možné v tomto formulári odkazovať kdekoľvek. Ďalšie informácie nájdete v pomocníkovi jazyka Visual Basic v časti Porozumenie rozsahu premenných.
V našom programe sú inicializované premenné v dvoch oblastiach. Najprv sa inicializuje niekoľko premenných, kým sa načíta formulár frmTicTacToe.
Súkromný podformulár_Load ()
Po druhé, pred každou novou hrou sú všetky premenné, ktoré je potrebné resetovať na počiatočné hodnoty, priradené k inicializačnému podprogramu.
Sub InitPlayGround ()
Upozorňujeme, že inicializácia načítania formulára tiež nazýva inicializáciu detského ihriska.
Jednou z kritických zručností programátora je schopnosť používať ladiace zariadenia na pochopenie toho, čo kód robí. Tento program môžete vyskúšať:
- Prekročenie kódu pomocou klávesu F8
- Nastavenie sledovania kľúčových premenných, napríklad sPlaySign alebo iMove
Nastavenie bodu prerušenia a zisťovanie hodnoty premenných. Napríklad vo vnútornej slučke inicializácie:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""
Tento program jasne ukazuje, prečo je dobré uchovávať údaje v poliach vždy, keď je to možné. Ak by ste v tomto programe nemali polia, museli by ste napísať tento kód:
Line0.Visible = False
Line1.Visible = False
Line2.Visible = False
Line3.Visible = False
Line4.Visible = False
Line5.Visible = False
Line6.Visible = False
Line7.Visible = False
namiesto toho:
Pre i = 0 až 7
linWin (i) .Visible = False
Ďalej i
Vykonanie ťahu
Ak možno ktorúkoľvek časť systému považovať za „srdce“, jedná sa o podprogram lblPlayGround_Click. Táto podprogram sa volá vždy, keď hráč klikne na hraciu mriežku. (Kliknutia musia byť vo vnútri jedného z deviatich prvkov lblPlayGround.) Všimnite si, že tento podprogram má argument: (Index As Integer). Väčšina ostatných „podprogramov udalostí“, napríklad cmdNewGame_Click (), nie. Index označuje, na ktorý objekt štítku sa kliklo. Napríklad index by obsahoval hodnotu nula pre ľavý horný roh mriežky a hodnotu osem pre pravý dolný roh.
Keď hráč klikne na štvorec v hernej mriežke, príkazové tlačidlo na spustenie ďalšej hry cmdNewGame sa „zapne“ zviditeľnením. Stav tohto príkazového tlačidla má dvojnásobnú povinnosť, pretože sa neskôr v programe používa aj ako boolovská rozhodovacia premenná. Použitie hodnoty vlastnosti ako rozhodovacej premennej sa zvyčajne neodporúča, pretože ak je niekedy potrebné zmeniť program (napríklad, aby sa príkazové tlačidlo cmdNewGame viditeľné stále), potom program neočakávane zlyhá, pretože si možno nepamätáte, že sa používa aj ako súčasť programu logika. Z tohto dôvodu je vždy vhodné prehľadávať programový kód a skontrolovať použitie všetkého, čo zmeníte pri vykonávaní údržby programu, dokonca aj hodnoty vlastností. Tento program porušuje pravidlo čiastočne, aby sa to ujasnilo, a čiastočne preto, že ide o relatívne jednoduchý kus kódu, v ktorom je ľahšie vidieť, čo sa deje, a vyhnúť sa problémom neskôr.
Výber hráča z hrania hry sa spracuje vyvolaním podprogramu GamePlay s argumentom Index.
Spracováva sa presun
Najprv skontrolujte, či ste neklikli na neobsadený štvorec.
Ak lblPlayGround (xo_Move) .Caption = "" Potom
Keď sme si istí, že je to legitímny ťah, počítadlo ťahov (iMove) sa zvýši. Nasledujúce dva riadky sú veľmi zaujímavé, pretože prekladajú súradnice z jednorozmerného Ak je pole komponentov lblPlayGround do dvojrozmerných indexov, ktoré môžete použiť v iXPos alebo iOPos. Divízia Mod a celé číslo („spätné lomítko“) sú matematické operácie, ktoré nepoužívate každý deň, ale tu je skvelý príklad, ktorý ukazuje, ako môžu byť veľmi užitočné.
Ak lblPlayGround (xo_Move) .Caption = "" Potom
iMove = iMove + 1
x = Int (xo_Move / 3) + 1
y = (xo_Move Mod 3) + 1
Hodnota xo_Move 0 bude preložená do (1, 1), 1 do (1, 2)... 3 až (2, 1)... 8 až 3, 3.
Hodnota v sPlaySign, premennej s rozsahom modulu, sleduje, ktorý hráč urobil ťah. Akonáhle sú polia presunu aktualizované, komponenty štítkov v hracej mriežke môžu byť aktualizované pomocou príslušnej značky.
Ak sPlaySign = "O", potom
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
inak
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
Koniec Ak
lblPlayGround (xo_Move) .Caption = sPlaySign
Napríklad, keď hráč X klikne do ľavého horného rohu mriežky, premenné budú mať nasledujúce hodnoty:
Obrazovka používateľa zobrazuje iba X v ľavom hornom políčku, zatiaľ čo iXPos má 1 v ľavom hornom poli a 0 vo všetkých ostatných. IOPos má 0 v každom poli.
Hodnoty sa menia, keď hráč O klikne na stredový štvorec mriežky. Teraz iOPos ukazuje 1 v strednom poli, zatiaľ čo obrazovka používateľa ukazuje X v ľavom hornom rohu a O v strednom poli. IXPos zobrazuje iba 1 v ľavom hornom rohu a 0 vo všetkých ostatných rámčekoch.
Teraz, keď viete, na ktorý hráč klikol a na ktorý hráč klikol (pomocou hodnoty v sPlaySign), všetko, čo musíte urobiť, je zistiť, či niekto vyhral hru a zistiť, ako to ukázať v zobraziť.
Nájdenie víťaza
Po každom ťahu skontroluje funkcia CheckWin výhernú kombináciu. CheckWin funguje pridaním každého riadku nadol do každého stĺpca a cez každú uhlopriečku. Sledovanie krokov pomocou funkcie CheckWin pomocou funkcie Debug jazyka Visual Basic môže byť veľmi poučné. Nájdenie výhry je najprv otázkou, či sa pri každej jednotlivej kontrole premennej iScore zistili tri 1, a potom vrátenie jedinečnej hodnoty „podpisu“ v službe Checkwin, ktorá sa používa ako index poľa na zmenu vlastnosti Visible jedného prvku v linWin pole komponentov. Ak nie je víťaz, CheckWin bude obsahovať hodnotu -1. Ak je výherca, displej sa aktualizuje, zmení sa výsledková tabuľka, zobrazí sa blahoželanie a hra sa reštartuje.
Pozrime sa podrobne na jednu z kontrol, aby sme zistili, ako to funguje. Ostatné sú podobné.
„Skontrolujte riadky na 3
Pre i = 1 až 3
iScore = 0
CheckWin = CheckWin + 1
Pre j = 1 až 3
iScore = iScore + iPos (i, j)
Ďalej j
Ak je iScore = 3 potom
Ukončiť funkciu
Koniec Ak
Ďalej i
Prvá vec, ktorú si treba všimnúť, je, že prvé počítadlo indexov i počíta riadky, zatiaľ čo druhé j sa počíta cez stĺpce. Vonkajšia slučka sa potom jednoducho presunie z jedného radu do druhého. Vnútorná slučka počíta 1 v aktuálnom riadku. Ak sú tri, máte víťaza.
Všimnite si, že sledujete aj celkový počet testovaných štvorcov v premennej CheckWin, čo je hodnota odovzdaná späť po ukončení tejto funkcie. Každá výherná kombinácia skončí v CheckWin s jedinečnou hodnotou od 0 do 7, ktorá sa používa na výber jedného z prvkov v poli komponentov linWin (). Preto je dôležité aj poradie kódu vo funkcii CheckWin! Ak ste presunuli jeden z blokov slučkový kód (podobne ako ten vyššie), keď niekto vyhrá, bude na hracej mriežke nakreslená nesprávna čiara. Vyskúšajte to a uvidíte!
Podrobnosti o dokončení
Jediným doteraz diskutovaným kódom je podprogram pre novú hru a podprogram, ktorý vynuluje skóre. Zvyšok logiky v systéme robí ich vytváranie pomerne ľahkými. Ak chcete začať novú hru, musíte zavolať iba podprogram InitPlayGround. Ako výhodu pre hráčov, keďže na tlačidlo bolo možné kliknúť uprostred hry, pred pokračovaním požiadate o potvrdenie. Pred reštartovaním tabuľky výsledkov tiež požiadajte o potvrdenie.