Razón Artificial

La ciencia y el arte de crear videojuegos

El juego de la vida en C++

Escrito por adrigm el 29 de julio de 2010 en Inteligencia Artificial, Programación | 9 Comentarios.

Buenas, volviendo un poco con el tema de la vida artificial que lo tengo apartado, ahora que estoy aprendiendo C++ he vuelto a los orígenes y he programado una versión del juego de la vida para consola usando C++ y la STL, biblioteca que quiero conocer.

Ya sabía algo de C básico, pero ahora quiero pasar el desarrollo de videojuegos a C++ y me he puesto a aprender Orientación a Objetos en C++ y a usar la STL que es una gran biblioteca estándar de C++ que contiene muchas cosas que nos facilitan el trabajo. Bueno después del salto dejo el código.

#include <iostream>
#include <cstdlib>
#include <vector>
#include <unistd.h>

using namespace std;

class Mapa
{
public:
	int fil;
	int col;
	int vecinos;
	vector<vector<int> > mapa;

	Mapa(int f, int c);
	void dibujar();
	int analizarVecinos(int posf, int posc);
	void ciclo();
};

Mapa::Mapa(int f, int c)
{
	fil = f;
	col = c;
	mapa.resize(fil);
	for(int i=0; i<mapa.size(); i++)
	{
		mapa[i].resize(col);
	}

	for(int f=0; f<fil; f++)
	{
		for(int c=0; c<col; c++)
		{
			mapa[f]1 = rand()%2;
		}
	}
}

void Mapa::dibujar()
{
	for(int f=0; f<fil; f++)
	{
		for(int c=0; c<col; c++)
		{
			if(mapa[f]1 == 1)
				cout << "* ";
			else
				cout << ". ";
		}
		cout << "\n";
	}
}

int Mapa::analizarVecinos(int posf, int posc)
{
	vecinos = 0;
	if(posf-1 >= 0 and posc-1 >= 0)
		if(mapa[posf-1][posc-1] == 1)
			vecinos++;
	if(posf-1 >= 0)
		if(mapa[posf-1][posc] == 1)
			vecinos++;
	if(posf-1 >= 0 and posc+1 <= col-1)
		if(mapa[posf-1][posc+1] == 1)
			vecinos++;
	if(posc-1 >= 0)
		if(mapa[posf][posc-1] == 1)
			vecinos++;
	if(posc+1 <= col-1)
		if(mapa[posf][posc+1] == 1)
			vecinos++;
	if(posf+1 <= fil-1 and posc-1 >= 0)
		if(mapa[posf+1][posc-1] == 1)
			vecinos++;
	if(posf+1 <= fil-1)
		if(mapa[posf+1][posc] == 1)
			vecinos++;
	if(posf+1 <= fil-1 and posc+1 <= col-1)
		if(mapa[posf+1][posc+1] == 1)
			vecinos++;
	return vecinos;
}

void Mapa::ciclo()
{
	vector<vector<int> > nueva_conf = mapa;

	for (int f=0; f<fil; f++)
	{
		for(int c=0; c<col; c++)
		{
			int n_vecinos = analizarVecinos(f, c);
			if(mapa[f]1 == 0)
			{
				if(vecinos == 3)
					nueva_conf[f]1 = 1;
				else
					nueva_conf[f]1 = 0;
			}
			if (mapa[f]1 == 1)
			{
				if(vecinos == 2 || vecinos == 3)
					nueva_conf[f]1 = 1;
				else
					nueva_conf[f]1 = 0;
			}
		}
	}

	mapa = nueva_conf;
}

int main()
{
	srand(time(NULL));
	Mapa mapa(20, 20);
	while(1)
	{
		mapa.dibujar();
		usleep(100000);
		system("clear");
		mapa.ciclo();
	}
}

9 Comentarios en "El juego de la vida en C++"

  1. shock dice:

    y qué hace? :P

  2. Bline dice:

    Esa fue mi primera práctica en estructuras de datos y de la información para ir tomando cercanía con el C++ :p

  3. adrigm dice:

    Bline, a ver si las mías son así, el año que viene empiezo la carrera.

  4. Wadk dice:

    Yo hice lo mismo una vez:
    http://host-a.net/Ideka/liife_es.rar
    Sólo que es para Wii, y me olvidé de cómo compilarlo.
    =D

  5. Aljenci dice:

    Lol.

    Adri, si el año que viene empiezas la carrera, por lo que he visto en todo el blog…

    Te aburrirás en clase una barbaridad xDD

    Te deberían convalidar asignaturas, al menos las básicas de programación del primer curso.

    Saludos!

  6. adrigm dice:

    jajaja no! estoy deseando empezar y aprender de verdad con base para ser mucho mejor. Y por lo que he visto en primero más bien es matemática pura y dura tanto análisis como álgebra.

  7. Zombie Girl dice:

    Hola, buenas.

    ¿De casualidad tú no eres adrigm el de los foros de la Comunidad Hispana de RPG Maker?

    Eso del juego de la vida me lo han dejado a mí en un curso de la universidad, jeje. Espero poder resolverlo.

    ¡Un saludo!

Deja un comentario