Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Odmierzanie czasu dopóki ten nie uzyska danej wartości.

Ostatnio zmodyfikowano 2014-01-22 15:10
Autor Wiadomość
Dwunogalek
Temat założony przez niniejszego użytkownika
[C++] Odmierzanie czasu dopóki ten nie uzyska danej wartości.
» 2014-01-21 18:56:32
Witam.

Chciałem to zrobić sam ale już powoli zaczyna mi brakować pomysłów. Otóż robię gierkę w konsoli, coś na styl omijania swoim pojazdem innych aut nadjeżdżających z przeciwnej strony planszy i naszym celem jest jak najdłuższe omijanie "przeszkód" co dodaje nam punkty...

I ogólnie to uporałem się z : planszą gry ( tablica 2D ), sterowaniem, generowaniem pojazdów , warunkami odnośnie ich...  Ale jest jeden haczyk - pojazdy stoją w miejscu.

Na początku chciałem to rozwiązać na głupiego za pomocą _sleep-a, ale takowy zatrzymuje CAŁY program a chodzi o to że podczas "nadjeżdżania" kolejnych pojazdów mamy możliwość klikając klawisz zjechać na prawo czy lewo - więc : Albo gracz albo przeszkody - tylko jedna rzecz mogła być dynamiczna.  <- ODPADA

Później wpadłem na pomysł pogrzebania w innych bibliotekach standardowych i przyjrzałem się bliżej bibliotece time.h / ctime , która wydawała się najodpowiedniejszą. Wygrzebałem funkcję "difftime" która ma na celu obliczanie różnicy między dwoma czasami/dwiema datami. Wpadłem na warunek który ogólnie w programie działał by tak :

- Zacznij odliczać czas
- Licz czas i "poruszaj" pojazdami dopóki nie będzie kliknięty jakiś klawisz ruchu

Pojazdy miały by się przesuwać/odświeżać na kolejnych polach co 1 sekundę czyli nasuwa się myśl że warunek ma być taki :

- Licz czas dopóki jego wartość nie osiągnie '1', jeżeli osiągnie, odśwież planszę gry i licz od nowa

I dotarliśmy do sedna sprawy : Jak to zrobić ???


          Załączam to co do tej pory wyskrobałem z difftime odnośnie odliczania czasu przez jakiś czas

C/C++
#include <time.h>
#include <conio.h>
#include <iostream>

void Zliczanie();

time_t start, koniec;
double roznica;

int main()
{
    //std::cout << start;
    //getch();
    //roznica = difftime (koniec, start);
    if( start == 1 )
    {
        time( & koniec );
        std::cout << "\n GZ \n";
        getch();
        //std::cout << start;
        //getch();
    }
    else
    {
        std::cout << "\n no to dupa \n";
        getch();
        std::cout << start;
        getch();
    }
}

PS : Środowisko : DEVCPP ale to raczej nie ma tutaj najmniejszego znaczenia :)

Prosiłbym o conajmniej sugestię co tutaj zapisuje odliczony czas bo nawet w warunku else sprawdziłem co nie tak ze startem - wydaje mi się że jakąś bzdurę ciągle robię...

A i jeszcze jedno : Jeżeli ktoś ma inną sugestię na temat rozwiązania mojego problemu ( inny sposób niż difftime ) to także będę wdzięczny :)
P-102735
alixir
» 2014-01-22 12:40:34
Nie znam się za bardzo, ale kiedyś jak tworzyłem wężyka też natknąłem się na podobny problem z ruchem.
Myślę, że błędnie podchodzisz do tematu.
- pętla programu musi działać bez przerwy (nie możesz zatrzymywać jej przez getch(), ani delay() )
- sprawdzaj czy wciśnięto jakiś przycisk przy użyciu kbhit – może pojawiła się nowa funkcja od tamtego czasu
C/C++
if( _kbhit() )
{
    iKey = _getch();
}

Dla lepszego zrozumienia zerknij na to:

C/C++
#include <conio.h>
#include <iostream>
#include <time.h>

int seconds() {
    return time( NULL );
}

int main() {
   
    int iKey = 0, runningTime = 0, count, prev_count = seconds();
   
    do { // Program dziala do momentu wsisniecia literki 'q'
        count = seconds();
        if(( count - prev_count ) == 1 ) {
            runningTime++;
            std::cout << runningTime << std::endl;
        }
        prev_count = count;
       
        if( _kbhit() ) {
            iKey = _getch();
            std::cout << "Wcisnales: " << static_cast < char >( iKey ) << std::endl;
           
        }
    } while( iKey != static_cast < int >( 'q' ) );
   
    std::cout << "Program przerwano po : " << runningTime << " sekundach";
   
    _getch();
    return 0;
}


P-102813
Dwunogalek
Temat założony przez niniejszego użytkownika
» 2014-01-22 14:47:32
Ooo, właśnie idealnie o to co jest pokazane w Twoim programie, Alixir, mi chodziło - czyli - przez cały czas program odlicza czas mimo naciskania poszczególnych klawiszy, które mają przydzielone swoje własne funkcje ;)

Prawdę mówiąc jeżeli uda mi się to poprawnie zaimpletować do mojej gierki to problem rozwiązany :)

Ale zgodnie ze swoją zasadą nie korzystam z czegoś czego najpierw nie zrozumiem, a żeby dobrze wykorzystać Twój sposób powinienem wiedzieć jak "To działa".

Czyli w tym fragmencie..
C/C++
if( _kbhit() )
{
    iKey = _getch();
}
_kbhit()sprawdza przez cały czas trwania programu czy został wciśnięty jakikolwiek klawisz i jeżeli tak, to _kbhit zapamiętał kliknięty klawisz i od razu jest brany pod uwagę przy oczekiwaniu na klawisz ( iKey = _getch(); ),  po czym już normalnie działanie klawisza może być uwarunkowane w switch-u ( switch(iKey) ).

Dalej chwilkę musiałem pogłówkować nad przykładem :P
I wszystko rozumiem oprócz tego fragmentu:
C/C++
count = seconds();
if(( count - prev_count ) == 1 ) {
    runningTime++;
    std::cout << runningTime << std::endl;
}
prev_count = count;

Gdybyś jeszcze mi wytłumaczył o co tu DOKŁADNIE chodzi byłbym naprawdę bardzo wdzięczny i mógł przystąpić do finalizacji gry - jak skończę mogę dać tutaj link do pobrania efektu mojej pracy ^^
P-102827
alixir
» 2014-01-22 15:05:28
Po 1. Nie chciałbym wprowadzać cię w błąd, ale warunek z kbhit w mojej ocenie działa tak:
- kbhit zwraca true jeśli ktoś wcisnął przycisk (ogólnie rzecz biorąc)
- warunek zostaje spełniony, więc program przechodzi do wczytywania znaku do zmiennej przy pomocy getch (to dzieje się w ułamku sekundy więc klawisz nadal masz wciśnięty)

Po 2. Funkcja second() zwraca wartość czasu w sekundach liczoną od 01.01.1970 i podstawia ją do zmiennej count. Następnie warunek sprawdza czy różnica wartości poprzedniej z obecną wynosi 1. Jeśli tak to znaczy że minęła dokładnie jedna sekunda. W takim wypadku wykonuje się odpowiedni kod. Następnie poza warunkiem jest przypisanie do wartości poprzedniej <– wartości obecnej (aby było z czym porównywać w następnym obiegu pętli).

P-102829
Dwunogalek
Temat założony przez niniejszego użytkownika
» 2014-01-22 15:10:47
Wielkie dzięki, naprawdę :)

Gdybym mógł na pewno dałbym "łapkę w górę" czy coś w tym stylu ;)

Pozdrawiam.






PS: Sorki że zawracam głowę ale gdybyś miał czas zerknij tutaj : http://cpp0x.pl/forum/temat/?id=14220 i odpisz jeżeli byś coś wiedział więcej bo widzę że długo w tym siedzisz i chętnie skorzystam z Twojego doświadczenia :)
P-102831
« 1 »
  Strona 1 z 1