Krugovi

Kako napisati Tic-Tac-Toe program u Javi: 10 koraka

Tic Tac Toe Java Game - Build a Tic Tac Toe Game in 30 Minutes

Tic Tac Toe Java Game - Build a Tic Tac Toe Game in 30 Minutes

Sadržaj:

Anonim

Uvod:

Tic-Tac-Toe je vrlo uobičajena igra koja se prilično lako igra. Pravila igre su jednostavna i dobro poznata. Zbog tih stvari, Tic-Tac-Toe je prilično lako kodirati. U ovom vodiču ćemo istražiti kako kodirati radnu igru ​​Tic-Tac-Toe u Javi. Ovaj vodič pretpostavlja da imate znanje o osnovnoj sintaksi Jave i pristupu radnom Java prevodiocu. Ovaj vodič će koristiti Eclipse IDE.

Opći pregled:
Postoji mnogo načina za implementaciju igre Tic-Tac-Toe u Javi, tako da prije nego što počnemo kodiranje, moramo razmišljati o tome kako ćemo konkretno implementirati igru. Za ovaj vodič ćemo kodirati tekstualnu verziju Tic-Tac-Toe. Naši Tic-Tac-Toe će početi ispisivanjem ploče, a zatim će tražiti unos od prvog igrača koji će odrediti gdje se na ploči nalazi oznaka igrača. Nakon postavljanja oznake, ponovno ćemo ispisati stanje ploče i onda zamoliti drugog igrača da se pomakne. Taj će se postupak nastaviti sve dok jedan igrač ne pobijedi ili se ploča ne popuni (što znači da je došlo do izjednačenja). Unos koji će se uzeti da bi se odredilo gdje će se staviti oznaka bit će u obliku dva cijela broja, koji određuju red i stupac u kojem će se oznaka smjestiti. U nastavku se nalazi primjer onoga što će igra igrati.

Pribor:

Korak 1: Izrada projekta

Prvi korak kodiranja je da napravite novi projekt! U svom IDE-u napravite novi Java projekt pod nazivom TicTacToe. U ovom Instructable, zadani paket je ono što će se koristiti. Unutar vašeg projektnog paketa stvorite dvije klase: Main.java i TTT.java. Main.java će ugostiti glavnu metodu i koristit će se za pokretanje koda u TTT.java. TTT.java će sadržavati Tic-Tac-Toe objekt koji sadrži stanje ploče i metode za manipulaciju igrom.

Korak 2: Pokretanje klase TTT

Prije nego što možemo napraviti kod za pokretanje našeg TTT objekta, moramo stvoriti radni TTT objekt. Budući da TTT objekt predstavlja jednu igru ​​Tic-Tac-Toe, ona mora sadržavati dvije varijable člana. U nastavku se nalaze varijable članice koje treba smjestiti u TTT klasu nakon čega slijedi opis zašto su potrebne.

privatna tabla ;

Ova varijabla je dvodimenzionalni niz znakova koji će predstavljati tri-tri ploče igre Tic-Tac-Toe. Zadržat će stanje igre unutar TTT objekta u bilo kojem trenutku.

privatni char currentPlayerMark;

Ta će varijabla sadržavati ili "x" ili "o", što predstavlja skretanje igrača u bilo kojem trenutku. Metode TTT klase će to upotrijebiti prilikom označavanja ploče kako bi se odredilo koja će vrsta oznake biti postavljena.

Korak 3: Pokretanje prototipa metode u klasi TTT

Slijedi opća postavka programa. U nastavku se nalaze sva zaglavlja metoda za metode koje pripadaju unutar TTT klase. Ove metode će djelovati prema varijablama članova klase TTT kako bi se igra Tic-Tac-Toe promijenila. Svaki od njih ima kratak opis onoga što će metoda raditi pod njom. Takva ponašanja nužna su za igranje pune igre Tic-Tac-Toe.

javni TTT ()

Ovo je konstruktor. On će biti odgovoran za ispravno pokretanje ploče i za postavljanje tko će biti prvi igrač.

public void initializeBoard ()

Ova metoda će inicijalizirati varijablu ploče tako da su sva mjesta prazna.

public void printBoard ()

Ova metoda će ispisati Tic-Tac-Toe ploču na standardni izlaz.

javni boolean isBoardFull ()

Ova metoda provjerava je li ploča puna ili ne. Vratit će se istina ako je ploča puna i ako je inače pogrešno.

javna boolean checkForWin ()

Ova metoda će provjeriti je li igrač pobijedio, a ako je tako, vratit će se istina.

privatna boolean checkRowsForWin ()

Ova metoda će posebno provjeriti redove za pobjedu.

privatna boolean checkColumnsForWin ()

Ova metoda će posebno provjeriti stupce za pobjedu.

privatna boolean checkDiagonalsForWin ()

Ova metoda će posebno provjeriti dijagonale za pobjedu.

privatna boolean checkRowCol (char c1, char c2, char c3)

Ova metoda provjerava tri navedena znaka preuzeta da bi se vidjelo jesu li sva tri ista slova "x" ili "o". Ako je tako, vratit će se istina.

Bilješka: Ako kodirate zaglavlje metoda za sve zaglavlja metoda u vašu TTT klasu, vaš će vas kompajler vjerojatno obavijestiti da vaš kod ima pogreške. Ovo je normalno. Kompajler jednostavno očekuje da će vrijednost biti vraćena za sve metode koje nisu void.

Korak 4: Inicijalizirajte odbor

public void initializeBoard ()

To će postaviti ploču na sve prazne vrijednosti. Unutar ove metode morate stvoriti 2 za petlje unutar jedne druge, koje će prelaziti kroz sve retke i stupce postavljajući svaki prostor na "-". Da biste prešli kroz retke, napravite petlju for i cijeli broj, u ovom slučaju pod nazivom i, koji će predstavljati redak koji trenutno promatramo.

za (int i = 0; i <3; i ++) {}

Unutar ovog za petlju, stvorit ćemo drugi za petlju s cijelim brojem j da bismo predstavili koji stupac trenutno promatramo.

za (int j = 0; j <3; j ++) {}

Unutar drugog kruga za petlju postavljamo mjesto na ploči na "-". Kada su obje petlje završene i pravilno ugniježđene, možemo ponoviti svako mjesto unutar 2D polja ploče.

ploča i j = '-';

Prilogu ovom koraku je slika koja prikazuje jednu moguću implementaciju metode initializeBoard ().

Korak 5: Ispis odbora

Početna ispisana ploča izgledat će kao prva slika.

Obrađivat će se metodom public void printBoard (), koja se nalazi u klasi TTT. Za ispis ploče moramo pristupiti svakom mjestu u 2D nizu imenovanom pločom u našoj TTT klasi. Budući da se radi o 2D nizu, to će se rješavati s ugniježđenim za petlje.

Prvo, samo trebamo ispisati crtu crtica (njih 13 u ovom slučaju) koja označavaju vrh ploče. Ispod toga, trebamo petlju za petlju koja će prolaziti kroz svaki od tri reda. Ova petlja će sadržavati poziv za ispis '|' znak, drugi za petlju kroz pet stupaca i poziv System.out.println () za ispis novog retka, a sljedećih 13 na zaslon.

Naša unutarnja petlja također će samo petljati kroz tri stupca. Budući da je naša vanjska petlja već ispisala prvu karakter svakog retka ploče, možemo ići naprijed za ispis karaktera koji pripada kutiji. Da bismo to učinili, ispisat ćemo znak u tom retku i stupcu koristeći ploču i j (i biti varijabla korištena za vanjsku petlju, koja je bila redak, a j je varijabla korištena za unutarnju petlju , koji je stupac.) Ovaj ispisni izraz će također sadržavati ulančanu | da biste razdvojili okvire.

Jedino što je preostalo je da ispišete posljednji poziv za ispis novog retka kako biste odvojili svaki redak, nakon čega slijedi 13 crtica. Druga priložena slika prikazuje primjer kako bi opisana funkcija ispisa mogla izgledati.

Korak 6: Provjera pobjednika (1. dio)

Postoje tri različite funkcije za provjeru pobjede: redovi, stupci i dijagonale. Računala ih moraju odvojiti u različite uvjete jer su svi različiti u smislu polja. checkForWin () će biti naša glavna funkcija za testiranje svih triju tih funkcija za svaki scenarij na koji je utjecao korisnički unos.

Za checkForWin () metodu: Jednostavno trebate povratni izraz koji poziva na tri različite funkcije. Ako provjera redaka za pobjedu ne vraća istinu, tada provjerite stupce za pobjedu, itd. Unutar povratnog izraza treba izgledati ovako: checkRowsForWin () || checkColumnsForWin () || checkDiagonalsForWin ()

Za checkRowsForWin () metodu: Prolazimo kroz redove da vidimo ima li pobjednika. To će zahtijevati jedan za petlju s if stavkom unutar njega. Petlja for for se povećava kroz cijeli broj i tako da provjerava svaki redak. za (int i = 0; i <3; i ++) Izjava if uspoređuje svaki prostor u redu jedan s drugim i daje "pravu" vrijednost ako su svi jednaki. Na primjer, ako je redak imao tri x-a u redu, metoda bi se vratila istina. ako (checkRowCol (ploča i 0, ploča i 1, ploča i 2) == true) Dakle, unutar ove if izjave, treba postojati: return true; Nakon petlje for, ako se metoda nikada ne zaustavi, tada se metoda treba vratiti tako da ovaj redak nije imao tri uzastopna podudarna simbola. Stoga, neposredno prije zatvaranja metode s konačnim} ’, napisati ćemo: return false; Zadovoljavanje potrebe za vraćanjem boolea.

Za checkColumnsForWin () metodu: Kopirajte i zalijepite sadržaj checkRowsForWin () metode. Jedina promjena bit će unutar naredbe if. Umjesto povećavanja redaka, povećat ćemo se kroz stupce. Dakle, dok u checkRowsForWin ima if izjavu koja kaže: if (checkRowCol (board i 0, board i 1, board i 2) == true) checkColumnsForWin () će imati if izjava koja kaže: if (checkRowCol (board 0 i, board 1 i, board 2 i) == true) Osim toga, sve ostalo u metodi ostaje isto.

Za checkDiagonalsForWin () metodu: Sve napisano može se nalaziti unutar zagrada return () izraza. Prva provjera koju ćemo obaviti je na dijagonali od gornjeg lijevog kuta do donjeg desnog kuta. Da bismo to učinili, provjeravamo sve prostore koji će biti uključeni u ovaj odjeljak. checkRowCol (ploča 0 0, ploča 1 1, ploča 2 2) == istina) Tada ćemo imati još jednu izjavu, ali ćemo razdvojiti dvije pomoću simbola ILI: ' || 'Druga izjava će se provjeriti od gornjeg desnog kuta do donjeg lijevog kuta. checkRowCol (ploča 0 2, ploča 1 1, ploča 2 0) == istina Dakle, vaš konačni proizvod metode checkDiagonalsForWin () trebao bi biti povratak (), a unutar njega treba sadržavati prvu izjavu ILI drugu izjavu.

Korak 7: Provjerite pobjednika (2. dio)

Sada moramo biti sigurni da ako igrač dobije tri za redom, on ili ona pobjeđuje. checkRowCol () će biti funkcija koja će uspoređivati ​​sva tri slova, a ako se podudaraju, vraća istinu.

Za checkRowCol () metodu: ovu metodu koriste druge metode za slanje dolje tri vrijednosti. Najprije provjerimo da prva vrijednost nije prazna, kao što je "-". Zatim usporedimo prvu vrijednost s drugom, a drugu s trećom, i ako i samo ako su sve tri vrijednosti iste I nisu prazne izjave, tada će se ova metoda vratiti istina. Dakle, unutar jedne izjave povratka (), naša prva izjava će provjeriti ovo nije "-".(c1! = '-') Odvojite prvi i drugi iskaz s & && ’. Druga izjava će vidjeti je li prva vrijednost jednaka drugoj vrijednosti. (c1 == c2) Odvojite drugu i treću izjavu s "& &". Treća izjava će vidjeti je li druga vrijednost jednaka trećoj. (c2 == c3) Dakle, vaša konačna metoda checkRowCol () bit će jedan return () koji sadrži prvu naredbu && drugu izjavu && treći izraz.

8. korak: promjena između igrača (x i O)

public void changePlayer ()

Metoda changePlayer () zamijenit će varijablu currentPlayerMark između x i o. Da biste to učinili, provjerite što varijabla trenutno ima. Ako varijabla drži 'x', promijenite je u 'o'. U suprotnom, promijenite ga u 'x'.

javno boolean placeMark (int red, int col)

Metoda placeMark () postavit će ispravno slovo na određeni redak i col u varijabli ploče (uzimajući kao parametre). Vraćat će se istinito ako je bio valjan položaj. Inače, neće se vršiti nikakva izmjena varijable na ploči, a igrač će morati pokušati staviti svoje slovo na drugo mjesto, jer je odabrano nevažeće mjesto ili mjesto gdje je igrač već postavio svoje slovo. Da bi se to postiglo, potrebno je provjeriti nekoliko stvari. Prvo, osigurajte (koristeći naredbu if) da je argument retka između 0 i 2. Zatim provjerite je li col argument bio između 0 i 2. Na kraju provjerite da li je dotično mjesto trenutno '- ', označavajući da nijedan platitelj još nije označio to mjesto. Ako se sva tri od ovih uvjeta odjavljuju, stavite oznaku (tip koji je specificiran s varijablom klasa currentPlayerMark) na mjestu specificiranom redom i colom, a zatim vratite true. Ako bilo koji od tri uvjeta nije zadovoljen, tada bi se trebalo dogoditi napomena, a pogrešno bi se trebalo vratiti.

U prilogu ovom koraku su slike koje prikazuju moguće implementacije gore spomenutih metoda.

Korak 9: Ulaz i reprodukcija igrača

Sada kada je završena TTT klasa i sve njezine metode, mora se stvoriti glavna metoda koja prolazi kroz cijelu igru ​​Tic-Tac-Toe koristeći TTT objekt. Glavna metoda mora učiniti dosta stvari kako bi se pokrenula puna igra Tic-Tac-Toe.

Prvo, on mora stvoriti objekt skenera koji će uzeti podatke iz System.in. Isto tako, on mora stvarati TTT objekt kako bi igrao Tic-Tac-Toe igru. Nakon toga mora inicijalizirati ploču TTT objekta tako što će nazvati metodu initializeBoard ().

Nakon što su ti koraci završeni, mora se uzeti u obzir stvarna igra. Za prolazak kroz skretanje potrebna je petlja do ne. Petlja bi trebala izbiti kada se igra završi, što znači kad god je ploča TTT objekta puna ili ima pobjednika. Unutar petlje, trenutačno stanje ploče mora biti ispisano prije svakog okreta tako da pokažete igraču koji su prostori dostupni i koje su prostorije zauzete. Zatim treba uzeti dva ulaza za označavanje retka i stupca kako bi se označio zaokret. Nakon što se unese taj unos, oznaka se postavlja metodom TTT objekta, a igrač se također mora mijenjati metodom TTT objekta.

Ispod one petlje koja obrađuje sve okrete do kraja igre, bit će potrebno prijaviti tko je pobjednik igre (ili ako je igra bila izjednačena). Da biste to učinili, provjerite je li igra prva izjednačena tako da provjerite je li i puna ploča puna i da nije bilo pobjednika. Ako su te stvari tako, onda ispišite da je igra bila kravata. Inače, ispišite tko je pobijedio ispisom suprotnog od trenutnog stanja trenutne varijable PlayPlayerMark objekta TTT. To se može postići tako da najprije pozovete metodu promjenePlayer () TTT objekta, a zatim pomoću metode getCurrentPlayerMark () TTT objekta dobijete stanje varijable currentPlayerMark. Također može biti lijepo ispisati ploču još jednom kako bi se prikazalo konačno stanje ploče.

Primjer glavne metode pridodan je kao slika.

Korak 10: Koristite klasu, kompajlirajte i pokrenite

Nakon što ste došli do ove točke, vaš projekt bi trebao biti dovoljan da se pokrene. Ako postoje pogreške ili nedostaju zagrade ili točke sa zarezom, sada bi bilo vrijeme da ih pronađete i popravite. Ako ste uopće izgubljeni u pogledu načina na koji bi vaš projekt trebao izgledati, uključili smo datoteku za preuzimanje za usporedbu koda s radnim konačnim proizvodom. Samo naprijed i sastavite svoj projekt. U Eclipseu se nalazi gumb za reprodukciju koji izgleda kao slika koja se pridružuje ovom koraku.