Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ncurses - multiple windows and refreshing

Tags:

c

windows

ncurses

I'm writing a small school project. It's a game of falling words - the word is moving from the top to the bottom. I had an idea to make two windows (one with interface and second with moving object). Words are randomized as you can see in the code. The problem is the input. I'm using mvwsacanw to write the word. Is there any way to write anything in second window while the word is moving in different window? For now the word is falling and when it reaches the bottom, the second window opens and I can type the word.

Hope somebody will help me.

#include <stdio.h>
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

void moving(WINDOW *move)
{
    int j,random;
    char *cmp=(char*)malloc(10*sizeof(char));
    char word[6];

    wclear(move);
    box(move, 0, 0);
    mvwprintw(move, 1, 1, "PIS");
    wrefresh(move);

    srand (time (NULL));
    random=2+rand()%7;
    for(j=0; j< random ; j++) //random word
    {
        word[j]= rand()%26+'a';
    }

    int poz = 2+rand()%24; //random position of moving word


    for(int i=1; i<18; i++)
    {
        wclear(move);
        box(move,0,0);
        mvwprintw(move,i, poz, word);
        wrefresh(move);
        usleep(300000);
    }
}

void interface(WINDOW *ui)
{
    wclear(ui);
    char *cmp=(char*)malloc(10*sizeof(char));
    box(ui, 0, 0);
    mvwprintw(ui,1,1,"wpisz wyraz: ");
    mvwscanw(ui,2,1, "%s",cmp);

    mvwprintw(ui, 3, 1, "->%s",cmp);
    wrefresh(ui);
}


int main(int argc, char *argv[])//int argc, const char * argv[])
{
    int x,y;
    int sc = 3;
    initscr();
    noecho();
    curs_set(FALSE);

    getmaxyx(stdscr, y,x);

    WINDOW *move = newwin(y-5, x-1, 0, 0);
    WINDOW *ui = newwin(sc+2, x, y-5, 0);

    while(1)
    {
    moving(move);
    interface(ui);
    wclear(move);
    wclear(ui);
    }

    delwin(move);
    delwin(ui);
    endwin();
    return 0;
}
like image 935
mikro098 Avatar asked Dec 22 '14 17:12

mikro098


1 Answers

You can't do that with your current code structure. You are keeping the word fall phase and the input phase in separate functions, so the only way to make them work at the same time is some kind of multithreading. Assuming this is not what you want to do, you could try to merge the two features in a single function. In pseudocode:

pick random word
pick random position
set i = 0
set input = {} //empty array
do
> print word at (i, pos)
> set stoptime = time() + DELAY
> do
>> set c = getch()
>> append c to input
>> print interface
> while (time() < stoptime)
> i++
while (i < 18)

This, with timeout() set to an opportune delay, will give the impression that everything is happening simultaneously. This is absolutely not the most efficient solution, but is simple and straightforward, and considering you are working on a school project, it should be just fine

like image 145
AquilaIrreale Avatar answered Oct 16 '22 12:10

AquilaIrreale