Ayuda con "juego de la vida" en C

Muy wenas ^^

Tengo que hacer un algoritmo con "El juego de la vida" en C, pero tras muchas vueltas que le doy a la funcion donde me cuenta los vecinos de los bichos sigue sin funcionar, probablemente sea un fallo tonto, pero no consigo dar con el T.T

Explicacion del juego

1. Aquellos insectos que tienen 0, 1, 4, 5, 6, 7 u 8 vecinos mueren
2. Los insectos que tienen 2 o 3 vecinos sobreviven
3. En celdas vacias cuya vecindad hay 3 insectos, nace uno nuevo
4. Los insectos que nacen o mueren no afectan las reglas hasta que
se ha completado un ciclo evolutivo



El Programa se ejecuta con normalidad, pero a la hora de llegar a la funcion "vecino" se me vuelve loco xD y no se que hacer [noop]

Asi que Yo OS INVOCO ^^

Os dejo el codigo fuente...

EDIT: Os lo adjunto en el 3º post que aqui ya no me deja y t
no sé en que consiste el juego [buuuaaaa] pero vamos, no tienes el código tabuladito como dios manda por ahí? es horrendo leer todo ahi junto XD
juas escribió:no sé en que consiste el juego [buuuaaaa] pero vamos, no tienes el código tabuladito como dios manda por ahí? es horrendo leer todo ahi junto XD


Mucha razon tienes, Edito el primer post y adjunto aqui ^^

EDIT: Actualizo El codigo fuente ^^ en mi siguiente post

saludos
La verdad que veo el codigo un poco raro, por ejemplo mira lo que pasaría aqui:

for(fila=0;fila{
___escribir(matriz);
___for(columna=0;columna___{
______if(matriz[fila-1][columna-1]=='*');


En la primera pasada del 'for' mas externo, fila vale 0, pintas el tablero (por que lo pintas ahi, y no justo antes/despues de cada ciclo?? no lo he probado pero creo que te va a pintar 'fila' veces el tablero en cada ciclo, pero incluso eso no es el problema...), entras al segundo for y compruebas la matriz de [fila-1][columna-1].....pero fila y columna valen 0, y te estas saliendo de la matriz!!! Tienes que filtrar los casos que caen en los bordes, para los -1 y también para los que estén en el límite+1.

Ya puestos, esa parte del código me parece algo extraña. Yo me lo replantearía y haría algo así:

escribir(matriz);
for(fila=0;fila{
___for(columna=0;columna___{
______switch(numVecinos(matriz,fila,columna))
______{
_______case 2:matriz_auxiliar[fila][columna]='*';break;
_______case 3: //Crear un hijo donde quieras, no se como hacerlo ahora mismo xDD
_______break;
_______}
___}
}
copiarMatriz(matriz,matriz_aux);


La función 'numVecinos()' sería la que devolviese el numero de vecinos de una celda dada, y en la que controlarías el no salirte fuera de la matriz. También pongo una matriz auxiliar, que debería estar inicializada a espacios, donde irias creando los hijos para que no afecten hasta el ciclo siguiente. Para lo de crear nuevos bichos no se... haz un rand() de 1 a 8, y asignas un numero a cada dirección, por ejemplo

1 2 3
4 X 5
6 7 8

siempre controlando que no crees nada fuera de los límites. Espero haberte ayudado.
FORMAT C


Y deate de tonterias ... xD
Bueno, he estado un rato liado con el programa y me ha quedado asi, aun tienes fallos


Elrogos: Gracias, creo que no me habria dado cuenta de ese fallo por mi mismo ^^

Actualizo con el codigo fuente tal y como lo llevo, sigue fallando en una parte, creo que tiene que ver con los for de la funcion vecino, ya que las condiciones a la hora de contar los vecinos creo que ya estan bien

Adjuntos

bueno boludo creo que deverias revisar tu forma de programar porque un informático de verdad jamas hace lo mismo que usded. Espero que tome mis palabras como algo positivo y mejore a partir de este momento.
saulotmalo escribió:bueno boludo creo que deverias revisar tu forma de programar porque un informático de verdad jamas hace lo mismo que usded. Espero que tome mis palabras como algo positivo y mejore a partir de este momento.


¿Poner 1000 if?
¿Pedir ayuda para un algoritmo que tengo que entregar mañana?
¿Postear el codigo fuente en un foro?

Si me especificas a que te refieres me ayudarias mas XD tambien hay que decir que no llevo ni 6 meses programando, que estoy aprendiendo lo que tengan que corregirme mejor ahora que cuando tenga mis habitos bien marcados...

Saludos y gracias a todos los que me estan ayudando ^.^
Arkkey escribió:
¿Poner 1000 if?
¿Pedir ayuda para un algoritmo que tengo que entregar mañana?
¿Postear el codigo fuente en un foro?

Si me especificas a que te refieres me ayudarias mas XD tambien hay que decir que no llevo ni 6 meses programando, que estoy aprendiendo lo que tengan que corregirme mejor ahora que cuando tenga mis habitos bien marcados...

Saludos y gracias a todos los que me estan ayudando ^.^



hombre pues asi de entrada, usa las tabulaciones y { }

pq he estado intentando mirar tu código y la verdad lo dejado porque resultaba incomprensible


salu2
A mi sí me salen las tabulaciones correctamente, y la verdad, no veo el código tan incomprensible, en realidad es bien legible...

Lo único que animo al autor es a comentar el código, creo que no tiene NI UN comentario.

En programillas así aún tira que te va, pero cuando tienes ejecutables de 30 megas, si no has escrito comentarios el programador que vaya detrás de ti se acordará de toda tu familia durante los próximos 6 meses.

Te ayudaría con el código en sí, pero tengo C más que oxidado desde hace lo menos 8 ó 9 años (es lo que tiene trabajar desde entonces con VB .NET).

Un saludo.
Metis Connetis escribió:A mi sí me salen las tabulaciones correctamente, y la verdad, no veo el código tan incomprensible, en realidad es bien legible...

Lo único que animo al autor es a comentar el código, creo que no tiene NI UN comentario.

En programillas así aún tira que te va, pero cuando tienes ejecutables de 30 megas, si no has escrito comentarios el programador que vaya detrás de ti se acordará de toda tu familia durante los próximos 6 meses.

Te ayudaría con el código en sí, pero tengo C más que oxidado desde hace lo menos 8 ó 9 años (es lo que tiene trabajar desde entonces con VB .NET).

Un saludo.


Mil perdones XD es que tengo la mania de dejar los comentarios para el final, que es cuando lo tengo terminado y no lo mezclo con el codigo a la hora de leerlo XD
Va, veo que no has hecho lo de reescribir el codigo como te dije pero bueno xDDD... Me he dado cuenta de otro fallo, y es que no inicializas vecinos a 0 hasta el final las comprobaciones de cada casilla, con lo que la primera vez puede que estes usando valores basura. Yo lo haría justo en la primera instruccion del ciclo.

Otra cosa, te recomiendo que uses llaves para los ifs, for, whiles... SIEMPRE, aunque solo tengas una instrucción o muchos if anidados como aquí, se lee más claro, y si luego es que tienes que añadir algo es menos problemático. Por ejemplo, creo que era tu intención no ponerlas aquí por que has interpretado el if anidado:

for(i=0;i{
___//Yo pondría aqui lo de vecinos=0;
___for(fila=0;fila___{
______for(columna=0;columna______{<-------------ESTA
_________if(fila==0 && columna==0)
_________{
____________
_________}
_________else
_________if .....

_________if(vecino<=1)
____________matriz2[fila][columna]=' ';
_________else
__________if(vecino>=4)
_____________
_________vecino=0;
______}<--------------ESTA


Las llaves en negrita (no se veían muy bien, así que he puesto las flechas y tal...) es a lo que me refiero, como te faltan, el if anidado grande te lo hace una vez para cada casilla, pero el if(vecino<=1)... te lo va a hacer solo una vez para cada fila :S.

Más cosas, en las comprobaciones no uses 'if columna == 9', si tienes un define N = 9 , pon la N en la comparación y si quieres cambiarla solo la cambias en el define.

Ahora, sobre lo que te dicen de los comentarios: ni caso, si son programas tan chorras que los haces para entregar y no tienes ningún interés en mantenerlos a largo plazo, pon solamente los comentarios que TU necesites para aclararte las ideas. Personalmente a mi en la carrera en mis primeros programas me han llegado a bajar nota por poner comentarios donde no hacian falta; esta claro que después de eso los ha vuelto a poner su p**a madre, y no me han vuelto a decir nada sobre su ausencia [oki]

Saludos
Personalmente a mi en la carrera en mis primeros programas me han llegado a bajar nota por poner comentarios donde no hacian falta


¡Vaya somera tontería!.

Por varias razones;

A) SIEMPRE hay que comentar el código, sobre todo si estás empezando a programar para habituarte a ello.

B) Cualquier empresa que se precie tiene una aplicación para reducir el tamaño del ejecutable final que elimina los comentarios y los espacios en blanco entre línea y línea.

C) Incluso en las aplicaciones más "chorras", por muy pequeñas que sean, si has de llevar el mantenimiento de estas, los comentarios son ayuda crucial para el buen entendimiento del código (sobre todo si tu antecesor no ha documentado nada, cosa más que habitual porque el tiempo no es una de las cosas que sobra a los programadores).

Cuando digo tontería lo digo por tu profesor, no por tu comentario. He dado clases de programación (a nivel básico, pseudo código principalmente, por supuesto nada de nivel facultad ni mucho menos) a grupos reducidos y siempre he recalcado la importancia de los comentarios.

Un saludo.
A nosotros también nos han recalcado la importancia de los comentarios. En la teoría.El profesor que luego te corrije las prácticas lo considera totalmente innecesario, y al final es el que te pone la nota.

De todas formas, lo he dicho refiriendome a programas del tipo este, que son una verdadera tontería y en cuanto lo entreges te olvidas de él y no va a haber nada que mantener, en cuanto lo termines el profesor lo evalua y punto pelota. Está claro que en códigos más complicados/extensos, un comentario de vez en cuando viene bien, y no te quepa duda que yo también los uso.

Dicho esto, cada uno cuando haga incluso estos programas chorras que haga lo que quiera, pero yo creo que si estas haciendo un trabajillo corto, uno tiene que ser capaz de acordarse de qué ha hecho y por qué sin necesidad de comentar en exceso.
Metis Connetis escribió:
B) Cualquier empresa que se precie tiene una
aplicación para reducir el tamaño del ejecutable final que elimina los
comentarios y los espacios en blanco entre línea y línea.


Tenia entendido que el mismo compilador eliminaba los comentarios al crear el ejecutable, no es asi?


Bueno, lo he editado, a ver que te parece.

Adjuntos

Pues ya esta terminado, he editado un poco el codigo de Darix2006 para que quede mas a mi estilo a la hora de programar XD

Solo me queda daros las gracias a todos los que me habeis ayudado, sin vosotros no habria terminado el algoritmo ^.^'

Muchas gracias, y si necesitais algo ya sabeis donde estoy ^.^

Saludos!!
Metis Connetis escribió:

¡Vaya somera tontería!.

Por varias razones;

A) SIEMPRE hay que comentar el código, sobre todo si estás empezando a programar para habituarte a ello.

B) Cualquier empresa que se precie tiene una aplicación para reducir el tamaño del ejecutable final que elimina los comentarios y los espacios en blanco entre línea y línea.

C) Incluso en las aplicaciones más "chorras", por muy pequeñas que sean, si has de llevar el mantenimiento de estas, los comentarios son ayuda crucial para el buen entendimiento del código (sobre todo si tu antecesor no ha documentado nada, cosa más que habitual porque el tiempo no es una de las cosas que sobra a los programadores).

Cuando digo tontería lo digo por tu profesor, no por tu comentario. He dado clases de programación (a nivel básico, pseudo código principalmente, por supuesto nada de nivel facultad ni mucho menos) a grupos reducidos y siempre he recalcado la importancia de los comentarios.

Un saludo.


Los comentarios tienen que ayudar a hacer inteligible el código... Poner miles de comentarios no sirve de nada si no son útiles. En mi caso yo suelo documentar las funciones y además en caso de que hayan cosas dentro de las funciones que no queden claras las documento tambien.

Los compiladores tienen varias capas... de ellas está el lexico sintactico semantico generación de código. Por lo que.. decir que las compañias tienen un software para quitar comentarios es una tontería ya que en al análisis sintactico no llegan por lo tanto no engrosan el tamaño del ejecutable. Tened en cuenta que eso es distinto a compilar con los símbolos de debug.
16 respuestas