Home Home | Edit Edit | Attach Attach | Site Map Site Map | Help Help
Prenotazioni | Architetture | Calcolabilita | Grafica3d Prog Reti | SO | Corsi_esterni | Progetti | Commissioni | TWiki
 
Programmazione1 | Programmazione2ad | Labprog2ad
Programmazione1. Tris

Search


Advanced search...

Topics


Parents

Il gioco del Tris (o tic-tac-toe)

Visto che non conoscete bene matrici e funzioni, ho allungato la consegna dell' HomeWork2.


Versione che non usa funzioni

L'implementazione può essere chiaramente migliorata:

  • usando i simboli x e o invece che 0 e 1
  • controllando ciascuna diagonale solo se la mossa corrente vi appartiene

#include <stdio.h>

int main() {
	int M[3][3] = { 0 };
	int winner=0,x,y,k,i,player=1,trovato;
	
	// eseguo al più 9 mosse
	for (k=0 ; k<9 ; k++) {
		// stampo la matrice
		printf("  ");
		for (y=0 ; y<3 ; y++)
			printf(" %d",y);
		printf("\n");
		for (x=0 ; x<3 ; x++) {
			printf("%d |",x);
			for (y=0 ; y<3 ; y++)
				if (M[x][y])
					printf("%d|",M[x][y]);
				else 
					printf(" |");
			printf("\n");
		}

		// leggo la mossa e la richiedo finche' non è valida
		while (1) {
			printf("Gioca %d :",player);
			scanf("%d%d",&x,&y);
			if (x>2 || x<0 || y>2 || y<0 || M[x][y] != 0 ) {
				printf("Mossa non valida\n");
				continue;
			}
			// la mossa è valida, esco
			break;
		}

		// la mosa è valida, la gioco
		M[x][y] = player;

		// controllo la riga
		trovato = 1;
		for (i=0 ; i<3 ; i++)
			if (M[x][i] != player)
				trovato = 0;
		if (trovato) {
			winner = player;
			break; // esco dal for
		}
		
		// controllo la colonna
		trovato = 1;
		for (i=0 ; i<3 ; i++)
			if (M[i][y] != player)
				trovato = 0;
		if (trovato) {
			winner = player;
			break; // esco dal for
		}

		// controllo la diagonale 		trovato = 1;
		for (i=0 ; i<3 ; i++)
			if (M[i][i] != player)
				trovato = 0;
		if (trovato) {
			winner = player;
			break; // esco dal for
		}

		// controllo la diagonale /
		trovato = 1;
		for (i=0 ; i<3 ; i++)
			if (M[i][2-i] != player)
				trovato = 0;
		if (trovato) {
			winner = player;
			break; // esco dal for
		}
		
		// passo all'altro giocatore
		player = (player == 1 ? 2 : 1);
	} // fine del for per le 9 mosse

	// stampo la situazione finale
	printf("  ");
	for (y=0 ; y<3 ; y++)
		printf(" %d",y);
	printf("\n");
	for (x=0 ; x<3 ; x++) {
		printf("%d |",x);
		for (y=0 ; y<3 ; y++)
			if (M[x][y])
				printf("%d|",M[x][y]);
			else 
				printf(" |");
		printf("\n");
	}

	// e faccio sapere chi ha vinto
	if (winner)
		printf("Ha vinto il giocatore %d\n",winner);
	else
		printf("Partita patta.\n");
	return 0;
}


Versione che usa le funzioni

L'implementazione può essere chiaramente migliorata:

  • usando i simboli x e o invece che 0 e 1
  • considerando che la terna di segni uguali che fa vincere deve necessariamente contenere l'ultimo simbolo inserito, e quindi che il test per la vittoria può essere molto più semplice.
  • controllando ciascuna diagonale solo se la mossa corrente vi appartiene

#include <stdio.h>

// test se la partita è finita (3 dello stesso tipo in fila)
// torna il numero di chi vince
int haVinto(int matrice[3][3]) {
	// righe
	int x; // coordinate nella matrice
	for (x=0 ; x<3 ; x++) {
		// tre in riga
		if (matrice[x][0] != 0 && matrice[x][0] == matrice[x][1] && matrice[x][1] == matrice[x][2])
				 return matrice[x][0];
		// tre in colonna
		if (matrice[0][x] != 0 && matrice[0][x] == matrice[1][x] && matrice[1][x] == matrice[2][x])
				 return matrice[0][x];
	}
	// tre in diagonale
	if (matrice[0][0] != 0 && matrice[0][0] == matrice[1][1] && matrice[1][1] == matrice[2][2])
			 return matrice[0][0];
	if (matrice[0][2] != 0 && matrice[0][2] == matrice[1][1] && matrice[1][1] == matrice[2][0])
			 return matrice[0][2];
	// altrimenti si torna 0
	return 0;
}

// test se la mossa è valida (la casella è vuota)
int mossaValida(int M[3][3], int x, int y) {
	if (x>2 || x<0 || y>2 || y<0)
		return 0;
	return (!M[x][y]);
}

// gioca la mossa (memorizza il giocatore nella casella)
void giocaMossa(int M[3][3], int x, int y, int player) {
	M[x][y] = player;
}

int ciSonoMosseValide(int M[3][3]) {
	int x,y;
	for (x=0 ; x<3 ; x++)
		for (y=0 ; y<3 ; y++)
			if (!M[x][y])
				return 1;
	return 0;
}


// mostra la scacchiera
void stampa(int M[3][3]){
	int x,y;
	printf("  ");
	for (y=0 ; y<3 ; y++)
		printf(" %d",y);
	printf("\n");
	for (x=0 ; x<3 ; x++) {
		printf("%d |",x);
		for (y=0 ; y<3 ; y++)
			if (M[x][y])
				printf("%d|",M[x][y]);
			else 
				printf(" |");
		printf("\n");
	}
}

int main() {
	int M[3][3] = { 0 };
	int winner=0,x,y,player=1;
	do {
		stampa(M);
		printf("Gioca %d\n",player);
		scanf("%d%d",&x,&y);
		if (mossaValida(M,x,y)) {
			giocaMossa(M,x,y,player);
			player = (player == 1 ? 2 : 1);
		} else
			printf("Mossa non valida\n");
	} while (!(winner=haVinto(M)) && ciSonoMosseValide(M));
	stampa(M);
	if (winner)
		printf("Ha vinto il giocatore %d\n",winner);
	else
		printf("Partita patta.\n");
	return 0;
}


-- AndreaSterbini - 30 Oct 2003

Actions: Edit | Attach | Ref-By | Printable view | Raw view | See diffs | Help | More...