Oppure

Loading
27/09/09 12:28
trenta3
Ho scritto il codice qui sotto per il gioco del tris, il problema è che non funziona:
a volte il computer non mette la crocetta.
Mi manca solo questo per finire il gioco.
Vi prego aiutatemi.

Ecco il codice:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

//-------------------------------
char Griglia[10];
int vincita=0;
//-------------------------------
void DisegnaGriglia();
void Clear();
void PulisciGriglia();
void MossaComputer();
void MossaGiocatore();
int TestaVincita();
int TestaPericolo();
//-------------------------------

     

int main(int argc, char *argv[]){
    char t;
         srand(time(NULL));
inizio:
Clear();
PulisciGriglia();
DisegnaGriglia();

while(vincita==0){
if(Griglia[0]==0) {MossaComputer();Griglia[0]=1;}
if(Griglia[0]==1) {MossaGiocatore();Griglia[0]=0;}
Clear();
DisegnaGriglia();
vincita = TestaVincita();

}

if (vincita==1){
printf("\nHai perso!\n");
getch();
}
if (vincita==2){
printf("\nHai vinto!\n");
getch();
}
if (vincita==3){
printf("\nPareggio!\n");
getch();
}

return 0;
}


void DisegnaGriglia(){
printf("\n.---.---.---.\n| %c | %c | %c |\n|---|---|---|\n| %c | %c | %c |\n|---|---|---|\n| %c | %c | %c |\n\'---\'---\'---\'",
       Griglia[1],Griglia[2],Griglia[3],Griglia[4],Griglia[5],Griglia[6],Griglia[7],Griglia[8],Griglia[9]);
return;
}

void Clear(){
system("cls");
return;
}

void PulisciGriglia(){

Griglia[1]='a';
Griglia[2]='b';
Griglia[3]='c';
Griglia[4]='d';
Griglia[5]='e';
Griglia[6]='f';
Griglia[7]='g';
Griglia[8]='h';
Griglia[9]='i';
Griglia[0]=rand()%2;
return;
}

void MossaComputer(){
     srand(time(NULL));
     int caselle;
     int num;
     int per;
     per = TestaPericolo();
     if (per==0){
if (Griglia[1]=='a') caselle+=1; 
if (Griglia[2]=='b') caselle+=1; 
if (Griglia[3]=='c') caselle+=1; 
if (Griglia[4]=='d') caselle+=1; 
if (Griglia[5]=='e') caselle+=1; 
if (Griglia[6]=='f') caselle+=1; 
if (Griglia[7]=='g') caselle+=1; 
if (Griglia[8]=='h') caselle+=1; 
if (Griglia[9]=='i') caselle+=1;
num = (rand()%caselle)+1;
caselle=0;
if (Griglia[1]=='a') caselle+=1;
if (num==caselle) Griglia[num]='x'; 
if (Griglia[2]=='b') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[3]=='c') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[4]=='d') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[5]=='e') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[6]=='f') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[7]=='g') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[8]=='h') caselle+=1; 
if (num==caselle) Griglia[num]='x';
if (Griglia[9]=='i') caselle+=1; 
if (num==caselle) Griglia[num]='x';
}else{
scie:
if (Griglia[per]=='o') {per=((per+1)%9); if (per==0) per=1; goto scie;}else{
                       Griglia[per]='x';}
}
return;
}

void MossaGiocatore(){
char key;
for(;;){
if (_kbhit()){
key = getch();
if (key=='a' || key=='A') { if (Griglia[1]=='a') Griglia[1]='o'; }
if (key=='b' || key=='B') { if (Griglia[2]=='b') Griglia[2]='o'; }
if (key=='c' || key=='C') { if (Griglia[3]=='c') Griglia[3]='o'; }
if (key=='d' || key=='D') { if (Griglia[4]=='d') Griglia[4]='o'; }
if (key=='e' || key=='E') { if (Griglia[5]=='e') Griglia[5]='o'; }
if (key=='f' || key=='F') { if (Griglia[6]=='f') Griglia[6]='o'; }
if (key=='g' || key=='G') { if (Griglia[7]=='g') Griglia[7]='o'; }
if (key=='h' || key=='H') { if (Griglia[8]=='h') Griglia[8]='o'; }
if (key=='i' || key=='I') { if (Griglia[9]=='i') Griglia[9]='o'; }
return;
}
_sleep(1);
}//for(;;)
return;
}


int TestaPericolo(){
if (Griglia[1]=='o' && Griglia[2]=='o') return 3;
if (Griglia[2]=='o' && Griglia[3]=='o') return 1;
if (Griglia[3]=='o' && Griglia[1]=='o') return 2;
if (Griglia[4]=='o' && Griglia[5]=='o') return 6;
if (Griglia[4]=='o' && Griglia[6]=='o') return 5;
if (Griglia[5]=='o' && Griglia[6]=='o') return 4;
if (Griglia[7]=='o' && Griglia[8]=='o') return 9;
if (Griglia[8]=='o' && Griglia[9]=='o') return 7;
if (Griglia[9]=='o' && Griglia[7]=='o') return 8;
if (Griglia[1]=='o' && Griglia[4]=='o') return 7;
if (Griglia[1]=='o' && Griglia[7]=='o') return 4;
if (Griglia[7]=='o' && Griglia[4]=='o') return 1;
if (Griglia[2]=='o' && Griglia[5]=='o') return 8;
if (Griglia[5]=='o' && Griglia[8]=='o') return 2;
if (Griglia[8]=='o' && Griglia[2]=='o') return 5;
if (Griglia[3]=='o' && Griglia[6]=='o') return 9;
if (Griglia[6]=='o' && Griglia[9]=='o') return 3;
if (Griglia[9]=='o' && Griglia[3]=='o') return 6;
if (Griglia[1]=='o' && Griglia[5]=='o') return 9;
if (Griglia[5]=='o' && Griglia[9]=='o') return 1;
if (Griglia[9]=='o' && Griglia[1]=='o') return 5;
if (Griglia[3]=='o' && Griglia[5]=='o') return 7;
if (Griglia[5]=='o' && Griglia[7]=='o') return 3;
if (Griglia[7]=='o' && Griglia[3]=='o') return 5;
//=============================================\
if (Griglia[1]=='x' && Griglia[2]=='x') return 3;
if (Griglia[2]=='x' && Griglia[3]=='x') return 1;
if (Griglia[3]=='x' && Griglia[1]=='x') return 2;
if (Griglia[4]=='x' && Griglia[5]=='x') return 6;
if (Griglia[4]=='x' && Griglia[6]=='x') return 5;
if (Griglia[5]=='x' && Griglia[6]=='x') return 4;
if (Griglia[7]=='x' && Griglia[8]=='x') return 9;
if (Griglia[8]=='x' && Griglia[9]=='x') return 7;
if (Griglia[9]=='x' && Griglia[7]=='x') return 8;
if (Griglia[1]=='x' && Griglia[4]=='x') return 7;
if (Griglia[1]=='x' && Griglia[7]=='x') return 4;
if (Griglia[7]=='x' && Griglia[4]=='x') return 1;
if (Griglia[2]=='x' && Griglia[5]=='x') return 8;
if (Griglia[5]=='x' && Griglia[8]=='x') return 2;
if (Griglia[8]=='x' && Griglia[2]=='x') return 5;
if (Griglia[3]=='x' && Griglia[6]=='x') return 9;
if (Griglia[6]=='x' && Griglia[9]=='x') return 3;
if (Griglia[9]=='x' && Griglia[3]=='x') return 6;
if (Griglia[1]=='x' && Griglia[5]=='x') return 9;
if (Griglia[5]=='x' && Griglia[9]=='x') return 1;
if (Griglia[9]=='x' && Griglia[1]=='x') return 5;
if (Griglia[3]=='x' && Griglia[5]=='x') return 7;
if (Griglia[5]=='x' && Griglia[7]=='x') return 3;
if (Griglia[7]=='x' && Griglia[3]=='x') return 5;
return 0;
}

int TestaVincita(){
if (Griglia[1]=='o' && Griglia[2]=='o' && Griglia[3]=='o') return 2;
if (Griglia[4]=='o' && Griglia[5]=='o' && Griglia[6]=='o') return 2;
if (Griglia[7]=='o' && Griglia[8]=='o' && Griglia[9]=='o') return 2;
if (Griglia[1]=='o' && Griglia[4]=='o' && Griglia[7]=='o') return 2;
if (Griglia[2]=='o' && Griglia[5]=='o' && Griglia[8]=='o') return 2;
if (Griglia[3]=='o' && Griglia[6]=='o' && Griglia[9]=='o') return 2;
if (Griglia[1]=='o' && Griglia[5]=='o' && Griglia[9]=='o') return 2;
if (Griglia[3]=='o' && Griglia[5]=='o' && Griglia[7]=='o') return 2;

if (Griglia[1]=='x' && Griglia[2]=='x' && Griglia[3]=='x') return 1;
if (Griglia[4]=='x' && Griglia[5]=='x' && Griglia[6]=='x') return 1;
if (Griglia[7]=='x' && Griglia[8]=='x' && Griglia[9]=='x') return 1;
if (Griglia[1]=='x' && Griglia[4]=='x' && Griglia[7]=='x') return 1;
if (Griglia[2]=='x' && Griglia[5]=='x' && Griglia[8]=='x') return 1;
if (Griglia[3]=='x' && Griglia[6]=='x' && Griglia[9]=='x') return 1;
if (Griglia[1]=='x' && Griglia[5]=='x' && Griglia[9]=='x') return 1;
if (Griglia[3]=='x' && Griglia[5]=='x' && Griglia[7]=='x') return 1;

if (Griglia[1]!='a' && Griglia[2]!='b' && 
Griglia[3]!='c' && Griglia[4]!='d' && 
Griglia[5]!='e' && Griglia[6]!='f' && 
Griglia[7]!='g' && Griglia[8]!='h' && Griglia[9]!='i') return 3;

return 0;
}




Grazie a chiunque mi risponderà
aaa
27/09/09 15:33
gigisoft
Postato originariamente da trenta3:

Ho scritto il codice qui sotto per il gioco del tris, il problema è che non funziona:
a volte il computer non mette la crocetta.
Mi manca solo questo per finire il gioco.
Vi prego aiutatemi.

Ecco il codice:

[...]

Grazie a chiunque mi risponderà


Salve,

da una rapida scorsa al codice ho notato che:

Nella funzione MossaComputer() "caselle" non e' inizializzata, poi la scelta della mossa e' poco chiara, poi nella verifica del valore di "per", nell'"else", rifai il test

... if (per==0) ...


infine l'uso del goto, in questo caso, e' sconsigliato ( un do ... while e' preferibile ).

Nella funzione MossaGiocatore() gli if innestati sono evitabili, e' molto meglio qualcosa del genere

if (((key=='a') || (key=='A')) && (Griglia[1]=='a')) { Griglia[1]='o'; }
...


Nella funzione TestaPericolo() potresti evitare meta' degli if con il passaggio di un parametro, qualcosa del genere

int TestaPericolo(char simbolo) {
if ((simbolo != 'x') && (simbolo != 'o')) return 0
if ((Griglia[1]==simbolo) && (Griglia[2]==simbolo)) return 3;
...


Nella funzione TestaVincita() se gestisci un contatore delle mosse effettuate potresti evitare il complicato if finale che diventerebbe semplicemente

... if (counter == 9) return 3;


spero di esserti stato utile, purtroppo non ho il tempo di analizzare piu' approfonditamente la funzione MossaComputer(), penso che il problema di cui parli sia li'.
Ciao. :k:

Luigi
aaa
28/09/09 18:22
trenta3
Grazie per l'aiuto.
ho provato a risolvere qualcosa ma non ne esco:
adesso mette più crocette di prima ma qualche turno lo salta.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

//-------------------------------
char Griglia[10];
int vincita=0;
//-------------------------------
void DisegnaGriglia();
void Clear();
void PulisciGriglia();
void MossaComputer();
void MossaGiocatore();
int TestaVincita();
int TestaPericolo();
//-------------------------------

     

int main(int argc, char *argv[]){
    srand(time(NULL));
    char t;
         
inizio:
Clear();
PulisciGriglia();
DisegnaGriglia();

while(vincita==0){
if(Griglia[0]==0) {MossaComputer();Griglia[0]=1;}
if(Griglia[0]==1) {MossaGiocatore();Griglia[0]=0;}
Clear();
DisegnaGriglia();
vincita = TestaVincita();

}

if (vincita==1){
printf("\nHai perso!\n");
getch();
}
if (vincita==2){
printf("\nHai vinto!\n");
getch();
}
if (vincita==3){
printf("\nPareggio!\n");
getch();
}

return 0;
}


void DisegnaGriglia(){
printf("\n.---.---.---.\n| %c | %c | %c |\n|---|---|---|\n| %c | %c | %c |\n|---|---|---|\n| %c | %c | %c |\n\'---\'---\'---\'",
       Griglia[1],Griglia[2],Griglia[3],Griglia[4],Griglia[5],Griglia[6],Griglia[7],Griglia[8],Griglia[9]);
return;
}

void Clear(){
system("cls");
return;
}

void PulisciGriglia(){

Griglia[1]='a';
Griglia[2]='b';
Griglia[3]='c';
Griglia[4]='d';
Griglia[5]='e';
Griglia[6]='f';
Griglia[7]='g';
Griglia[8]='h';
Griglia[9]='i';
Griglia[0]=rand()%2;
return;
}

void MossaComputer(){
     srand(time(NULL));
     int caselle; //qui viene inizializzata caselle\
     int num;
     int per=0;
     
     if (TestaPericolo()==0){
if (Griglia[1]=='a') caselle+=1; 
if (Griglia[2]=='b') caselle+=1; 
if (Griglia[3]=='c') caselle+=1; 
if (Griglia[4]=='d') caselle+=1; 
if (Griglia[5]=='e') caselle+=1; 
if (Griglia[6]=='f') caselle+=1; 
if (Griglia[7]=='g') caselle+=1; 
if (Griglia[8]=='h') caselle+=1; 
if (Griglia[9]=='i') caselle+=1;
num = (rand()%caselle)+1;

DaiGriglia:
           
if (Griglia[num]=='x' || Griglia[num]=='o'){
num = num +1;
if (num == 10) num=1;
goto DaiGriglia;
}else{
Griglia[num]='x';
}

}else{
      per = TestaPericolo();
      grilia:
if (Griglia[per]=='o'){
per=per+1;
if(per==10) per=1;
goto grilia;
}else{
Griglia[per]='x';
}
 
}

return;
}

void MossaGiocatore(){
char key;
for(;;){
if (_kbhit()){
key = getch();
if ((key=='a' || key=='A') && (Griglia[1]=='a')) Griglia[1]='o';
if ((key=='b' || key=='B') && (Griglia[2]=='b')) Griglia[2]='o';
if ((key=='c' || key=='C') && (Griglia[3]=='c')) Griglia[3]='o';
if ((key=='d' || key=='D') && (Griglia[4]=='d')) Griglia[4]='o';
if ((key=='e' || key=='E') && (Griglia[5]=='e')) Griglia[5]='o';
if ((key=='f' || key=='F') && (Griglia[6]=='f')) Griglia[6]='o';
if ((key=='g' || key=='G') && (Griglia[7]=='g')) Griglia[7]='o';
if ((key=='h' || key=='H') && (Griglia[8]=='h')) Griglia[8]='o';
if ((key=='i' || key=='I') && (Griglia[9]=='i')) Griglia[9]='o';
return;
}
_sleep(1);
}//for(;;)
return;
}


int TestaPericolo(){
    int y;
    y=0;
if (Griglia[1]==Griglia[2]) y=3;
if (Griglia[2]==Griglia[3]) y=1;
if (Griglia[3]==Griglia[1]) y=2;
if (Griglia[4]==Griglia[5]) y=6;
if (Griglia[4]==Griglia[6]) y=5;
if (Griglia[5]==Griglia[6]) y=4;
if (Griglia[7]==Griglia[8]) y=9;
if (Griglia[8]==Griglia[9]) y=7;
if (Griglia[9]==Griglia[7]) y=8;
if (Griglia[1]==Griglia[4]) y=7;
if (Griglia[1]==Griglia[7]) y=4;
if (Griglia[7]==Griglia[4]) y=1;
if (Griglia[2]==Griglia[5]) y=8;
if (Griglia[5]==Griglia[8]) y=2;
if (Griglia[8]==Griglia[2]) y=5;
if (Griglia[3]==Griglia[6]) y=9;
if (Griglia[6]==Griglia[9]) y=3;
if (Griglia[9]==Griglia[3]) y=6;
if (Griglia[1]==Griglia[5]) y=9;
if (Griglia[5]==Griglia[9]) y=1;
if (Griglia[9]==Griglia[1]) y=5;
if (Griglia[3]==Griglia[5]) y=7;
if (Griglia[5]==Griglia[7]) y=3;
if (Griglia[7]==Griglia[3]) y=5;
return y;
}

int TestaVincita(){
if (Griglia[1]=='o' && Griglia[2]=='o' && Griglia[3]=='o') return 2;
if (Griglia[4]=='o' && Griglia[5]=='o' && Griglia[6]=='o') return 2;
if (Griglia[7]=='o' && Griglia[8]=='o' && Griglia[9]=='o') return 2;
if (Griglia[1]=='o' && Griglia[4]=='o' && Griglia[7]=='o') return 2;
if (Griglia[2]=='o' && Griglia[5]=='o' && Griglia[8]=='o') return 2;
if (Griglia[3]=='o' && Griglia[6]=='o' && Griglia[9]=='o') return 2;
if (Griglia[1]=='o' && Griglia[5]=='o' && Griglia[9]=='o') return 2;
if (Griglia[3]=='o' && Griglia[5]=='o' && Griglia[7]=='o') return 2;

if (Griglia[1]=='x' && Griglia[2]=='x' && Griglia[3]=='x') return 1;
if (Griglia[4]=='x' && Griglia[5]=='x' && Griglia[6]=='x') return 1;
if (Griglia[7]=='x' && Griglia[8]=='x' && Griglia[9]=='x') return 1;
if (Griglia[1]=='x' && Griglia[4]=='x' && Griglia[7]=='x') return 1;
if (Griglia[2]=='x' && Griglia[5]=='x' && Griglia[8]=='x') return 1;
if (Griglia[3]=='x' && Griglia[6]=='x' && Griglia[9]=='x') return 1;
if (Griglia[1]=='x' && Griglia[5]=='x' && Griglia[9]=='x') return 1;
if (Griglia[3]=='x' && Griglia[5]=='x' && Griglia[7]=='x') return 1;

if (Griglia[1]!='a' && Griglia[2]!='b' && 
Griglia[3]!='c' && Griglia[4]!='d' && 
Griglia[5]!='e' && Griglia[6]!='f' && 
Griglia[7]!='g' && Griglia[8]!='h' && Griglia[9]!='i') return 3;

return 0;
}




Grazie di nuovo.
Per adesso ho tenuto i goto perchè li vorrei togliere dopo aver visto il gioco che funziona.
aaa
28/09/09 21:01
gigisoft
Postato originariamente da trenta3:

Grazie per l'aiuto.
ho provato a risolvere qualcosa ma non ne esco:
adesso mette più crocette di prima ma qualche turno lo salta.
[...]
     int caselle; //qui viene inizializzata caselle\
[...]




no... qui caselle viene solo dichiarato, non inizializzato, il valore che assume all'inizio e' imprevedibile, dovresti scrivere:

[...]
     int caselle = 0; // ORA viene inizializzata caselle
[...]


Ciao. :k:

Luigi.
aaa
29/09/09 15:14
trenta3
Grazie infinite per quello che hai fatto. :hail:
Ho riguardato il programma e ho corretto l'inizializzazione di caselle e mi sono accorto di un'altro errore:
while(vincita==0){
if(Griglia[0]==0) {MossaComputer();Griglia[0]=1;} 
if(Griglia[0]==1) {MossaGiocatore();Griglia[0]=0;}

Clear();
DisegnaGriglia();
vincita = TestaVincita();

}



che ho sostituito


while(vincita==0){
if(Griglia[0]==0) {MossaComputer();Griglia[0]=1;}else{ 
if(Griglia[0]==1) {MossaGiocatore();Griglia[0]=0;}}

Clear();
DisegnaGriglia();
vincita = TestaVincita();

}


Grazie tantissime: era questo il problema che non andava(Problema banalissimo) :_doubt:
aaa
29/09/09 19:54
gigisoft
Postato originariamente da trenta3:

Grazie infinite per quello che hai fatto. :hail:
Ho riguardato il programma e ho corretto l'inizializzazione di caselle e mi sono accorto di un'altro errore:
while(vincita==0){
if(Griglia[0]==0) {MossaComputer();Griglia[0]=1;} 
if(Griglia[0]==1) {MossaGiocatore();Griglia[0]=0;}

Clear();
DisegnaGriglia();
vincita = TestaVincita();

}



che ho sostituito


while(vincita==0){
if(Griglia[0]==0) {MossaComputer();Griglia[0]=1;}else{ 
if(Griglia[0]==1) {MossaGiocatore();Griglia[0]=0;}}

Clear();
DisegnaGriglia();
vincita = TestaVincita();

}


Grazie tantissime: era questo il problema che non andava(Problema banalissimo) :_doubt:


comunque se Griglia[0][b][/b] puo' assumere solo i valori 0 e 1 il secondo if e' inutile.

Ciao. :k:

Luigi.
aaa
01/10/09 22:45
HeDo

oddio a parte il fatto che quel codice è allucinante per non dire inguardabile, ti consiglio di studiarti bene i cicli e ti invito a pensare almeno dieci minuti prima di metterti a scrivere il codice, così avrai una visione d'insieme ed eviterai di ridondare le istruzioni.

aaa
01/10/09 22:53
Gianluca87
if if if if if if
astio per i cicli?
:rofl:
aaa