Programiranje Tic Tac Toe igre u Visual Basic

Programiranje računalne igrice može biti tehnički najzahtjevniji (i možda najbolje plaćeni) posao koji programer mogu imati. Igre vrhunske razine zahtijevaju najbolje i od programera i od računala.

Visual Basic 6 je sada potpuno zaobiđen kao platforma za programiranje igara. (To zapravo nikada nije bilo jedno. Čak i u "dobrim danima", ozbiljni programeri igara nikada ne bi koristili jezik visoke razine poput VB 6, jer jednostavno niste uspjeli doći do rezanja rubne performanse koje zahtijevaju većine igara.) Ali jednostavna igra "Tic Tac Toe" izvrstan je uvod u programiranje koje je malo naprednije od "Pozdrav svijete!"

Ovo je sjajan uvod u mnoge temeljne koncepte programiranja, jer kombinira tehnike koje uključuju:

  • Korištenje nizovi. Oznake X i O čuvaju se u zasebnim nizovima, a cijeli se niz prosljeđuje između funkcija radi praćenja napretka igre.
  • Korištenje grafike na razini VB 6: VB 6 ne nudi velike grafičke mogućnosti, ali igra je dobar uvod u ono što je dostupno. Veliki dio ostatka ove serije istražuje kako GDI +, nova generacija Microsoftove grafike, zamjenjuje grafiku na nivou VB 6.
    instagram viewer
  • Korištenje matematičkih izračuna za kontrolu programa: Program koristi pametne module (Mod) i cijeli broj izračunavanje podjele pomoću markiranih polja za dvije igre kako bi se utvrdilo kada je "pobjeda" od tri elementa dogodila.

Klasa programiranja u ovom članku možda je tek malo iznad početne razine, ali to bi trebalo biti dobro za "srednje" programere. No krenimo na osnovnoj razini da ilustriramo neke koncepte i započnite sa svojim Visual Basic karijera programiranja igara. Čak i učenici napredniji od toga mogu zaključiti da je pomalo izazovno doći do predmeta u obliku koji su upravo u pravu.

Kako igrati Tic Tac Toe

Ako nikad niste igrali Križić kružić, evo pravila. Dva igrača se izmjenjuju na mjestu Xs i Os u 3 x 3 igralište.

Prije početka igre, oba igrača moraju se dogovoriti tko će prijeći prvi i tko će označiti njegove poteze kojim simbolom. Nakon prvog poteza igrači naizmjence stavljaju svoje tragove u bilo koju praznu ćeliju. Cilj igre je biti prvi igrač s tri oznake u vodoravnoj, dijagonalnoj ili okomitoj liniji. Ako nema praznih ćelija i niti jedan igrač nema dobitnu kombinaciju, igra je nerešena.

Prije početka bilo kakvog stvarnog kodiranja, uvijek je dobra ideja promijeniti imena bilo kojih komponenti koje koristite. Jednom kad počnete šifriranje, Visual Basic će ime automatski koristiti tako da želite da to bude pravo ime. Upotrijebit ćemo naziv obrasca frmTicTacToe i također ćemo promijeniti naslov u "O Tic Tac Toe".

Uz uspostavljeni obrazac, pomoću crte kontrole s alatima crtajte 3 x 3 rešetke. Kliknite alat za liniju, a zatim nacrtajte liniju tamo gdje želite. Na ovaj način morat ćete stvoriti četiri linije i prilagoditi njihovu duljinu i položaj kako bi izgledali ispravno. Visual Basic također ima neke prikladne alate ispod izbornika Format koji će vam pomoći. Ovo je sjajna prilika za vježbanje s njima.

Pored rešetke za igranje, trebat će nam i neki predmeti za X i O simbole koji će biti postavljeni na rešetku. Budući da u mreži postoji devet razmaka, stvorit ćemo objektni niz s devet razmaka, nazvanih elementi u Visual Basic.

Postoji nekoliko načina da se sve postigne u razvojnom okruženju Visual Basic i stvaranje kontrolnih nizova nije iznimka. Vjerojatno je najlakši način stvoriti prvu naljepnicu (kliknite i nacrtajte baš poput alata za liniju), dodijelite joj naziv, postavite sve atribute (kao što su Font i ForeColor), a zatim ih napravite. VB 6 će vas pitati želite li stvoriti kontrolni niz. Za prvu oznaku upotrijebite naziv lblPlayGround.

Da biste stvorili ostalih osam elemenata rešetke, odaberite prvi objekt s oznakom, postavite svojstvo Index na nulu i pritisnite CTRL + C (kopiraj). Sada možete pritisnuti CTRL + V (zalijepiti) da biste stvorili još jedan objekt oznake. Kad kopirate objekte kao što je ovaj, svaka kopija naslijedit će sva svojstva osim indeksa od prvog. Indeks će se povećati za jedan za svaki primjerak. Ovo je kontrolni niz jer svi imaju isti naziv, ali različite vrijednosti indeksa.

Ako ovako stvorite niz, sve će se kopije naslagati jedna na drugu u gornjem lijevom kutu obrasca. Povucite svaku naljepnicu na jedno od položaja rešetke za reprodukciju. Pazite da su vrijednosti indeksa sekvencijalne u mreži. O tome ovisi logika programa. Objekt oznake sa vrijednošću indeksa 0 treba biti u gornjem lijevom kutu, a donja desna oznaka treba imati indeks 8. Ako naljepnice pokrivaju mrežu za reprodukciju, odaberite svaku naljepnicu, desnom tipkom miša i odaberite Pošalji natrag.

Budući da postoji osam mogućih načina za pobjedu u igri, trebat će nam osam različitih linija da bismo prikazali pobjedu na mrežnoj mreži. Istu ćete tehniku ​​koristiti za stvaranje drugog kontrolnog polja. Prvo nacrtajte liniju, imenovajte je linWin i postavite svojstvo Index na nulu. Zatim upotrijebite tehniku ​​copy-paste za izradu još sedam linija. Sljedeća ilustracija pokazuje kako pravilno postaviti brojeve indeksa.

Pored oznaka i linija linija, trebate nekoliko naredbenih gumba za igru ​​i više naljepnica kako biste postigli rezultat. Koraci za njihovo stvaranje ovdje nisu detaljno opisani, ali to su predmeti koji su vam potrebni.

Dva gumba objekti:

  • cmdNewGame
  • cmdResetScore

Objekt okvira fraPlayFirst sadrži dva gumba opcija:

  • optXPlayer
  • optOPlayer

FraScoreBoard okvira okvira koji sadrži šest oznaka. U programskom kodu mijenjaju se samo lblXScore i lblOScore.

  • lblX
  • lblXScore
  • lblO
  • lblOScore
  • lblMinus
  • lblColon

Konačno, trebate i objekt oznake lblStartMsg da biste "maskirali" gumb cmdNewGame kada ga ne treba kliknuti. To se ne vidi na donjoj slici jer zauzima isti prostor u obliku kao i naredbeni gumb. Možda ćete morati privremeno pomaknuti naredbeni gumb da biste nacrtali ovu oznaku na obrascu.

Za sada nije učinjeno VB kodiranje, ali konačno smo spremni za to.

Inicijalizacija

Sada morate konačno započeti kodiranje programa. Ako to još niste učinili, možda biste htjeli preuzeti izvorni kôd koji slijedi nakon objašnjavanja rada programa.

Jedna od prvih dizajnerskih odluka koju treba donijeti je kako pratiti trenutno 'stanje' u igri. Drugim riječima, koji su trenutni X i Os na mreži za reprodukciju i tko dalje. Koncept države je kritičan za puno programiranja, a posebno je važan u programiranju ASP-a i ASP.NET-a za web

Nekoliko je načina na koje bi se to moglo učiniti, pa je to presudan korak u analizi. Ako ste samostalno rješavali taj problem, možda biste trebali nacrtati dijagram toka i isprobati različite opcije sa 'grebanjem u papiru' prije nego što započnete bilo koje kodiranje.

Naše rješenje koristi dvije "dvodimenzionalne matrice", jer to pomaže u praćenju "stanja" jednostavnom promjenom indeksa matrice u programskim petljama. Stanje gornjeg lijevog kuta nalazit će se u elementu polja s indeksom (1, 1), gornji desni kut će biti u (1, 3), donji desni u (3,3), i tako dalje, Dva niza koja to čine su:

iXPos (x, y)

i

iOPos (x, y)

Postoji puno različitih načina na koje se to može učiniti, a konačno VB.NET rješenje u ovoj seriji pokazuje kako to učiniti sa samo jednim jednodimenzionalnim nizom.

Programi za prevođenje ovih nizova u odluke o pobjedi igrača i vidljivi prikazi u obrascu nalaze se na sljedećoj stranici.

Također vam je potrebno nekoliko globalnih varijabli kako slijedi. Primijetite da se one nalaze u Općem i Deklaracijskom kôdu za obrazac. To ih čini "razina modula" varijable na koje se ovaj obrazac može uputiti bilo gdje u kodu. Više o tome potražite u Razumijevanju opsega varijabli u Visual Basic pomoći.

Postoje dva područja u kojima se varijable inicijaliziraju u našem programu. Prvo se nekoliko varijabli inicijalizira dok se oblik frmTicTacToe učitava.

Private Sub Form_Load ()

Drugo, prije svake nove igre, sve se varijable koje trebaju vratiti na početne vrijednosti dodjeljuju u potprogramu za inicijalizaciju.

Sub InitPlayGround ()

Imajte na umu da inicijalizacija učitavanja obrasca također poziva inicijalizaciju igrališta.

Jedna od kritičnih vještina programera je sposobnost korištenja programa za uklanjanje pogrešaka da bi razumjeli o čemu se radi u kodu. Ovim programom možete isprobati:

  • Prolazak kroz kôd tipkom F8
  • Postavljanje sata na ključne varijable, poput sPlaySign ili iMove
    Postavljanje točke prekida i upit vrijednosti varijabli. Na primjer, u unutarnjoj petlji inicijalizacije:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""

Imajte na umu da ovaj program jasno pokazuje zašto je dobra programska praksa čuvati podatke u nizovima kad god je to moguće. Ako u ovom programu niste imali nizove, morali biste napisati kod ovako nešto:

Line0.Visible = netočno
Linija1.Visible = Lažno
Linija2.Visible = Lažno
Linija3.Visible = Lažno
Line4.Visible = Lažno
Linija5.Visible = Lažno
Linija6.Visible = netočno
Linija7.Visible = netočno

umjesto ovoga:

Za i = 0 do 7
linWin (i) .Visible = Lažno
Dalje ja

Pokretanje

Ako se bilo koji dio sustava može smatrati srcem, to je podprogram lblPlayGround_Click. Ova se podprograma poziva svaki put kada igrač klikne na mrežu za igranje. (Klikovi moraju biti unutar jednog od devet elemenata lblPlayGround.) Primjetite da ovaj podprogram ima argument: (Indeks kao cijeli broj). Većina ostalih "potprograma događaja", poput cmdNewGame_Click (), ne rade. Indeks označava na koji je objekt oznake kliknut. Na primjer, indeks bi sadržavao nulu za gornji lijevi kut rešetke i vrijednost osam za donji desni kut.

Nakon što igrač klikne kvadrat u mreži mreže, naredbeni gumb za pokretanje druge igre, cmdNewGame, "uključuje se" čineći ga vidljivim. Stanje ovog gumba naredbe dvostruko je potrebno jer se koristi i kao logična varijabla odluke kasnije u programu. Korištenje vrijednosti svojstva kao varijable odluke obično se obeshrabruje, jer ako ikad postane potrebno promijeniti program (recimo, na primjer, napraviti naredbeni gumb cmdNewGame vidljiv cijelo vrijeme), tada će program neočekivano uspjeti jer se možda ne sjećate da se koristi i kao dio programa logika. Iz tog razloga, uvijek je dobra pretraga programskog koda i provjeravanje korištenja bilo čega što promijenite tijekom održavanja programa, čak i vrijednosti svojstava. Ovaj program krši pravilo dijelom da se napravi ovo stajalište, a dijelom i zato što je ovo relativno jednostavan dio koda gdje je lakše vidjeti što se radi i kasnije izbjeći probleme.

Odabir igrača igračkog kvadrata obrađuje se pozivanjem podprograma GamePlay s argumentom Indexa.

Obrada poteza

Prvo provjerite je li kliknuo nezauzet kvadrat.

Ako je lblPlayGround (xo_Move) .Caption = "" Tada

Kad smo sigurni da je ovo legitiman potez, brojač poteza (iMove) se povećava. Sljedeća dva retka vrlo su zanimljiva jer prevode koordinate iz jednodimenzionalnog Ako se lblPlayGround komponenta nizuje na dvodimenzionalne indekse koje možete koristiti ili u iXPos ili iOPos. Mod i cijela podjela ('crta unatrag') matematičke su operacije koje ne koristite svaki dan, ali evo sjajnog primjera koji pokazuje kako mogu biti vrlo korisni.

Ako je lblPlayGround (xo_Move) .Caption = "" Tada
iMove = iMove + 1
x = Int (xo_Move / 3) + 1
y = (xo_Move Mod 3) + 1

Vrijednost xo_Move 0 bit će prevedena u (1, 1), 1 u (1, 2)... 3 do (2, 1)... 8 do (3, 3).

Vrijednost u sPlaySign, varijabli s opsegom modula, prati koji je igrač izveo potez. Nakon ažuriranja nizova za pomicanje, komponente naljepnica u mrežnoj mreži mogu se ažurirati odgovarajućim znakom.

Ako je sPlaySign = "O" Tada
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
Drugo
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
Završi ako
lblPlayGround (xo_Move) .Caption = sPlaySign

Na primjer, kada igrač X klikne gornji lijevi kut mreže, varijable će imati sljedeće vrijednosti:

Korisnički ekran prikazuje samo X u gornjem lijevom polju, dok iXPos ima 1 u gornjem lijevom polju i 0 u svim ostalim. IOPos ima 0 u svakom okviru.

Vrijednosti se mijenjaju kada O igrač klikne na srednji kvadrat rešetke. Sada iOPos prikazuje 1 u središnjem okviru, dok korisnički ekran prikazuje X u gornjem lijevom i O u središnjem okviru. IXPos prikazuje samo 1 u gornjem lijevom kutu, a 0 je u svim ostalim okvirima.

Sada kada znate gdje je igrač kliknuo i koji igrač je izvršio klikanje (koristeći vrijednost u sPlaySign), sve što morate učiniti je saznati je li netko pobijedio u igri i smisliti kako to pokazati u prikaz.

Pronalazak pobjednika

Nakon svakog poteza, funkcija CheckWin provjerava dobitnu kombinaciju. CheckWin djeluje dodavanjem svakog retka, preko svakog stupca i dijagonale. Praćenje koraka kroz CheckWin pomoću značajke za uklanjanje pogrešaka Visual Basic može biti vrlo edukativno. Pronalaženje pobjede prvo je provjeravanje jesu li pronađena tri broja oznake u svakoj pojedinačnoj provjeri u varijabli iScore, a zatim vraća jedinstvenu vrijednost "potpisa" u Checkwinu koji se koristi kao indeks polja za promjenu svojstva Visible jednog elementa u linWin-u niz komponenata. Ako nema pobjednika, CheckWin će sadržavati vrijednost -1. Ako je pobjednik, prikaz se ažurira, tablica se mijenja, prikazuje se čestitka i igra se ponovo pokreće.

Provjerimo detaljno jednu provjeru kako bismo vidjeli kako to funkcionira. Ostali su slični.

'Provjerite redove za 3
Za i = 1 do 3
iScore = 0
CheckWin = CheckWin + 1
Za j = 1 do 3
iScore = iScore + iPos (i, j)
Dalje j
Ako je iScore = 3 Tada
Izlaz iz funkcije
Završi ako
Dalje ja

Prvo što treba primijetiti je da prvi brojač indeksa i odbrojava redove, a drugi j broji preko stupaca. Vanjska petlja zatim jednostavno prelazi iz jednog reda u drugi. Unutarnja petlja broji oznake 1 u trenutnom redu. Ako su tri, onda imate pobjednika.

Napominjemo da također pratite ukupni broj kvadrata testiranih u varijabli CheckWin, koja je vrijednost poslata natrag kada funkcija prestane. Svaka dobitna kombinacija završit će jedinstvenom vrijednošću u CheckWin-u od 0 do 7 koja se koristi za odabir jednog od elemenata u nizu komponenti linWin (). Zbog toga je redoslijed koda u funkciji CheckWin također bitan! Ako ste premjestili jedan od blokova kod petlje (poput ove gore), pogrešna linija će se crtati na mreži za igru ​​kada netko pobijedi. Isprobajte i pogledajte!

Pojedinosti završne obrade

Jedini kod koji još nije raspravljen je potprogram za novu igru ​​i podprogram koji će resetirati rezultat. Ostatak logike u sustavu čini njihovo stvaranje vrlo jednostavnim. Da biste pokrenuli novu igru, morate samo pozvati InitPlayGround potprogram. Kao pogodnost za igrače budući da se na gumbu moglo kliknuti usred igre, tražite potvrdu prije nego što nastavite. Prije nego što ponovno pokrenete tablicu, također tražite potvrdu.

instagram story viewer