|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
[C] gioco del Tris
Salve a tutti, ho scritto un piccolo gioco del Tris in C, ma ho riscontrato questi problemi:
[RISOLTO] 1. Quando si prova a mettere una pedina su una casella occupata il numero dei turni non diminuisce (pur avendo messo count_turni--). [RISOLTO]2. A fine partita non funziona la parte in cui si chiede se si vuole iniziare una nuova partita. [RISOLTO] 3. In caso di parità non viene eseguito il printf relativo, penso che la variabile risultato non venga settata correttamente a 3 perché credo di aver sbagliato qualcosa nel controllo parità nella funzione check_vincita. Per ora non mi viene altro in mente, ringrazio tutti in anticipo. Il mio codice è questo: -. Uso come editor NotePad++ e come compilatore Dev-C++. EDIT: Ho risolto due problemi, mi manca l'ultimo, ma proprio non ne vengo a capo. Inoltre vorrei chiedervi se c'è qualche modo di snellire il codice, soprattutto nella funzione check_vincita. Pensavo che Codice:
if(schema[7] == schema[8] == schema[9] == 'X' || schema[4] == schema[5] == schema[6] == 'X' || schema[1] == schema[2] == schema[3] == 'X') r = 1; ... Grazie ancora.
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! Ultima modifica di Filly95 : 21-02-2012 alle 19:58. Motivo: risolti due bug |
|
|
|
|
|
#2 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21959
|
le eguaglianze devi farle 2 a 2 ovvero cella1 ='X' && cella2=='X' ecc ecc
ma se vuoi snellire il codice puoi fare questo trucchetto considera i char come intero (cast a int) somma i 3 valori e controlla se la somma vale 264 (per le X che corrispondono in intero a 88)
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Feb 2012
Messaggi: 12
|
Per riavviare ho provato a inserire
Codice:
nuova=getch(); Codice:
scanf("%c", &nuova);
Ovviamente devi aggiungere la libreria conio.h. Ho notato che dopo il riavvio rimangono le pedine della partita precedente. Bel programma comunque |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
Quote:
Grazie, avevo già provato getch, e andava. A casa a sto punto sostituisco scanf con getch, e metto anche l'inizializzazione dell'array schema dentro il do while al posto che fuori dal main, così ogni volta si resetta. Ora però voglio capire perché scanf non va... Qualche idea?
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! Ultima modifica di Filly95 : 20-02-2012 alle 12:18. |
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Feb 2012
Messaggi: 12
|
Praticamente lo scanf legge ogni tipo di carattere digitato da tastiera, quindi anche l'invio.
Per risolvere questo problema basta mettere Codice:
scanf("%s", &nuova);
Oppure utilizzi il getch. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
EDIT: Cercando su Google ho trovato che "%c" non dovrebbe tenere conto del \n ("%s" invece sì) ma nel caso del do while lo fa. Come si risolve? Ho trovato qui che mettendo "%c\n" dovrebbe andare a posto.
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! Ultima modifica di Filly95 : 20-02-2012 alle 13:38. |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Feb 2012
Messaggi: 12
|
Se utilizzi %c verrà letto anche l'invio.
Es. digito 's' e premo invio, il programma legge il carattere 's' e /n, la variabile sarà uguale a 's' con /n. Se utilizzi \n%c l'invio verrà scartato. Es. digito 's' e premo invio, il programma legge il carattere 's' e /n, scarta /n, quindi la variabile sarà uguale a 's'. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
Sisi, ora funziona tutto! Stavo spiegando a mio nonno come giocare e nel frattempo mi sono accorto che mancava anche l'azzeramento (o meglio, l'inizializzazione a 1) dei turni quando si ricomincia una partita
Comunque questo è il codice sorgente finale, se a qualcuno mai sarà utile: http://codepad.org/n73qX3nc. Un'altra cosa carina da implementare sarebbe l'uscita in qualsiasi momento premendo esc ma non so/ho voglia di implementarla
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! |
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: Feb 2012
Messaggi: 12
|
Sarebbe bello farlo con una veste grafica, solo che non so come si fa, a quest'ora l'avrei già fatto
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2009
Città: Milano
Messaggi: 449
|
Sicuramente il c da solo non basta, ci vuole qualche libreria... Però l'esercizio era realizzarlo in console, ce l'ho fatta in 8 ore e ne sono fiero
__________________
Intel i5 2500k | Arctic Cooling Freezer i30 | Asrock Z68 Extreme 3 Gen 3 | Lancool PC-K62 | Corsair TX750M | MSI nVidia GTX 560 Ti Twin Frozr II | Corsair Vengeance LP Black 1600MHz 2x4GB | Crucial M4 128GB | Western Digital Elements 1TB | Seagate 500GB | Cooler Master Spawn | Logitech G110 Concluso positivamente con: massimo3550! |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
sei grande. Fare giochi in C è davvero complicato!!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Nov 2012
Messaggi: 1
|
Mia versione tris
Ciao a tutti ragazzi, sono nuovo del forum. Io ho prodotto una mia versione del gioco del tris ed è funzionante in Code::Blocks 10.05. Questo è il codice:
Codice HTML:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define DIM 3 #define CPU 1 #define PLAYER 0 void stampa(char matrice[DIM][DIM]); //stampa il tabellone ogni volta che un giocatore inserisce una propria pedina int inserimento (char matrice[DIM][DIM], int stato); //inserisce la pedina del giocatore corrispondente void vittoria (char matrice[DIM][DIM], char ); //controlla se si è verificato un tris e decreta il vincitore int main() { int status=0, i=0; char matrix[DIM][DIM]={'.','.','.','.','.','.','.','.','.'}; //inizializzazione di matrice (ho 2 warning per questo) printf("Il programma permette di giocare a tris con il computer\n"); srand(time(NULL)); status=rand()%2; //testa o croce fra il giocatore e la CPU stampa(matrix); i=0; while(i<10) //si possono occupare solo 9 caselle { status=inserimento(matrix, status); i++; } printf("La partita contro la CPU e' finita pari\n"); return 0; } void vittoria (char matrice[DIM][DIM], char pedina) { int i=0, j=0, flag=0; for(i=0;i<DIM;i++) //controllo per righe della matrice { flag=0; for(j=0;j<DIM;j++) { if(matrice[i][j]==pedina) flag++; } if(flag==3) { stampa(matrice); printf("Giocatore '%c' HAI FATTO TRIS! SEI IL VINCITORE!\n", pedina); exit(EXIT_SUCCESS); } } for(j=0;j<DIM;j++) //controllo per colonne della matrice { flag=0; for(i=0;i<DIM;i++) { if(matrice[i][j]==pedina) flag++; } if(flag==3) { stampa(matrice); printf("Giocatore '%c' HAI FATTO TRIS! SEI IL VINCITORE!\n", pedina); exit(EXIT_SUCCESS); } } if(matrice[0][0]==pedina && matrice[1][1]==pedina && matrice[2][2]==pedina) //controllo delle diagonali della matrice { stampa(matrice); printf("Giocatore '%c' HAI FATTO TRIS! SEI IL VINCITORE!\n", pedina); exit(EXIT_SUCCESS); } if(matrice[0][2]==pedina && matrice[1][1]==pedina && matrice[2][0]==pedina) { stampa(matrice); printf("Giocatore '%c' HAI FATTO TRIS! SEI IL VINCITORE!\n", pedina); exit(EXIT_SUCCESS); } stampa(matrice); } void stampa(char matrice[DIM][DIM]) { int i=0, j=0; char righe[DIM]={'A','B','C'}, colonne[DIM+1]={' ','1','2','3'}; for(i=0;i<DIM+1;i++) { printf("%c ", colonne[i]); } printf("\n"); for(i=0;i<DIM;i++) { printf("%c ", righe[i]); for(j=0;j<DIM;j++) { printf("%c ", matrice[i][j]); } printf("\n"); } } int inserimento (char matrice[DIM][DIM], int stato) { char xy[DIM]={'\0','\0','\0'}, sign='\0'; int i=0,j=0; printf("Mossa?<inserire coordinate>\n"); if(stato==CPU) { sign='O'; //assegna un segno distinguibile ad ogni giocatore do { srand(time(NULL)); i=rand()%3; //la CPU deve scegliere casualmente una riga ed una colonna da 0 a 3 srand(time(NULL)); j=rand()%3; } while(matrice[i][j]!='.'); //controlla che la casella non sia occupata da un altra pedina matrice[i][j]=sign; //assegna alla casella libera il segno del giocatore corrente vittoria(matrice, sign); //rimanda al controllo del tris stato=PLAYER; //passa la mano all'avversario return stato; //ritorna il turno del giocatore corrispondente } else { sign='X'; do { gets(xy); //il giocatore deve inserie un carattere compreso fra A,B,C per le righe e 1,2,3 per le colonne i=xy[0]%65; //traduce le lettere in indici della matrice j=xy[1]%49; //mette in scala i numeri inseriti per le colonne } while(matrice[i][j]!='.'); matrice[i][j]=sign; vittoria(matrice, sign); stato=CPU; return stato; } } Ultima modifica di Phantom1989 : 20-11-2012 alle 16:05. Motivo: Rettifica corretto funzionamento programma |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:22.



















