Manu89 (Normal User)
Newbie
Messaggi: 12
Iscritto: 07/09/2009
|
Ciao! Non ho visto una sezione per presentarmi, però vabbè, sono nuovo comunque!
Sono un niubbo della programmazione e quindi ho trovato questo sito per caso perchè volevo saperne di più... Vedo gente più giovane di me, qui, che fa delle cose devastanti ^^ e io rimango spiazzato. Vabbè.
Comunque, volevo chiedere un aiuto per un programma che ho scritto che realizza una versione virtuale del gioco di forza4. Il programma funziona perfettamente tranne che per una sola cosa: si presenta il problema del segmentation fault quando si verifica la vittoria per diagonali di un tipo. Per favore, aiutatemi! Vi posto il codice:
(ho messo in grassetto la parte critica, non c'è bisogno di leggersi tutto il codice, l'ho fatto solo per completezza)
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #define R 6 #define C 7 #define P1 '£' #define P2 'O' #define E ' ' char** generaTab(){ char **casella=(char**)malloc(sizeof(char*)*C); int i,j; for(i=0;i<C;i++){ casella[i]=(char*)malloc(sizeof(char)*R); for(j=0;j<C;j++) casella[i][j]=E; } return casella; } drawTab(char **casella){ int i,j; printf("\t\t"); for(i=0;i<=C*4;i++) printf("-"); printf("\n"); for(i=0;i<R;i++){ printf("\t\t"); for(j=0;j<C;j++) printf("| %c ",casella[i][j]); i!=R-1?printf("|\n\n"):printf("|\n"); } printf("\t\t"); for(i=0;i<=C*4;i++) printf("-"); printf("\n "); printf("\t\t "); for(j=1;j<=C;j++) printf(" %d ",j); printf("\n\n"); } int play(char** casella, char p){ int n; int i; char res='e'; do { do { scanf("%d",&n); if(n<1||n>C) printf("Metti un numero adeguato\n"); } while(n<1||n>C); for(i=R-1;i>=0;i--){ if(casella[i][n-1]==E){ casella[i][n-1]=p; res='o'; break; } } if(res=='e') printf("Colonna piena!\n"); } while(res=='e'); if(p==P1) i=2; if(p==P2) i=1; return i; } char check(char** casella){ int i; int j; int w; int k; for(i=R-1;i>=0;i--){ for(j=0;j<C-4;j++){ if(casella[i][j]!=E && casella[i][j]==casella[i][j+1] && casella[i][j+1]==casella[i][j+2] && casella[i][j+2]==casella[i][j+3]){ for(w=j;w<j+4;w++) casella[i][w]='W'; return casella[i][j]; } } } for(j=0;j<C;j++){ for(i=R-1;i>2;i--){ if(casella[i][j]!=E && casella[i][j]==casella[i-1][j] && casella[i-1][j]==casella[i-2][j] && casella[i-2][j]==casella[i-3][j]){ for(k=i;k>i-4;k--) casella[k][j]='W'; return casella[i][j]; } } } for(i=0;i<3;i++){ for(j=0;j<4;j++){ if(casella[i][j]!=E && casella[i][j]==casella[i+1][j+1] && casella[i+1][j+1]==casella[i+2][j+2] && casella[i+2][j+2]==casella[i+3][j+3]){ for(k=i,w=j;k<i+4,w<j+4;k++,w++) casella[k][w]='W'; return casella[i][j]; } } } [b]//qui si presenta l'errore for(j=0;j<4;j++){ for(i=R-1;i>2;i--){ if(casella[i][j]!=E && casella[i][j]==casella[i-1][j+1] && casella[i-1][j+1]==casella[i-2][j+2] && casella[i-2][j+2]==casella[i-3][j+3]){ //sembra che il problema sia qui, però non so dove for(k=i,w=j;k>i-4,w<j+4;k--,j++) casella[k][w]='W'; return casella[i][j]; } } }[/b] return 'o'; } int main(){ char **casella=generaTab(); drawTab(casella); int i=1; char res; while(i){ if(i==1){ printf("Turno Giocatore 1 (scegliere numero colonna): %c :",P1); i=play(casella,P1); } else if (i==2){ printf("Turno Giocatore 2 (scegliere numero colonna): %c :",P2); i=play(casella,P2); } res=check(casella); printf("\n"); drawTab(casella); if(res=='W' && i==2){ printf("Vince il giocatore 1!\n"); i=0; } if(res=='W' && i==1){ printf("Vince il giocatore 2!\n"); i=0; } } printf("\n\tGioco finito\n"); return 0; }
|
Ultima modifica effettuata da Manu89 il 08/09/2009 alle 15:41 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
Ciao, benvenuto! Per postare del codice usa i teg code e poi quando devi scrivere casella[i ][j], metti uno spazio tra i e ] alrimenti [i ] non viene scritta e io non posso provare il codice.
|
|
Manu89 (Normal User)
Newbie
Messaggi: 12
Iscritto: 07/09/2009
|
ok, ho messo la tag code, ora non c'è più il grassetto, ma c'è l'unico commento del codice che aiuta ad individuare l'errore.
|
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
Ecco qua, scovato e corretto:
Codice sorgente - presumibilmente C/C++ |
if(casella[i][j]!=E && casella[i][j]==casella[i-1][j+1] && casella[i-1][j+1]==casella[i-2][j+2] && casella[i-2][j+2]==casella[i-3][j+3]){
//sembra che il problema sia qui, però non so dove
//for(k=i,w=j;k>i-4,w<j+4;k--,j++)
//il problema è nel for che termina sono quando le condizioni sono entrambe valide(E qui non lo vengono ad essere)
//perchè complicarsi la vita con for doppi
//se si può fare semplicemente così:
for(k=0;k<4;k++)
casella[i-k][j+k]='W';
return casella[i][j];
}
|
Leggi i commenti nel codice.
Ultima modifica effettuata da manvb.net il 08/09/2009 alle 16:15 |
|
Manu89 (Normal User)
Newbie
Messaggi: 12
Iscritto: 07/09/2009
|
Bene, ti ringrazio molto per la disponibilità
|
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
Di niente! In una community open source, ci si aiuta sempre!
Ultima modifica effettuata da manvb.net il 09/09/2009 alle 2:00 |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Postato originariamente da manvb.net:
Di niente! In una community open source, ci si aiuta sempre! |
Concordo sul fatto che le community servono per aiutarsi, ma mi sfugge il concetto di "community open source" ... |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
Intendo una community che abbraccia la filosofia open source!
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Postato originariamente da manvb.net:
Intendo una community che abbraccia la filosofia open source! |
Sì, ma ci si aiuta sempre in "qualsiasi" community ... |
|