Gra w życie - NCurses

0

Witam!
Mam kłopot z grą - wszystko działa w momencie kiedy w kodzie mam umieszczony geth() - problem w tym, że wtedy cykl życia działa, ale trzeba wciskać jakiś klawisz żeby cykl trwał. Natomiast z pominięciem getch() kompletnie nic się nie dzieje, konsola pozostaje czarna. Próbowałem dołączyć do tego funkcję która spowoduje chwilowe zatrzymanie programu i po pewnym czasie cykl rusza, jednak również nie działało to bez geth().

Jak to poprawić?

 #include <ncurses.h>
#include <ctime>
#include <cstdlib>
#include <unistd.h>

void zeruj (int tab[42][42])
{
for (int i=0 ; i<22 ; i++)
    {
        for (int l=0 ; l<22 ; l++)
        {
            tab[i][l] = 0;
        }
    }
}
void losuj (int tab[42][42])
{
for (int i=1 ; i<21 ; i++)
    {
        for (int l=1 ; l<21 ; l++)
        {
            tab[i][l] = (rand()%2)+0;
        }
    }
}

void wypisz (int tab[42][42])
{
for (int i=0 ; i<22 ; i++)
    {
        for (int l=0 ; l<22 ; l++)
        {
            if(tab[i][l]){
                start_color(); //2
                init_pair( 1, COLOR_BLACK, COLOR_RED ); //3
                attron( COLOR_PAIR( 1 ) ); //4
                printw( " " );
                attroff( COLOR_PAIR( 1 ) );
            }
            else {
                printw( " " );
            }
        }
        printw("\n");
    }
}

void sprawdz(int sprawdzana[42][42] , int przepisywana[42][42])
{
    for (int w=1 ; w<21 ; w++)
    {
        for (int k=1 ; k<21 ; k++)
            if (sprawdzana[w][k])                   //żywa komórka
            {
                if      (sprawdzana[w-1][k-1]+sprawdzana[w-1][k]+sprawdzana[w-1][k+1]+sprawdzana[w][k-1]+sprawdzana[w][k+1]+sprawdzana[w+1][k-1]+sprawdzana[w+1][k]+sprawdzana[w+1][k+1] == 3) przepisywana[w][k]=1;
                else if (sprawdzana[w-1][k-1]+sprawdzana[w-1][k]+sprawdzana[w-1][k+1]+sprawdzana[w][k-1]+sprawdzana[w][k+1]+sprawdzana[w+1][k-1]+sprawdzana[w+1][k]+sprawdzana[w+1][k+1] == 2) przepisywana[w][k]=1;
                else    przepisywana[w][k]=0;
            }
            else                                    //martwa komórka
            {
                if(sprawdzana[w-1][k-1]+sprawdzana[w-1][k]+sprawdzana[w-1][k+1]+sprawdzana[w][k-1]+sprawdzana[w][k+1]+sprawdzana[w+1][k-1]+sprawdzana[w+1][k]+sprawdzana[w+1][k+1] == 3) przepisywana[w][k]=1;
            }
    }
    //zamiana tabel
    for (int w=1 ; w<21 ; w++)
    {
        for (int k=1 ; k<21 ; k++)
            sprawdzana[w][k] = przepisywana[w][k];
    }
}

int main ()
{
int tab[42][42] , tab2[42][42];
initscr();
start_color();
zeruj(tab);
losuj(tab);
do {
    wypisz(tab);
    sprawdz(tab,tab2);
    getch();
    move(0,0);
    } while (1==1);
endwin();
return 0;
}
0

uzyj kbhit()
http://www.cprogramming.com/fod/kbhit.html
Ale tylko jezeli to ma byc rozwiazanie wylacznie pod windowsa

0

akurat pracuję na linuksie

0
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
 
void changemode(int);
int  kbhit(void);
int main(void)
{
  int ch;
  changemode(1);
  while ( !kbhit() )
  {
    putchar('.');
  }
 
  ch = getchar();
 
  printf("\nGot %c\n", ch);
 
  changemode(0);
  return 0;
}
 
void changemode(int dir)
{
  static struct termios oldt, newt;
 
  if ( dir == 1 )
  {
    tcgetattr( STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);
  }
  else
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
 
int kbhit (void)
{
  struct timeval tv;
  fd_set rdfs;
 
  tv.tv_sec = 0;
  tv.tv_usec = 0;
 
  FD_ZERO(&rdfs);
  FD_SET (STDIN_FILENO, &rdfs);
 
  select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
  return FD_ISSET(STDIN_FILENO, &rdfs);
 
}

tu masz dla linuxa

albo uzyj biblioteki ncurses

2

Zajrzałem do dokumentacji ncurses (za bardzo jej nie znam) i od razu znalazłem źródło problemu.
www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/helloworld.html#MYST-REFRESH

0

o widzisz, nie spotkałem się wcześniej z refresh().
i na tym polegał problem, dziękuje za pomoc :)

0
bittu napisał(a):

... i na tym polegał problem, dziękuje za pomoc :)
Nie, nie na tym polega problem. @MarekR22 też nigdy nie spotkał się wcześniej z refresh():

MarekR22 napisał(a):

... za bardzo jej nie znam ...
ale to mu nie przeszkodziło w szybkim znalezieniu odpowiedzi.
Więc problem polega nie na niewiedzy lecz na lenistwie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1