#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() /////////////////////////////////////////////////////////