mfonz85
14-05-2006, 11:47
Ciao a tutti, ieri ho provato a buttare giù qualche riga per crearmi un "gioco della vita" fatto in casa :D
Da vero smanettone, la griglia del gioco della vita (struttura dati: matrice) me la alloco dinamicamente secondo la grandezza impostata dall'utente...solo che devo aver fatto un casino coi puntatori...mi va in errore di segmentazione...io lo odioooo quell'errore!!! :D
Il codice è ovviamente incompleto, manca solo il ciclo che fa ciclare ad infinito il processo di creazione/distruzione degli esseri, quello lo avrei implementato dopo aver controllato che tutto era a posto.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int **malloc2d(int, int);
int **malloc2d(int r, int c)
{
int i;
int **t=malloc(r*sizeof(int *));
for (i=0; i<r; i++)
{
t[i]=malloc(c*sizeof(int));
t[i] = 0;
}
return t;
}
void randomize_elements(int **matrice, int elements, int r, int c)
{
int posx, posy, i;
for(i = 0; i < elements; i++)
{
posx = rand() % c;
posy = rand() % r;
matrice[posx][posy] = 1;
}
}
int lifecontrol(int y, int x, int maxy, int maxx, int **mat)
{
int life = 0;
if((y-1)>0 && (x-1)>0) if(mat[y-1][x-1] == 1) life++;
if((x-1)>0) if(mat[y][x-1] == 1) life++;
if((y+1)<maxy && (x-1)>0) if(mat[y+1][x-1] == 1) life++;
if((y+1)<maxy) if(mat[y+1][x] == 1) life++;
if((y+1)<maxy && (x+1)<maxx) if(mat[y+1][x+1] == 1) life++;
if((x+1)<maxx) if(mat[y][x+1] == 1) life++;
if((x+1)<maxx && (y-1)>0) if(mat[y-1][x+1] == 1) life++;
if((y-1)>0) if(mat[y-1][x] == 1) life++;
return life;
}
void destroy(int y, int x, int **mat)
{
mat[y][x] = 0;
}
void create(int y, int x, int **mat)
{
mat[y][x] = 1;
}
int main(void)
{
int righe, colonne, elementi;
int i,k;
srand(time(NULL));
printf("Inserisci righe - colonne: ");
scanf("%d",&righe);
scanf("%d",&colonne);
printf("Inserisci numero di esseri iniziali (minore di %d): ",righe*colonne/2);
scanf("%d",&elementi);
int **matrice = malloc2d(righe,colonne);
printf("%d",matrice[3][4]);
for(i = 0; i < righe; i++)
{
for(k = 0; k < colonne; k++)
{
if(matrice[i][k] == 1)
{
if(lifecontrol(i,k,righe,colonne,matrice) >= 3) destroy(i,k,matrice);
if(lifecontrol(i,k,righe,colonne,matrice) <= 1) destroy(i,k,matrice);
}
else
{
if(lifecontrol(i,k,righe,colonne,matrice) == 3) create(i,k,matrice);
}
}
}
system("pause");
}
Vorrei mantenere la possibilità di allocare dinamicamente la matrice, e anche la possibilità di non dichiarare il puntatore della matrice come elemento globale...
Grazie anticipatamente! :D
Da vero smanettone, la griglia del gioco della vita (struttura dati: matrice) me la alloco dinamicamente secondo la grandezza impostata dall'utente...solo che devo aver fatto un casino coi puntatori...mi va in errore di segmentazione...io lo odioooo quell'errore!!! :D
Il codice è ovviamente incompleto, manca solo il ciclo che fa ciclare ad infinito il processo di creazione/distruzione degli esseri, quello lo avrei implementato dopo aver controllato che tutto era a posto.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int **malloc2d(int, int);
int **malloc2d(int r, int c)
{
int i;
int **t=malloc(r*sizeof(int *));
for (i=0; i<r; i++)
{
t[i]=malloc(c*sizeof(int));
t[i] = 0;
}
return t;
}
void randomize_elements(int **matrice, int elements, int r, int c)
{
int posx, posy, i;
for(i = 0; i < elements; i++)
{
posx = rand() % c;
posy = rand() % r;
matrice[posx][posy] = 1;
}
}
int lifecontrol(int y, int x, int maxy, int maxx, int **mat)
{
int life = 0;
if((y-1)>0 && (x-1)>0) if(mat[y-1][x-1] == 1) life++;
if((x-1)>0) if(mat[y][x-1] == 1) life++;
if((y+1)<maxy && (x-1)>0) if(mat[y+1][x-1] == 1) life++;
if((y+1)<maxy) if(mat[y+1][x] == 1) life++;
if((y+1)<maxy && (x+1)<maxx) if(mat[y+1][x+1] == 1) life++;
if((x+1)<maxx) if(mat[y][x+1] == 1) life++;
if((x+1)<maxx && (y-1)>0) if(mat[y-1][x+1] == 1) life++;
if((y-1)>0) if(mat[y-1][x] == 1) life++;
return life;
}
void destroy(int y, int x, int **mat)
{
mat[y][x] = 0;
}
void create(int y, int x, int **mat)
{
mat[y][x] = 1;
}
int main(void)
{
int righe, colonne, elementi;
int i,k;
srand(time(NULL));
printf("Inserisci righe - colonne: ");
scanf("%d",&righe);
scanf("%d",&colonne);
printf("Inserisci numero di esseri iniziali (minore di %d): ",righe*colonne/2);
scanf("%d",&elementi);
int **matrice = malloc2d(righe,colonne);
printf("%d",matrice[3][4]);
for(i = 0; i < righe; i++)
{
for(k = 0; k < colonne; k++)
{
if(matrice[i][k] == 1)
{
if(lifecontrol(i,k,righe,colonne,matrice) >= 3) destroy(i,k,matrice);
if(lifecontrol(i,k,righe,colonne,matrice) <= 1) destroy(i,k,matrice);
}
else
{
if(lifecontrol(i,k,righe,colonne,matrice) == 3) create(i,k,matrice);
}
}
}
system("pause");
}
Vorrei mantenere la possibilità di allocare dinamicamente la matrice, e anche la possibilità di non dichiarare il puntatore della matrice come elemento globale...
Grazie anticipatamente! :D