Migający kursor

Migający kursor
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0

Hej,
od razu zaznaczam, że to jest mój pierwszy większy projekt w c++ i w sumie większość rzeczy sam próbuję się nauczyć więc moja wiedza jest mocno ograniczona.
Problem jest z tym, że stworzyłem dynamiczną tablice struktur oraz funkcję odpowiadającą za sterowanie strzałkami. W funkcji odpowiadającej za wyświetlanie tablicy ustawiłem znaczek "" jako kursor. Wszystko działa, kursor porusza się po kliknięciu strzałki. Chciałem jednak trochę ulepszyć projekt, każda komórka tablicy ma swoją wartość, gdy poruszam kursorem to na danym polu (tam gdzie jest obecnie kursor) wyświetla się "" zamiast liczbę. Czy jest szansa ustawić wyświetlanie "" co pewien czas np co 1s, tak aby "" pojawiał się na przemian z wartością danego pola?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1

Może postaw tą gwiazdkę tuż po wartości pola, będzie nieco łatwiej.
Podobną reakcje jak po strzałce musisz zrealizować co sekunda, więc zainteresuj się funkcją kbhit()


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0
_13th_Dragon napisał(a):

Może postaw tą gwiazdkę tuż po wartości pola, będzie nieco łatwiej.

Nie za bardzo chce takie rozwiązanie bo to jest dwuwymiarowa tablica więc taka opcja popsuje mi wygląd tablicy (przesunie wiersz w którym jest kursor aktualnie)

  1. Mógłbyś trochę mnie nakierować na to rozwiązanie bo kbhit- "Funkcja ta sprawdza, czy w buforze klawiatury znajdują się dane do odczytania. Jeśli tak, funkcja zwraca wartość 1 (true), w przeciwnym wypadku zwraca wartość 0 (false). " nie wiem jak to użyć by mi pomogło :/
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
0
Kopiuj
clock_t ct=0;
bool flash=true;
while(!kbhit())
  {
   clock_t now=clock();
   if(now>ct)
     {
      ct=now+CLOCKS_PER_SEC;
      drawAsterix(flash);
      flash=!flash;
     }
  }
switch(getch())
  {
...

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0

Nie wiem czy dobrze zrozumiałem:

Kopiuj
  if()//jakiś warunek
                {clock_t ct=0; 
                    bool flash=true;
                    while(!kbhit()) //kiedy kbhit będzie miało wartość true? 
                      {
                       clock_t now=clock(); //
                       if(now>ct)
                         {
                          ct+=now+CLOCKS_PER_SEC; //dodaje sekundę do czasu? Odlicza czas?
                          cout<<"*"<<(flash); // wyświetlam kursor i opróżniam bufor???
                          flash=!flash;
                         }
                      }
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
0
Kopiuj
while(!kbhit()) //kiedy kbhit będzie miało wartość true?
  • zacznij od przypomnienia sobie podstaw logiki.
Kopiuj
cout<<"*"<<(flash); // wyświetlam kursor i opróżniam bufor???
  • opróżniać to flush
  1. Nie mam zielonego pojęcia, jak w twoim programie "rysowane" są komórki, nie mam pojęcia gdzie masz ustawiony kursor, więc bez kodu niczym nie pomogę
    Całkiem możliwe że to:
Kopiuj
cout<<" *"[flash]<<'\b';

cię naprowadzi.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0
_13th_Dragon napisał(a):

Kopiuj
while(!kbhit()) //kiedy kbhit będzie miało wartość true?
  • zacznij od przypomnienia sobie podstaw logiki.

Trochę źle sformułowałem pytanie, chodziło mi kiedy kbhit będzie miało wartość true bo nie mogę wyobrazić sobie kiedy się skończy pętla while :/

tak wyświetlam tablicę wraz z kursorem:

Kopiuj
struct field {
    int value;
    bool cover;
};

void show(field** t, int N, , i nt M int x, int y) // x, y aktualnie współrzędne kursora przekazane przez funkcję odpowiadająca za ruch, N-ilość wierszy, M-ilość kolumn
{
    system("cls");

    cout << " ";
    for (int j = 0; j < M; ++j) // linia nad tablicą
        cout << "----";
    cout << endl;
    for (int i = 0; i < N; ++i, cout << '\n') {
        cout << "| ";
        for (int j = 0; j < M; ++j) {

            if (!t[i][j].cover) {
                if (i == x && j == y) {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);

                    cout << "*";
                }
                else
                    cout << t[i][j].value;
            }
            else {
                if (i == x && j == y) {

                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);

                    cout << "*";
                }
                else
                    cout << ' ';
            }
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x07);
            cout << " | ";
        }
    }

    cout << " "; // dolny pasek
    for (int j = 0; j < .M; ++j)
        cout << "----";
    cout << endl;
} 

Trochę eksperymentowałem z tym

Kopiuj
cout<<"*"[flash]<<'\b'; 

w tablicy mi wszystko rozwala, ale w nowym dokumencie działa, jednak czas między mignięciami jest coraz dłuższy :(

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1

Więc w twoim przypadku: drawAsterix(flash); to show() z dodatkowym parametrem: flash, wyświetlasz '*' jeżeli flash jest true


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0

Ok, wszystko zrobiłem z Twoją radą i pięknie działa, jedynie czas "migania" jest bardzo długi, jest szansa go skrócić?

edytowany 1x, ostatnio: pooczątkujący
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
0

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0
Kopiuj
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen = { 0, 0 }; // home for the cursor
SetConsoleCursorPosition(hConsole, coordScreen);
cls(hStdout); 

Coś takiego mam dodać? Sorry ale pierwszy raz mam styczność z takimi rzeczami

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
0

nie! zamiast system("cls"); wpisać to co podałeś bez ostatniego wiersza.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PO
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:10
0

Zrobiłem jak napisałeś, tablica ładnie i szybko się wyświetla jednak "mignięcie kursora" wciąż jest bardzo długie (około 20s). Chyba, że coś źle zrozumiałem:
Funkcja która sprawdza ruch po tablicy:

Kopiuj
void go(field** t, Arraysize Arraysize1)
w funkcji ruchu mam tak:
{
    bool koniec = false;
    int x = 0, y = 0;

    while (!koniec) {

        if (czy_wygrana(t, Arraysize1) == true)
            koniec = true;

        clock_t ct = 0;
        bool flash = true;
        while (!kbhit()) {
            clock_t now = clock();
            if (now > ct) {

                ct += now + CLOCKS_PER_SEC;
                show(t, Arraysize, x, y, flash);
                flash = !flash;
            }
        }

        unsigned char znak = getch();
        switch (znak) {
 

a w funkcji show:

Kopiuj
if (i == x && j == y) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
    if (flash)
        cout << "*";
    else
        cout << t[i][j].value;

i zamiast system("cls") dałem:

Kopiuj
    HANDLE hStdout; // usatwienie kursora na lewy górny róg
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coordScreen = { 0, 0 }; // home for the cursor
    SetConsoleCursorPosition(hStdout, coordScreen);
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1

Drobna literówka: ct=now+CLOCKS_PER_SEC;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PO
Świetnie działa, bardzo dziękuję za pomoc! :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.