Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ncurses.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <unistd.h>
- #include <math.h>
- #include <ctime>
- int main()
- {
- // Initialize ncurses
- setlocale(LC_ALL, "");
- initscr();
- cbreak();
- noecho();
- nodelay(stdscr, TRUE);
- float gps = 20; //generations per second
- uint sheight = 20;
- uint swidth = 30;
- //cell margin
- int mrg=1;
- int mrg2=mrg*2;
- int swm2 = swidth+mrg2;
- int shm2 = sheight+mrg2;
- // Declare the 2D array pointer
- bool** screen;
- bool** screenbuf;
- // Allocate the first dimension of the array
- screen = new bool*[swm2];
- screenbuf = new bool*[swm2];
- // Allocate the second dimension of the array for each row
- for (int i = 0; i < swm2; ++i) {
- screen[i] = new bool[shm2];
- screenbuf[i] = new bool[shm2];
- }
- int exit=0;
- //set zero
- for (int yi = 0; yi < shm2; yi += 1) {
- for (int xi = 0; xi < swm2; xi += 1) {
- screen [xi][yi]=0;
- screenbuf[xi][yi]=0;
- }
- }
- //flyers and a rods
- for(int ofs=0;ofs<4;ofs++){
- int m=4*ofs;
- screen[(1+m)%swm2][(0+m)%shm2]=1;
- screen[(2+m)%swm2][(1+m)%shm2]=1;
- screen[(0+m)%swm2][(2+m)%shm2]=1;
- screen[(1+m)%swm2][(2+m)%shm2]=1;
- screen[(2+m)%swm2][(2+m)%shm2]=1;
- if(ofs%2==1){
- screen[(10+m)%swm2][(0+m)%shm2]=1;
- screen[(10+m)%swm2][(1+m)%shm2]=1;
- screen[(10+m)%swm2][(2+m)%shm2]=1;
- }
- }
- //preview
- clear();
- for (int yi = 0; yi < sheight; yi += 1) {
- for (int xi = 0; xi < swidth; xi += 1) {
- int xb = (xi + swm2 ) % swm2;
- int yb = (yi + shm2 ) % shm2;
- screen[xb][yb] ? printw("██") : printw("░░");
- }
- printw("\n");
- }
- refresh();
- getchar();
- clock_t stclock=0;
- clock_t ndclock,tdelta=0;
- uint long gen = 0;
- //generation loop
- do{
- clear();
- for (int yi = 0; yi < sheight; yi += 1) {
- for (int xi = 0; xi < swidth; xi += 1) {
- int xb = (xi + swm2 ) % swm2;
- int yb = (yi + shm2 ) % shm2;
- screen[xb][yb] ? printw("██") : printw("░░");
- }
- printw("\n");
- }
- printw("gen:%llu gps:%f\n",gen,1000000.0/tdelta);
- clock();
- //copy to buffer
- for (int yi = 0; yi < shm2; yi += 1) {
- for (int xi = 0; xi < swm2; xi += 1) {
- screenbuf[xi][yi]=screen[xi][yi];
- }
- }
- //compute cell rules
- for (int yi = 0; yi < shm2; yi += 1) {
- for (int xi = 0; xi < swm2; xi += 1) {
- int xp = (xi + 1 ) % swm2;
- int xn = (xi - 1 + swm2 ) % swm2;
- int yp = (yi + 1 ) % shm2;
- int yn = (yi - 1 + shm2 ) % shm2;
- bool neig[8]={
- screenbuf[xn][yp], //NE
- screenbuf[xp][yi], //N
- screenbuf[xp][yp], //NW
- screenbuf[xn][yi], //W
- screenbuf[xp][yn], //SW
- screenbuf[xi][yp], //S
- screenbuf[xn][yn], //SE
- screenbuf[xi][yn] //E
- };
- int neigsum=0;
- for(int i=0; i<sizeof(neig);i++){
- neigsum+=neig[i];
- }
- if(neigsum==3){
- screen[xi][yi]=1;
- }else if(neigsum==2){
- }else{
- screen[xi][yi]=0;
- }
- }
- }
- gen++;
- //read key
- do{
- ndclock=clock();
- tdelta = ndclock-stclock;
- int keypress=getch();
- if (keypress != ERR) {
- switch (keypress) {
- case 'q': //quit
- exit = 1;
- break;
- case '1': //slow down
- gps/=2;
- break;
- case '2': //gps rst
- gps=10;
- break;
- case '3': //speed up
- gps*=2;
- break;
- }
- }
- }while(tdelta<1000000/gps);
- usleep(1000000/gps/2);
- stclock=clock();
- }while(!exit);
- endwin();
- //delete
- for (int i = 0; i < swm2; ++i) {
- delete[] screen[i];
- }
- delete[] screen;
- for (int i = 0; i < swm2; ++i) {
- delete[] screenbuf[i];
- }
- delete[] screenbuf;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement