Game of Life

    -- Sebastian Pawlak, 2003.


Erozja została zaimplementowana z wykorzystaniem biblioteki graficznej SDL w Microsoft Visual Studio.


Kod źródłowy pliku "Erozja.cpp":

/******************************
 *           EROZJA           *
 *      Sebastian Pawlak      *
 ******************************/

#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "..\SDL-1.2.5\include\sdl.h"
#include "..\SDL-1.2.5\include\SDL_endian.h"

void Slock(SDL_Surface *screen)
{
    if (SDL_MUSTLOCK(screen) && SDL_LockSurface(screen) < 0)
        return;
}


void Sulock(SDL_Surface *screen)
{
    if (SDL_MUSTLOCK(screen))
        SDL_UnlockSurface(screen);
}


void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    if (SDL_MUSTLOCK(screen) && SDL_LockSurface(screen) < 0)
        return;

    switch (screen->format->BytesPerPixel) {
        case 1: { /* 8-bpp */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y * screen->pitch + x;
            *bufp = color;
        }
        break;

        case 2: { /* 15-bpp lub 16-bpp */
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + y * screen->pitch / 2 + x;
            *bufp = color;
        }
        break;

        case 3: { /* powolony tryb 24-bpp */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y * screen->pitch + x * 3;
            if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {
                bufp[0] = color;
                bufp[1] = color >> 8;
                bufp[2] = color >> 16;
            } else {
                bufp[2] = color;
                bufp[1] = color >> 8;
                bufp[0] = color >> 16;
            }
        }
        break;

        case 4: { /* 32-bpp */
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + y * screen->pitch / 4 + x;
            *bufp = color;
        }
        break;
    }

    if (SDL_MUSTLOCK(screen))
        SDL_UnlockSurface(screen);
}


enum {
    MAXX = 512,  /* rozmiar planszy */
    MAXY = 512
};


short int plansza[MAXX][MAXY];  /* plansza aktualna */
short int plansza2[MAXX][MAXY]; /* plansza po przeksztalceniach */


int main(int argc, char* argv[])
{
    /* losowe tworzenie planszy poczatkowej */
    for (int x = 0; x < MAXX; x++)
        for (int y = 0; y < MAXY; y++) {
            int w = rand() % 100;
            if (w < 80)
                plansza2[x][y] = plansza[x][y] = 1;
            else
                plansza2[x][y] = plansza[x][y] = 0;
        }

    /* inicjalizacja biblioteki SDL */
    SDL_Init(SDL_INIT_VIDEO);
    atexit ( SDL_Quit ) ;
    SDL_Surface *pSurface = SDL_SetVideoMode(MAXX, MAXY, 0, SDL_ANYFORMAT);
    SDL_Event event;
    SDL_WM_SetCaption("Erozja", NULL);

    while (1) {

        Slock(pSurface);

        SDL_Rect rect = { 0, 0, MAXX, MAXY };
        SDL_FillRect(pSurface, &rect, SDL_MapRGB(pSurface->format, 255, 255, 255));

        for (x = 1; x < MAXX - 1; x++)
            for (int y = 1; y < MAXY - 1; y++) {

                /* zmiana stanu automatu */
                if (plansza[x][y] == 1) {
                    if ((plansza[x-1][y-1] == 0 && plansza[x-1][y] == 0 &&
                             plansza[x-1][y+1] == 0) ||
                        (plansza[x+1][y-1] == 0 && plansza[x+1][y] == 0 &&
                             plansza[x+1][y+1] == 0) ||
                        (plansza[x-1][y-1] == 0 && plansza[x][y-1] == 0 &&
                             plansza[x+1][y-1] == 0) ||
                        (plansza[x-1][y+1] == 0 && plansza[x][y+1] == 0 &&
                             plansza[x+1][y+1] == 0))
                        plansza2[x][y] = 0;
                }

 
                /* wyswietlanie komorki na ekranie */
                if (plansza[x][y] == 1)
                    DrawPixel(pSurface, x, y, 198, 156, 109);

            }

        Sulock(pSurface);
        SDL_Flip(pSurface);

        /* kopiowanie planszy wynikowej do planszy pierwotnej */
        for (x = 0; x < MAXX; x++)
            memcpy(&plansza[x][0], &plansza2[x][0], sizeof(plansza[0][0]) * MAXY);


        /* obsluga zdarzen */
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT)
                exit(0);

            if (event.type == SDL_MOUSEBUTTONDOWN)
                plansza[event.button.x][event.button.y] =
                    plansza2[event.button.x][event.button.y] = 1;
        }

    }

    return 0;
}
w3cw3c
automatyka przemysłowa