Creazione di un gioco Tic-Tac-Toe in C++

Creazione Di Un Gioco Tic Tac Toe In C



Il tris è un gioco interessante, antico e classico che ha intrattenuto generazioni. Nel tris, due giocatori competono su una griglia di 9 quadrati contrassegnata da uno schema hash. Ogni giocatore effettua il proprio turno e posiziona il simbolo (O o X) in una delle caselle vuote. In questo articolo esploreremo come creare un gioco di tris nel linguaggio di programmazione C++. L'esempio seguente ti guiderà attraverso la creazione di un gioco di tris semplice ma coinvolgente, coprendo i concetti essenziali, le suddivisioni del codice e le considerazioni per la creazione di un'esperienza di gioco interattiva.

Crea un gioco Tic-Tac-Toe in C++

L'esempio seguente fornisce le nozioni di base per realizzare questo gioco interattivo di tris a due giocatori. Mostra un approccio semplice e facile alla programmazione con C++ e fornisce un codice sorgente ben documentato per rivivere le sfide dell'infanzia con gli amici in un nuovo formato digitale. Vediamo il codice seguente.

Esempio: Tic-Tac-Toe basato su console di base senza utilizzare l'array 2D

In questo esempio utilizzeremo un array 2D, funzioni e condizioni if-else per creare il gioco del tris in C++. In questo gioco, due giocatori possono, a turno, inserire le proprie mosse e determinare lo stato del gioco controllando un vincitore o un pareggio. Vedere il seguente codice indicato:







#include

utilizzando lo spazio dei nomi std ;

vuoto drawBoard ( car asse [ 3 ] [ 3 ] ) ;

bool isMoveValid ( car asse [ 3 ] [ 3 ] , int riga , int col ) ;

bool èBoardFull ( car asse [ 3 ] [ 3 ] ) ;

car checkWinner ( car asse [ 3 ] [ 3 ] ) ;

int principale ( ) {

car asse [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

int riga , col ;

car currentPlayer = 'X' ;

Mentre ( VERO ) {

drawBoard ( asse ) ;

cout << 'Giocatore ' << currentPlayer << È il turno di '. Inserisci la riga (1-3) e la colonna (1-3): ' ;

mangiare >> riga >> col ;

riga --;

col --;

Se ( isMoveValid ( asse , riga , col ) ) {

asse [ riga ] [ col ] = currentPlayer ;

car vincitore = checkWinner ( asse ) ;

Se ( vincitore != ' ' ) {

drawBoard ( asse ) ;

cout << 'Giocatore ' << vincitore << 'è un vincitore! \N ' ;

rottura ;

}

Se ( èBoardFull ( asse ) ) {

drawBoard ( asse ) ;

cout << 'È una cravatta! \N ' ;

rottura ;

}

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

} altro {

cout << 'Mossa non valida. Scegli un'altra cella. \N ' ;

} }

ritorno 0 ;

}

vuoto drawBoard ( car asse [ 3 ] [ 3 ] ) {

cout << 'b| \T 1 \T | \T 2 \T | \T 3 \T | \N ' ;

cout << '______________________ \N ' ;

per ( int M = 0 ; M < 3 ; M ++ ) {

cout << M + 1 << '| ' ;

per ( int T = 0 ; T < 3 ; T ++ ) {

cout << '' << asse [ M ] [ T ] ;

Se ( T < 2 ) cout << ' \T | \T ' ;

}

cout << ' \T | \N ' ;

Se ( M < 2 ) cout << '______________________ \N ' ;

}

cout << ' \N ' ; }

bool isMoveValid ( car asse [ 3 ] [ 3 ] , int riga , int col ) {

ritorno ( riga >= 0 && riga < 3 && col >= 0 && col < 3 && asse [ riga ] [ col ] == ' ' ) ;

}

bool èBoardFull ( car asse [ 3 ] [ 3 ] ) {

per ( int M = 0 ; M < 3 ; M ++ ) {

per ( int T = 0 ; T < 3 ; T ++ ) {

Se ( asse [ M ] [ T ] == ' ' ) {

ritorno falso ;

} } }

ritorno VERO ; }

car checkWinner ( car asse [ 3 ] [ 3 ] ) {

per ( int M = 0 ; M < 3 ; M ++ ) {

Se ( asse [ M ] [ 0 ] == asse [ M ] [ 1 ] && asse [ M ] [ 1 ] == asse [ M ] [ 2 ] && asse [ M ] [ 0 ] != ' ' ) {

ritorno asse [ M ] [ 0 ] ;

}

Se ( asse [ 0 ] [ M ] == asse [ 1 ] [ M ] && asse [ 1 ] [ M ] == asse [ 2 ] [ M ] && asse [ 0 ] [ M ] != ' ' ) {

ritorno asse [ 0 ] [ M ] ;

} }

Se ( asse [ 0 ] [ 0 ] == asse [ 1 ] [ 1 ] && asse [ 1 ] [ 1 ] == asse [ 2 ] [ 2 ] && asse [ 0 ] [ 0 ] != ' ' ) {

ritorno asse [ 0 ] [ 0 ] ;

}

Se ( asse [ 0 ] [ 2 ] == asse [ 1 ] [ 1 ] && asse [ 1 ] [ 1 ] == asse [ 2 ] [ 0 ] && asse [ 0 ] [ 2 ] != ' ' ) {

ritorno asse [ 0 ] [ 2 ] ;

}

ritorno ' ' ;

}

Ecco una ripartizione delle sue funzionalità:



'#include ' è una direttiva del preprocessore che include la libreria del flusso I/O per le operazioni di input/output. L'uso del “namespace std” consente l'uso diretto delle funzioni cout, cin, ecc. in un programma C++, senza richiedere il “prefisso std::”.



Ci sono quattro prototipi di funzioni in questo programma: sono drawBoard(), isMoveValid(), isBoardFull() e checkWinner(). La dichiarazione di funzione è nota come prototipo di funzione. Anche se viene dopo la funzione principale del programma, verrà utilizzata. La funzione principale contiene il loop del gioco e la logica per gestire i turni e le mosse dei giocatori. All'interno della funzione principale, il tabellone di gioco viene inizializzato con spazi.





car asse [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

Successivamente, vengono definite due variabili riga e colonna per memorizzare l'input di mossa del giocatore. Il 'char currentPlayer = 'X';' definisce che il giocatore “X” inizia per primo.

Ora inizia il ciclo di gioco while (vero) e continua finché non c'è un vincitore o un pareggio. Questo ciclo 'mentre' chiama 'drawBoard();' per visualizzare la scheda. Dopo aver visualizzato la scheda sulla console, all'utente viene chiesto di scegliere una cella da contrassegnare nella seguente istruzione di codice:



cout << 'Giocatore ' << currentPlayer << È il turno di '. Inserisci riga e colonna (1-3): ' ;

Il giocatore inserisce la propria mossa in “cin >> riga >> col;”.

Dopo aver selezionato una cella da contrassegnare, il programma verificherà innanzitutto la validità dell'input, assicurandosi che la cella non sia già riempita chiamando la funzione isMoveValid().

asse [ riga ] [ col ] = currentPlayer ;

Questa affermazione posiziona il segno del giocatore sul tabellone.

car vincitore = checkWinner ( asse ) ;

Se ( vincitore != ' ' ) {

drawBoard ( asse ) ;

cout << 'Giocatore ' << vincitore << 'vince! \N ' ;

Queste affermazioni verificano la presenza di un vincitore ogni volta che un giocatore segna una voce sul tabellone. Se c'è un vincitore, verrà annunciato il nome del vincitore e il programma uscirà dal ciclo di gioco.

Se ( èBoardFull ( asse ) ) {

Questa affermazione verifica la parità. La condizione di parità si verifica nel caso in cui il tabellone è pieno e non c'è nessun vincitore. In questo caso, “È un pareggio!” è stampato sullo schermo.

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

Questa affermazione cambia i giocatori per dare a ogni giocatore la possibilità di giocare il proprio turno.

cout << 'Mossa non valida. Scegli un'altra cella. \N ' ;

Se la mossa non è valida, all'utente viene richiesto di inserirla nuovamente e scegliere qualsiasi altra cella.

Dopo la funzione “main”, inizieranno le definizioni di funzione per i prototipi di funzione precedentemente dichiarati. La prima funzione definita qui è drawBoard() che viene utilizzata per disegnare il tabellone del tris sulla console. La funzione drawBoard() stampa lo stato corrente del tabellone, comprese le linee della griglia.

La funzione successiva definita qui è isMoveValid(). Questa funzione viene utilizzata per determinare se è consentita una mossa sia all'interno del tabellone che su una cella vuota. La funzione isBoardFull() viene utilizzata per verificare se la scheda è ancora piena. Questa è una condizione per una situazione di pareggio quando non c'è nessun vincitore. isBoardFull() controlla se tutte le posizioni sul tabellone sono occupate, il che indica un pareggio se non c'è nessun vincitore. Se c'è un vincitore, può essere accertato utilizzando la funzione checkWinner(). checkWinner() controlla tutte le potenziali linee vincenti per il segno dello stesso giocatore ('X' o 'O') e restituisce il segno del giocatore vincente se trovato o uno spazio ' ' se non c'è ancora un vincitore. Quello che segue è l'output del programma. Mostra ogni turno di ciascun giocatore.

Innanzitutto, il quadro è chiaro; al giocatore “X” viene chiesto di scegliere la cella da contrassegnare. Qui il giocatore “X” inserisce 2 e 2. Le celle della riga 2 e della colonna 2 sono contrassegnate. Fare riferimento alla scheda contrassegnata di seguito:

Ora è il turno del giocatore O. Al giocatore viene richiesto di scegliere una cella da contrassegnare. Il giocatore “O” sceglie 1 per la riga e 1 per la colonna. La cella scelta è contrassegnata per il giocatore 'O' come mostrato nel seguente frammento di output:

Tutti i turni di ciascun giocatore seguiranno lo stesso schema. È il turno del giocatore X e il giocatore sceglie 1 per la riga e 2 per la colonna. Fare riferimento alle seguenti istantanee di output fornite:

Ora il turno spetta al giocatore “O”. Il giocatore sceglie 1 per la riga e 3 per la colonna.

Il turno successivo spetta nuovamente al giocatore “X”. Il giocatore ne sceglie 3 per la riga e 1 per la colonna.

Il giocatore “O” sceglie 3 per la riga e 2 per la colonna.

Il giocatore 'X' seleziona la seconda riga e la terza colonna.

Il giocatore 'O' ora seleziona la seconda riga e la prima colonna.

Il giocatore “X” questa volta sceglie la terza riga e la terza colonna.

Nessun giocatore può tracciare alcuna linea in orizzontale, verticale o diagonale, quindi è un pareggio. Non esiste un vincitore per la serie di input scelta.

Nel complesso, il codice comprende un ciclo di gioco principale responsabile della gestione dello stato del gioco e dell'input dell'utente, insieme a diverse funzioni di utilità utilizzate per disegnare il tabellone, convalidare le mosse, verificare la presenza di un tabellone completo e determinare se c'è un vincitore. .

Conclusione

Sviluppare un gioco di tris utilizzando C++ è un eccellente esercizio pratico per rafforzare le tue capacità di programmazione. L'articolo spiega accuratamente come creare tris in C++. La guida passo passo fornita in questo articolo comprendeva una matrice 2D, funzioni e condizioni if-else per consentire ai lettori di comprendere le meccaniche di gioco, le interazioni dell'utente e l'efficiente strutturazione del codice. La guida dettagliata del codice e la spiegazione delle funzioni cruciali per il gameplay principale forniscono ai lettori informazioni preziose sia sulle pratiche di programmazione C++ che sulle complessità di un semplice sviluppo di un gioco.