#include <allegro.h>
//wymiary
//int WX = 640, WY = 480;
//int WX = 320, WY = 240;
//int WX = 160, WY = 120;
int WX = 400, WY = 400;
/////////////////////////
volatile long speed = 0;
void increment_speed()
{
speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_FUNCTION(increment_speed);
/////////////////////////
volatile int close_button_pressed = FALSE;
void close_button_handler(void)
{
close_button_pressed = TRUE;
}
END_OF_FUNCTION(close_button_handler)
//////////////////////////
int mx=0,my=0,mb=0;
void myszka()
{
if( mx != mouse_x || my != mouse_y || mb != mouse_b)
{
mx = mouse_x;
my = mouse_y;
mb = mouse_b;
}
};
// obliczanie koloru
int kolor(short unsigned int p)
{
p /= 255;
if(p == 0)
{return makecol(0,255,0);}
else if(p>0 && p<=127)
{return makecol(2*p,255,0);}
else if(p>127 && p<255)
{return makecol(255,255 - 2*p,0);}
else
{return makecol(255,0,0);}
}
/////////////////////////////////////////////////////////
int main()
{
allegro_init();
LOCK_FUNCTION(close_button_handler);
set_close_button_callback(close_button_handler);
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,WX,WY,0,0);
install_mouse();
set_mouse_speed(5,5);
show_mouse(screen);
unscare_mouse();
install_timer();
install_int_ex(increment_speed, BPS_TO_TIMER(200));
srand(10);
BITMAP *bufor = NULL;
short unsigned int baza[WY][WX];
short unsigned int bazaBufor[WY][WX];
//zerowanie
for(int y=0; y<WY; y++) for(int x=0; x<WX; x++) {baza[y][x] = 0; bazaBufor[y][x] = 0;}
bool flagaZycia = true;
bufor = create_bitmap(WX,WY);
while (!key[KEY_ESC] && !close_button_pressed)
{
clear_to_color(bufor, makecol(100,100,100));
myszka();
// sterowanie
if( key[KEY_A] ){flagaZycia = true;}
if( key[KEY_S] ){flagaZycia = false;}
if( key[KEY_X] ){for(int y=0; y<WY; y++) for(int x=0; x<WX; x++) {baza[y][x] = 0; bazaBufor[y][x] = 0;}}
// glider dla LPM
if(mb == 1)
{
baza[my%WY][(mx+1)%WX] = 1;
baza[(my+1)%WY][(mx+2)%WX] = 1;
baza[(my+2)%WY][mx%WX] = 1;
baza[(my+2)%WY][(mx+1)%WX] = 1;
baza[(my+2)%WY][(mx+2)%WX] = 1;
}
// losowe dla PPM
if(mb == 2)
{
baza[(my-1+WY)%WY][(mx-1+WX)%WX] = rand()%2;
baza[(my-1+WY)%WY][mx] = rand()%2;
baza[(my-1+WY)%WY][(mx+1)%WX] = rand()%2;
baza[my][(mx-1+WX)%WX] = rand()%2;
baza[my][mx] = rand()%2;
baza[my][(mx+1)%WX] = rand()%2;
baza[(my+1)%WY][(mx-1+WX)%WX] = rand()%2;
baza[(my+1)%WY][mx] = rand()%2;
baza[(my+1)%WY][(mx+1)%WX] = rand()%2;
}
//obliczanie cyklu
for(int y=0; y<WY; y++)
{
for(int x=0; x<WX; x++)
{
int otoczenie =
(bool)baza[ (y-1+WY)%WY ][ (x-1+WX)%WX ] +
(bool)baza[ (y-1+WY)%WY ][ x ] +
(bool)baza[ (y-1+WY)%WY ][ (x+1)%WX ] +
(bool)baza[ y ][ (x-1+WX)%WX ] +
(bool)baza[ y ][ (x+1)%WX ] +
(bool)baza[ (y+1)%WY ][ (x-1+WX)%WX ] +
(bool)baza[ (y+1)%WY ][ x ] +
(bool)baza[ (y+1)%WY ][ (x+1)%WX ];
if( (baza[y][x] == 0) && (otoczenie == 3) ){bazaBufor[y][x] = 1;}
if( (baza[y][x] > 0) && (otoczenie == 3 || otoczenie == 2) ){bazaBufor[y][x] = baza[y][x];}
if( (baza[y][x] > 0) && (otoczenie != 3 && otoczenie != 2) && flagaZycia ){bazaBufor[y][x] = 0;}
if( (bazaBufor[y][x] > 0) && (bazaBufor[y][x] == baza[y][x]) )
{
if( baza[y][x] < 65400 )
bazaBufor[y][x] += 100;
}
}
}
//rysowanie
for(int y=0; y<WY; y++)
{
for(int x=0; x<WX; x++)
{
if(baza[y][x]){putpixel(bufor, x, y, kolor(baza[y][x]));}
baza[y][x] = bazaBufor[y][x];
}
}
//info
textprintf_ex(bufor,font,20,40,makecol(200,200,200),-1, "smierc: A wl, S wyl; X reset");
blit(bufor,screen,0,0,0,0,WX,WY);
clear_keybuf();
}
destroy_bitmap(bufor);
allegro_exit();
return 0;
}
END_OF_MAIN()
/////////////////////////////////////////////////////////