Migający kursor

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?

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()

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 :/
0
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())
  {
...
0

Nie wiem czy dobrze zrozumiałem:

  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;
                         }
                      }
0
while(!kbhit()) //kiedy kbhit będzie miało wartość true?
  • zacznij od przypomnienia sobie podstaw logiki.
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:
cout<<" *"[flash]<<'\b';

cię naprowadzi.

0
_13th_Dragon napisał(a):

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:

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

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 :(

1

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

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ć?

0
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

0

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

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:

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:

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:

    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);
1

Drobna literówka: ct=now+CLOCKS_PER_SEC;

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