Crearea unui joc Tic-Tac-Toe în C++

Crearea Unui Joc Tic Tac Toe In C



Tic-tac-toe este un joc interesant, vechi și clasic, care a distrat generațiile. În tic-tac-toe, doi jucători concurează pe o grilă de 9 pătrate care este marcată cu un model hash. Fiecare jucător își ia rândul și plasează simbolul (O sau X) într-unul din pătratele goale. În acest articol, vom explora cum să creați un joc tic-tac-toe în limbajul de programare C++. Următorul exemplu vă va ghida prin construirea unui joc simplu, dar captivant, acoperind conceptele esențiale, defalcările codului și considerațiile pentru crearea unei experiențe de joc interactive.

Creați un joc Tic-Tac-Toe în C++

Următorul exemplu oferă elementele de bază pentru realizarea acestui joc interactiv pentru doi jucători. Prezintă o abordare simplă și ușoară a programării cu C++ și oferă un cod sursă bine documentat pentru a retrăi acele provocări din copilărie cu prietenii într-un format digital nou. Să vedem următorul cod.

Exemplu: Tic-Tac-Toe bazat pe consolă de bază fără a utiliza matricea 2D

În acest exemplu, vom folosi o matrice 2D, funcții și condiții if-else pentru a face jocul tic-tac-toe în C++. În acest joc, doi jucători au voie să introducă pe rând mișcările lor și determină starea jocului verificând un câștigător sau o egalitate. Vedeți următorul cod dat:







#include

folosind namespace std ;

gol desen ( char bord [ 3 ] [ 3 ] ) ;

bool isMoveValid ( char bord [ 3 ] [ 3 ] , int rând , int col ) ;

bool isBoardFull ( char bord [ 3 ] [ 3 ] ) ;

char checkWinner ( char bord [ 3 ] [ 3 ] ) ;

int principal ( ) {

char bord [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

int rând , col ;

char actualPlayer = 'X' ;

in timp ce ( Adevărat ) {

desen ( bord ) ;

cout << 'Jucător ' << actualPlayer << Rândul lui '. Introduceți rândul (1-3) și coloana (1-3): ' ;

mâncând >> rând >> col ;

rând --;

col --;

dacă ( isMoveValid ( bord , rând , col ) ) {

bord [ rând ] [ col ] = actualPlayer ;

char câştigător = checkWinner ( bord ) ;

dacă ( câştigător != ' ' ) {

desen ( bord ) ;

cout << 'Jucător ' << câştigător << „Este un câștigător! \n ' ;

pauză ;

}

dacă ( esteBoardFull ( bord ) ) {

desen ( bord ) ;

cout << 'Este o cravata! \n ' ;

pauză ;

}

actualPlayer = ( actualPlayer == 'X' ) ? 'O' : 'X' ;

} altfel {

cout << „Mutare nevalidă. Alegeți altă celulă. \n ' ;

} }

întoarcere 0 ;

}

gol desen ( char bord [ 3 ] [ 3 ] ) {

cout << „b| \t 1 \t | \t 2 \t | \t 3 \t | \n ' ;

cout << ' ______________________ \n ' ;

pentru ( int m = 0 ; m < 3 ; m ++ ) {

cout << m + 1 << '| ' ;

pentru ( int t = 0 ; t < 3 ; t ++ ) {

cout << '' << bord [ m ] [ t ] ;

dacă ( t < 2 ) cout << ' \t | \t ' ;

}

cout << ' \t | \n ' ;

dacă ( m < 2 ) cout << ' ______________________ \n ' ;

}

cout << ' \n ' ; }

bool isMoveValid ( char bord [ 3 ] [ 3 ] , int rând , int col ) {

întoarcere ( rând >= 0 && rând < 3 && col >= 0 && col < 3 && bord [ rând ] [ col ] == ' ' ) ;

}

bool isBoardFull ( char bord [ 3 ] [ 3 ] ) {

pentru ( int m = 0 ; m < 3 ; m ++ ) {

pentru ( int t = 0 ; t < 3 ; t ++ ) {

dacă ( bord [ m ] [ t ] == ' ' ) {

întoarcere fals ;

} } }

întoarcere Adevărat ; }

char checkWinner ( char bord [ 3 ] [ 3 ] ) {

pentru ( int m = 0 ; m < 3 ; m ++ ) {

dacă ( bord [ m ] [ 0 ] == bord [ m ] [ 1 ] && bord [ m ] [ 1 ] == bord [ m ] [ 2 ] && bord [ m ] [ 0 ] != ' ' ) {

întoarcere bord [ m ] [ 0 ] ;

}

dacă ( bord [ 0 ] [ m ] == bord [ 1 ] [ m ] && bord [ 1 ] [ m ] == bord [ 2 ] [ m ] && bord [ 0 ] [ m ] != ' ' ) {

întoarcere bord [ 0 ] [ m ] ;

} }

dacă ( bord [ 0 ] [ 0 ] == bord [ 1 ] [ 1 ] && bord [ 1 ] [ 1 ] == bord [ 2 ] [ 2 ] && bord [ 0 ] [ 0 ] != ' ' ) {

întoarcere bord [ 0 ] [ 0 ] ;

}

dacă ( bord [ 0 ] [ 2 ] == bord [ 1 ] [ 1 ] && bord [ 1 ] [ 1 ] == bord [ 2 ] [ 0 ] && bord [ 0 ] [ 2 ] != ' ' ) {

întoarcere bord [ 0 ] [ 2 ] ;

}

întoarcere ' ' ;

}

Iată o defalcare a funcționalității sale:



„#include ” este o directivă de preprocesor care include biblioteca de flux I/O pentru operațiunile de intrare/ieșire. Utilizarea „namespace std” permite utilizarea directă a funcțiilor cout, cin etc. într-un program C++, fără a necesita prefixul „std::”.



Există patru prototipuri de funcții în acest program – acestea sunt drawBoard(), isMoveValid(), isBoardFull() și checkWinner(). Declarația funcției este cunoscută ca prototip de funcție. Deși vine după funcția principală din program, va fi folosit. Funcția principală conține bucla de joc și logica pentru a gestiona turele și mișcările jucătorilor. În cadrul funcției principale, tabla de joc este inițializată cu spații.





char bord [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

După aceasta, două variabile rând și col sunt definite pentru a stoca intrarea de mișcare a jucătorului. „Car currentPlayer = ‘X’;” definește că jucătorul „X” merge primul.

Acum, bucla de joc while (adevărată) începe și se desfășoară până când există un câștigător sau o egalitate. Această buclă „while” apelează „drawBoard();” pentru a afișa tabla. După afișarea plăcii pe consolă, utilizatorului i se cere să aleagă o celulă de marcat în următoarea instrucțiune de cod:



cout << 'Jucător ' << actualPlayer << Rândul lui '. Introduceți rândul și coloana (1-3): ' ;

Jucătorul introduce mutarea în „cin >> row >> col;”.

La selectarea unei celule pentru marcare, programul va verifica mai întâi validitatea intrării, asigurându-se că celula nu este deja completată prin apelarea funcției isMoveValid().

bord [ rând ] [ col ] = actualPlayer ;

Această afirmație plasează marca jucătorului pe tablă.

char câştigător = checkWinner ( bord ) ;

dacă ( câştigător != ' ' ) {

desen ( bord ) ;

cout << 'Jucător ' << câştigător << ' câștigă! \n ' ;

Aceste declarații verifică un câștigător de fiecare dată când un jucător marchează o intrare pe tablă. Numele câștigătorului va fi anunțat dacă există un câștigător, iar programul va ieși din bucla de joc.

dacă ( esteBoardFull ( bord ) ) {

Această declarație verifică existența unei cravate. Condiția de egalitate apare într-un caz în care tabla este plină și nu există niciun câștigător. În acest caz, „Este o cravată!” este imprimat pe ecran.

actualPlayer = ( actualPlayer == 'X' ) ? 'O' : 'X' ;

Această declarație schimbă jucătorii pentru a oferi fiecărui jucător șansa de a-și juca rândul.

cout << „Mutare nevalidă. Alegeți altă celulă. \n ' ;

Dacă mutarea nu este validă, utilizatorului i se solicită să introducă din nou și să aleagă orice altă celulă.

După funcția „principală”, vor începe definițiile funcției pentru prototipurile de funcție care sunt declarate anterior. Prima funcție care este definită aici este drawBoard() care este folosită pentru a atrage panoul tic-tac-toe pe consolă. Funcția drawBoard() imprimă starea curentă a plăcii, inclusiv liniile de grilă.

Următoarea funcție care este definită aici este isMoveValid(). Această funcție este folosită pentru a determina dacă o mișcare este permisă atât în ​​interiorul tablei, cât și pe o celulă goală. Funcția isBoardFull() este folosită pentru a verifica dacă placa este încă plină. Aceasta este o condiție pentru o situație de egalitate când nu există un câștigător. IsBoardFull() verifică dacă toate pozițiile de pe tablă sunt ocupate, ceea ce indică o egalitate dacă nu există niciun câștigător. Dacă există un câștigător, acesta poate fi stabilit folosind funcția checkWinner(). CheckWinner() verifică toate liniile câștigătoare potențiale pentru nota aceluiași jucător („X” sau „O”) și returnează nota jucătorului câștigător dacă este găsită sau un spațiu „ ” dacă nu există încă niciun câștigător. Următorul este rezultatul programului. Afișează fiecare rând de la fiecare jucător.

În primul rând, placa este clară; jucătorului „X” i se cere să aleagă celula de marcat. Aici, jucătorul „X” introduce 2 și 2. Celulele rândului 2 și coloanei 2 sunt marcate. Consultați tabloul marcat în cele ce urmează:

Acum, este rândul jucătorului O. Jucătorul este rugat să aleagă o celulă de marcat. Jucătorul „O” alege 1 pentru rând și 1 pentru coloană. Celula aleasă este marcată pentru jucătorul „O”, așa cum se arată în următorul fragment de ieșire:

Toate turele pentru fiecare jucător vor urma același model. Este rândul jucătorului X, iar jucătorul alege 1 pentru rând și 2 pentru coloană. Consultați următoarele instantanee de ieșire date:

Acum, rândul este pentru jucătorul „O”. Jucătorul alege 1 pentru rând și 3 pentru coloană.

Următorul rând este din nou pentru jucătorul „X”. Jucătorul alege 3 pentru rând și 1 pentru coloană.

Jucătorul „O” alege 3 pentru rând și 2 pentru coloană.

Jucătorul „X” selectează al doilea rând și a treia coloană.

Jucătorul „O” selectează acum al doilea rând și prima coloană.

Jucătorul „X” alege al treilea rând și a treia coloană de data aceasta.

Niciun jucător nu poate face vreo linie orizontală, verticală sau diagonală, deci este o egalitate. Nu există niciun câștigător pentru gama de intrări aleasă.

În general, codul cuprinde o buclă principală de joc care este responsabilă pentru gestionarea stării jocului și a intrării utilizatorului, împreună cu mai multe funcții utilitare care sunt utilizate pentru a trage tabla, valida mutările, verifica dacă există o masă completă și determina dacă există un câștigător. .

Concluzie

Dezvoltarea unui joc tic-tac-toe folosind C++ este un exercițiu practic excelent pentru a vă consolida abilitățile de programare. Articolul explică cu exactitate cum să creați tic-tac-toe în C++. Îndrumarea pas cu pas oferită în acest articol a cuprins o matrice 2D, funcții și condiții dacă altfel, pentru ca cititorii să înțeleagă mecanica jocului, interacțiunile utilizatorului și structurarea eficientă a codului. Descrierea detaliată a codului și explicația funcțiilor care sunt cruciale pentru jocul de bază oferă cititorilor informații neprețuite atât asupra practicilor de programare C++, cât și asupra complexității dezvoltării unui joc simplu.