Oppure

Loading
07/09/09 21:44
Manu89
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)


#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 08/09/09 13:41
aaa
08/09/09 11:39
manvb.net
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.
aaa
08/09/09 13:44
Manu89
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.8-)
aaa
08/09/09 14:14
manvb.net
Ecco qua, scovato e corretto:

            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 08/09/09 14:15
aaa
08/09/09 20:40
Manu89
Bene, ti ringrazio molto per la disponibilità :k:
aaa
08/09/09 23:58
manvb.net
Di niente!:k: In una community open source, ci si aiuta sempre!
Ultima modifica effettuata da manvb.net 09/09/09 0:00
aaa
10/09/09 19:33
theprogrammer
Postato originariamente da manvb.net:

Di niente!:k: 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" ...
aaa
10/09/09 23:52
manvb.net
Intendo una community che abbraccia la filosofia open source!
aaa