Programování počítačové hry může být technicky nejnáročnější (a možná nejlépe placenou) prací, kterou programátor může mít. Hry nejvyšší úrovně vyžadují to nejlepší od programátorů i počítačů.
Visual Basic 6 byl nyní důkladně přemostěn jako platforma pro programování her. (Nikdy to tak opravdu nebylo. Dokonce ani v „dobrých dnech“ by seriózní herní programátoři nikdy nepoužívali jazyk na vysoké úrovni, jako je VB 6, protože se vám prostě nedařilo špičkový výkon, který většina her vyžaduje.) Ale jednoduchá hra „Tic Tac Toe“ je skvělým úvodem do programování, který je trochu pokročilejší než "Ahoj světe!"
Toto je skvělý úvod do mnoha základních pojmů programování, protože kombinuje techniky včetně:
- Použití pole. Značky X a O jsou drženy v samostatných polích a celá pole jsou předávána mezi funkcemi, aby se sledoval průběh hry.
- Použití grafiky na úrovni VB 6: VB 6 nenabízí skvělé grafické možnosti, ale hra je dobrým úvodem k tomu, co je k dispozici. Většina ze zbytku této série je zkoumáním toho, jak GDI +, další generace grafiky společnosti Microsoft, nahrazuje grafiku na úrovni VB 6.
- Použití matematických výpočtů pro řízení programu: Program používá chytré modulo (Mod) a celé číslo výpočty dělení pomocí polí dvou herních značek určují, kdy má tři prvky „výhru“ došlo.
Třída programování v tomto článku je možná jen trochu za počáteční úrovní, ale měla by být dobrá pro „středně pokročilé“ programátory. Začněme ale na základní úrovni, abychom ilustrovali některé z konceptů a začali s tím Visual Basic kariéra programování her. Dokonce i studenti pokročilejší, než by se mohlo zdát, že je trochu náročné získat objekty ve formě v pořádku.
Jak hrát Tic Tac Toe
Pokud jste nikdy nehráli Piškvorky, tady jsou pravidla. Dva hráči se střídají při umisťování Xs a Os do 3 x 3 hřiště.
Před začátkem hry se musí oba hráči dohodnout, kdo bude první a kdo označí své pohyby tímto symbolem. Po prvním tahu hráči střídavě umístí své značky do prázdné buňky. Cílem hry je být prvním hráčem se třemi značkami v horizontální, diagonální nebo vertikální linii. Pokud nejsou prázdné buňky a žádný z hráčů nemá výherní kombinaci, je hra remíza.
Před zahájením jakéhokoli skutečného kódování je vždy vhodné změnit názvy všech použitých komponent. Jakmile začnete kódování, bude název automaticky používán v jazyce Visual Basic, takže chcete, aby to bylo správné jméno. Použijeme jméno formuláře frmTicTacToe a také změníme titulek na „O Tic Tac Toe.“
Po vytvoření formuláře můžete pomocí ovládacího panelu nástrojů čáry nakreslit mřížku 3 x 3. Klikněte na nástroj čar a poté nakreslete čáru, kam chcete. Budete muset vytvořit čtyři řádky tímto způsobem a upravit jejich délku a polohu tak, aby vypadaly správně. Visual Basic také obsahuje některé užitečné nástroje v nabídce Formát, které vám pomohou. Je to skvělá šance na praktikování s nimi.
Kromě hrací mřížky budeme potřebovat také některé objekty pro symboly X a O, které budou umístěny na mřížku. Protože v mřížce je devět mezer, vytvoříme pole objektů s devíti mezerami, které se v jazyce Visual Basic nazývají elementy.
Existuje několik způsobů, jak dělat téměř všechno ve vývojovém prostředí jazyka Visual Basic, a vytváření kontrolních polí není výjimkou. Pravděpodobně nejjednodušší je vytvořit první štítek (kliknout a nakreslit stejně jako řádkový nástroj), pojmenovat jej, nastavit všechny atributy (například Font a ForeColor) a poté jej zkopírovat. VB 6 se zeptá, zda chcete vytvořit kontrolní pole. Jako první štítek použijte název lblPlayGround.
Chcete-li vytvořit dalších osm prvků mřížky, vyberte první objekt štítku, nastavte vlastnost Index na nulu a stiskněte klávesy CTRL + C (kopie). Nyní můžete stisknutím kláves CTRL + V (vložit) vytvořit další objekt štítků. Když kopírujete objekty jako je tato, každá kopie zdědí všechny vlastnosti kromě indexu z první. Index se zvýší o jednu pro každou kopii. Toto je kontrolní pole, protože všechny mají stejný název, ale různé hodnoty indexu.
Pokud vytvoříte pole tímto způsobem, budou všechny kopie naskládány na sebe v levém horním rohu formuláře. Přetáhněte jednotlivé štítky na jednu z pozic hrací mřížky. Ujistěte se, že hodnoty indexu jsou v mřížce sekvenční. Logika programu závisí na tom. Objekt štítku s hodnotou indexu 0 by měl být v levém horním rohu a pravý dolní popisek by měl mít index 8. Pokud štítky pokrývají hrací mřížku, vyberte jednotlivé štítky, klepněte pravým tlačítkem a vyberte Odeslat zpět.
Protože existuje osm možných způsobů, jak vyhrát hru, budeme potřebovat osm různých řádků, abychom ukázali výhru na hrací ploše. Stejnou technikou vytvoříte další ovládací pole. Nejprve nakreslete čáru, pojmenujte ji linWin a nastavte vlastnost Index na nulu. Poté pomocí techniky kopírování a vložení vytvořte dalších sedm řádků. Následující obrázek ukazuje, jak správně nastavit indexová čísla.
Kromě popisků a řádkových objektů potřebujete k ovládání hry některá příkazová tlačítka a další štítky, abyste udrželi skóre. Kroky k jejich vytvoření zde nejsou podrobně popsány, ale jedná se o objekty, které potřebujete.
Dvě tlačítka objekty:
- cmdNewGame
- cmdResetScore
Rámový objekt fraPlayFirst obsahující dvě přepínací tlačítka:
- optXPlayer
- optoplayer
Rámový objekt fraScoreBoard obsahující šest štítků. V programovém kódu se změní pouze lblXScore a lblOScore.
- lblX
- lblXScore
- lblO
- lblOScore
- lblMinus
- lblColon
Nakonec budete také potřebovat objekt label lblStartMsg, který „maskuje“ tlačítko cmdNewGame, když na něj nelze kliknout. To není vidět na obrázku níže, protože zabírá stejný prostor ve formuláři jako příkazové tlačítko. Možná budete muset dočasně přesunout příkazové tlačítko k nakreslení tohoto štítku na formuláři.
Zatím nebylo provedeno žádné kódování VB, ale jsme na to konečně připraveni.
Inicializace
Nyní můžete konečně začít programovat program. Pokud jste tak již neučinili, možná budete chtít stáhnout zdrojový kód, který bude následovat, jak bude vysvětlena funkce programu.
Jedním z prvních rozhodnutí o designu je, jak sledovat aktuální „stav“ hry. Jinými slovy, jaké jsou současné Xs a O na hrací mřížce a kdo se pohybuje dále. Koncept „stavu“ je v mnoha programování kritický a zejména je důležitý při programování ASP a ASP.NET pro web
Existuje několik způsobů, jak toho lze dosáhnout, takže je to kritický krok v analýze. Pokud jste tento problém řešili sami, možná budete chtít nakreslit vývojový diagram a před zahájením jakéhokoli kódování vyzkoušet různé možnosti pomocí „stíracího papíru“.
Naše řešení používá dvě "dvojrozměrná pole", protože to pomáhá sledovat 'stav' jednoduše změnou indexů matic v programových smyčkách. Stav levého horního rohu bude v prvku pole s indexem (1, 1), pravý horní roh bude v (1, 3), pravý dolní v (3,3) atd.. Jsou to dvě pole, která:
iXPos (x, y)
a
iOPos (x, y)
Existuje mnoho různých způsobů, jak toho lze dosáhnout a konečné řešení VB.NET v této sérii vám ukáže, jak to udělat pomocí jediného jednorozměrného pole.
Programování, které převádí tato pole do rozhodnutí o výhře hráče a viditelných zobrazení ve formuláři, je na následující stránce.
Dále potřebujete několik globálních proměnných. Všimněte si, že jsou uvedeny v kódu Obecné a Prohlášení pro daný formulář. To je činí "úroveň modulu" proměnné, na které lze v tomto formuláři odkazovat kdekoli. Další informace naleznete v tématu Porozumění rozsahu proměnných v nápovědě jazyka.
V našem programu jsou inicializovány proměnné ve dvou oblastech. Nejprve se inicializuje několik proměnných, zatímco se načítá formulář frmTicTacToe.
Private Sub Form_Load ()
Za druhé, před každou novou hrou jsou všechny proměnné, které je třeba resetovat na výchozí hodnoty, přiřazeny v inicializačním podprogramu.
Sub InitPlayGround ()
Všimněte si, že inicializace načtení formuláře také volá inicializaci hřiště.
Jednou z kritických dovedností programátora je schopnost používat ladicí zařízení k pochopení toho, co kód dělá. Tento program můžete použít k vyzkoušení:
- Procházení kódu klávesou F8
- Nastavení sledování klíčových proměnných, jako je sPlaySign nebo iMove
Nastavení bodu přerušení a dotazování na hodnotu proměnných. Například ve vnitřní smyčce inicializace:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""
Všimněte si, že tento program jasně ukazuje, proč je dobrým programovacím postupem uchovávat data v polích, kdykoli je to možné. Pokud byste v tomto programu neměli pole, měli byste napsat kód něco podobného:
Line0.Visible = False
Line1.Visible = False
Line2.Visible = False
Line3.Visible = False
Line4.Visible = False
Line5.Visible = False
Line6.Visible = False
Line7.Visible = False
Místo toho:
Pro i = 0 až 7
linWin (i) .Visible = False
Příště já
Provedení tahu
Pokud lze jakoukoli část systému považovat za „srdce“, jedná se o podprogram lblPlayGround_Click. Tato podprogram se nazývá pokaždé, když hráč klikne na hrací mřížku. (Kliknutí musí být uvnitř jednoho z devíti prvků lblPlayGround.) Všimněte si, že tento podprogram obsahuje argument: (Index As Integer). Většina ostatních „podprogramů událostí“, například cmdNewGame_Click (), ne. Index označuje, na který objekt štítku byl kliknut. Například index by obsahoval hodnotu nula pro levý horní roh mřížky a hodnotu osm pro pravý dolní roh.
Poté, co hráč klikne na čtverec v mřížce hry, je příkazové tlačítko pro spuštění další hry cmdNewGame „zapnuto“ tím, že je zviditelněno. Stav tohoto příkazového tlačítka zdvojnásobí povinnost, protože se později v programu používá také jako logická proměnná rozhodnutí. Používání hodnoty vlastnosti jako rozhodovací proměnné se obvykle nedoporučuje, protože pokud je někdy nutné změnit program (řekněme například, aby se příkazové tlačítko cmdNewGame viditelné po celou dobu), pak program neočekávaně selže, protože si nemusíte pamatovat, že je také používán jako součást programu logika. Z tohoto důvodu je vždy vhodné prohledat programový kód a zkontrolovat použití všeho, co změníte při provádění údržby programu, dokonce i hodnot vlastností. Tento program toto pravidlo částečně porušuje, částečně proto, že se jedná o relativně jednoduchý kus kódu, kde je snazší zjistit, co se děje, a později se problémům vyhnout.
Výběr hráče z herního čtverce je zpracován voláním podprogramu GamePlay s argumentem Index.
Zpracování přesunu
Nejprve zkontrolujete, zda nebylo kliknuto na neobsazený čtverec.
Pokud lblPlayGround (xo_Move) .Caption = "" Pak
Jakmile jsme si jisti, že se jedná o legitimní tah, počítadlo tahů (iMove) se zvýší. Další dvě řádky jsou velmi zajímavé, protože překládají souřadnice z jednorozměrné Pokud pole komponent lblPlayGround obsahuje dvourozměrné indexy, které můžete použít v iXPos nebo iOPos. Dělení modů a celých čísel („zpětné lomítko“) jsou matematické operace, které nepoužíváte každý den, ale zde je skvělý příklad ukazující, jak mohou být velmi užitečné.
Pokud lblPlayGround (xo_Move) .Caption = "" Pak
iMove = iMove + 1
x = Int (xo_Move / 3) + 1
y = (xo_Move Mod 3) + 1
Hodnota xo_Move 0 bude převedena na (1, 1), 1 na (1, 2)... 3 až (2, 1)... 8 až (3, 3).
Hodnota v sPlaySign, proměnná s rozsahem modulu, sleduje, který hráč provedl tah. Jakmile jsou pole přesunu aktualizovány, mohou být komponenty štítků v hraní mřížky aktualizovány příslušným znaménkem.
Pokud sPlaySign = "O", pak
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
Jiný
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
Konec If
lblPlayGround (xo_Move) .Caption = sPlaySign
Například, když hráč X klikne na levý horní roh mřížky, proměnné budou mít následující hodnoty:
Uživatelská obrazovka zobrazuje pouze X v levém horním poli, zatímco iXPos má 1 v levém horním poli a 0 ve všech ostatních. IOPos má 0 v každém poli.
Hodnoty se změní, když hráč O klepne na středový čtverec mřížky. Nyní iOPos ukazuje 1 ve středním poli, zatímco uživatelská obrazovka ukazuje X v levém horním rohu a O ve středovém poli. IXPos zobrazuje pouze 1 v levém horním rohu a 0 ve všech ostatních polích.
Nyní, když víte, kde hráč klikl, a který hráč klikl (pomocí hodnoty v sPlaySign), vše, co musíte udělat, je zjistit, zda někdo vyhrál hru, a zjistit, jak ukázat, že v Zobrazit.
Hledání vítěze
Po každém tahu zkontroluje funkce CheckWin výherní kombinaci. CheckWin funguje přidáním každého řádku dolů přes každý sloupec a skrz každou úhlopříčku. Sledování kroků pomocí CheckWin pomocí funkce ladění jazyka může být velmi vzdělávací. Najít výhru je věcí první, ověření, zda byly při každé z jednotlivých kontrol v proměnné iScore nalezeny tři 1, a poté vrací jedinečnou hodnotu „podpisu“ v Checkwin, která se používá jako index pole ke změně vlastnosti Visible jednoho prvku v linWin pole komponent. Pokud není vítěze, bude CheckWin obsahovat hodnotu -1. Je-li vítěz, aktualizuje se zobrazení, změní se výsledková tabulka, zobrazí se gratulační zpráva a hra se restartuje.
Podívejme se podrobně na jednu z kontrol a uvidíme, jak to funguje. Ostatní jsou si podobné.
„Zkontrolujte řádky na 3
Pro i = 1 až 3
iScore = 0
CheckWin = CheckWin + 1
Pro j = 1 až 3
iScore = iScore + iPos (i, j)
Další j
Pokud je iScore = 3, pak
Ukončete funkci
Konec If
Příště já
První věc, kterou si všimnete, je, že první počítadlo indexů i odpočítává řádky, zatímco druhé j se počítá přes sloupce. Vnější smyčka se pak jednoduše přesune z jedné řady do druhé. Vnitřní smyčka počítá 1 v aktuálním řádku. Pokud jsou tři, máte vítěze.
Všimněte si, že také sledujete celkový počet testovaných čtverců v proměnné CheckWin, což je hodnota předaná zpět při ukončení této funkce. Každá výherní kombinace skončí s jedinečnou hodnotou v CheckWin od 0 do 7, která se používá k výběru jednoho z prvků v poli komponenty linWin (). Proto je důležité i pořadí kódu ve funkci CheckWin! Pokud jste přesunuli jeden z bloků kód smyčky (stejně jako ten výše) by byla špatná čára nakreslena na hrací mřížce, když někdo vyhraje. Vyzkoušejte to a uvidíte!
Podrobnosti o dokončení
Jediným dosud diskutovaným kódem je podprogram pro novou hru a podprogram, který vynuluje skóre. Zbytek logiky v systému dělá jejich vytvoření docela snadné. Chcete-li zahájit novou hru, musíte zavolat pouze podprogram InitPlayGround. Pro pohodlí hráčů, protože na tlačítko bylo možné kliknout uprostřed hry, požádáte o potvrzení před pokračováním. Před restartováním výsledkové tabulky si také vyžádejte potvrzení.