ncurses – wyświetlanie znaku spadającego z określoną prędkością

0

Witam, chciałbym napisać program z wykorzystaniem biblioteki <ncurses.h> w którym na górze ekranu pojawiać się będzie z góry ustalony znak [] w losowej liczbie i będzie on spadał z losową prędkością.
Kod który zamieszczony jest niżej powoduje pojawienie się 3 [] ustawionych w kolejności na górze i spadających z losową prędkością, ale niestety wszystkie z tą samą.

Chciałbym uzyskać efekt, aby liczba pojawiających się "obiektów" na górze ekranu była losowa oraz każdy miał własną prędkość spadania.

Załącznik nc pokazuje jak to wygląda u mnie, a nc2 jak chciałbym żeby wyglądało.
Proszę o pomoc

Kod nc:

#include <ncurses.h>
#include <unistd.h>
#include <random>

int main(int argc, char* argv[])
{

    int x = 0;
    int y = 0;
    int q1 = 0;
    int w1 = 2;
    int q2 = 0;
    int w2 = 4;

    initscr();
    noecho();

    while (1) {
        clear();
        mvprintw(y, x, "[]");
        mvprintw(q1, w1, "[]");
        mvprintw(q2, w2, "[]");

        refresh();
        usleep(rand() % 500000 + 5000);
        y++;
        q1++;
        q2++;
    }
    getch();
    endwin();
}
0

Spadają z losową, ale tą samą prędkością, bo wszystkie inkrementujesz jednocześnie:

    while (1) {
        clear();
        mvprintw(y, x, "[]");
        mvprintw(q1, w1, "[]");
        mvprintw(q2, w2, "[]");
 
        refresh();
        usleep(rand() % 500000 + 5000);
        y++;
        q1++;
        q2++;
    }

Przy okazji: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/ - polecam lekturę.

Masz tutaj wersję poprawioną, wygodniej było połowę przepisać od nowa niż się bawić w update tego kodu:

#include <array>
#include <chrono>
#include <random>
#include <thread>
#include <string>

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

struct item
{
    int x = 0;
    int y = 0;
    std::string data;
};

int main(int argc, char* argv[])
{

    std::array<item, 3> items{{
        {0, 0, "[]"},
        {2, 0, "[]"},
        {4, 0, "[]"}
    }};

    initscr();
    noecho();

    std::mt19937_64 gen{std::random_device{}()};
    std::uniform_int_distribution<> item_index(0, items.size()-1), sleep_ms(100, 200);

    while (1) {
        clear();
        for(auto& item : items){
            mvprintw(item.y, item.x, item.data.c_str());
        }

        refresh();
        std::chrono::milliseconds to_sleep{sleep_ms(gen)};
        std::this_thread::sleep_for(to_sleep);

        items[item_index(gen)].y++;
    }
    getch();
    endwin();
}
0

Przy kompilacji kodu powyżej pojawia się błąd:

could not convert '{2, 0, []"}' from '<brace-enclosed initializer list>' to 'item'

Nie wiem gdzie jest ukryty

0

Nie kompiluj w C++03. g++ foo.cpp -std=c++17 -lncurses && ./a.out

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