Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: wlan0 en Noviembre 17, 2013, 06:13:27 pm

Título: [C++] Juego de la vida de conway [Mi versión]
Publicado por: wlan0 en Noviembre 17, 2013, 06:13:27 pm
Sé que ya existe un post con un código en C++ que subió un usuario, pero de todas formas quería dejar el mio. Practicamente es el mismo juego, pero está desarrollado sobre la libreria SDL. Aquí los codigos :)

game.h
Código: [Seleccionar]
#include <SDL/SDL.h>

#define SCREEN_WIDTH 500
#define SCREEN_HEIGHT 400
#define cellsLevel 4 // 1-10. 1=null, 10=max

class Game{
        public:
                int gameTable[SCREEN_WIDTH][SCREEN_HEIGHT];
                int gameTableTMP[SCREEN_WIDTH][SCREEN_HEIGHT];
                void initGraphics();
                void updateBoard();
                void initBoard();
                void checkNeighbors();
};

game.cpp
Código: [Seleccionar]
#include "game.h"
#include <cstdlib>
#include <iostream>

SDL_Surface* screen;
using namespace std;

int randomNumber;
int randomNumber2;

Uint32 colors[4] = {0xCC99FF,0x99CC33,0xCC6699,0xCC3333};

bool rainbowMode = false; //turn true it if you want to go crazy
 
void Game::initGraphics(){
        SDL_Init( SDL_INIT_EVERYTHING );
        SDL_WM_SetCaption("Conway's game of life", "Conway's game of life");
        screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 24,SDL_SWSURFACE);
        SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format,51,46,46));
}

void Game::checkNeighbors(){
        for(int i=1; i<SCREEN_WIDTH-1; i++){
                for(int j=1; j<SCREEN_HEIGHT-1; j++){
                        int result = gameTable[i][j+1]+gameTable[i][j-1]+gameTable[i+1][j]+gameTable[i-1][j]+gameTable[i-1][j-1]+gameTable[i+1][j-1]+gameTable[i+1][j+1]+gameTable[i-1][j+1];
                        if (gameTable[i][j]==0 && result==3){ //checking if cell can born
                                gameTableTMP[i][j] = 1;
                        } else if(gameTable[i][j]>0 && result==2 || result==3){ //checking if cell can survive
                                gameTableTMP[i][j] = 1;
                        } else if(gameTable[i][j]>0 && result>=4){ //checking if cell could die for superpoblation
                                gameTableTMP[i][j] = 0;
                        } else {
                                gameTableTMP[i][j] = 0; //else, dead
                        }
                }
        }


        for(int i=1; i<SCREEN_WIDTH-1;i++){
                for(int j=1; j<SCREEN_HEIGHT-1; j++){
                        gameTable[i][j] = gameTableTMP[i][j];
                }
        }


}

void Game::initBoard(){
        for(int i=0; i<SCREEN_WIDTH; i++){
                for(int j=0; j<SCREEN_HEIGHT; j++){
                                 randomNumber= (rand()%10)+1;
                                if (randomNumber<cellsLevel){
                                        gameTable[i][j] = 1;
                                } else {
                                        gameTable[i][j] = 0;
                                }
                }
        }
}

void Game::updateBoard(){       
        for(int i=0; i<SCREEN_WIDTH; i++){
                for(int j=0; j<SCREEN_HEIGHT; j++){
                        if (gameTable[i][j]==1){
                                randomNumber2 = (rand()%4)+1;
                                SDL_Rect rect = {i*5,j*5,5,5};
                                if (rainbowMode){
                                        SDL_FillRect(screen, &rect, colors[randomNumber2]);
                                } else {
                                        SDL_FillRect(screen, &rect, 0x66FFCC);
                                }
                        } else {
                                SDL_Rect rect = {i*5,j*5,5,5};
                                SDL_FillRect(screen, &rect, 0x333366);
                        }
                }
        }

        SDL_Flip(screen);
}

main.cpp
Código: [Seleccionar]
#include "game.h"
#include <iostream>
Game c;
using namespace std;
SDL_Event event;

bool life = true;

Uint32 doSomething(Uint32 interval, void *parm)
{
        c.checkNeighbors();
    char *msg;
    if(parm)
        msg = (char *)parm;
    cout << msg << endl;
    return interval;
}


int main(){
        c.initGraphics();
        c.initBoard();
        SDL_TimerID timer_id = SDL_AddTimer(300,doSomething,(void *)"Updating screen");
        while(life){
                c.updateBoard();
                if (SDL_PollEvent(&event)){
                        if (event.type == SDL_QUIT){
                                life=false;
                        }
                }
        }
        SDL_Quit();
        return 0;
}

Pueden descargarlo o forkearlo desde el repositorio de mi cuenta de github: https://github.com/wlan0/Conway-s-life-of-game/ (https://github.com/wlan0/Conway-s-life-of-game/)

Saludos!