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

Pętla działająca w tle

Ostatnio zmodyfikowano 2016-08-29 18:25
Autor Wiadomość
SaJmoN170
Temat założony przez niniejszego użytkownika
» 2016-08-29 17:20:54
Lepiej by było gdybyśmy jednak coś tutaj mogli zdziałać - inni mogliby się dołączyć + jakbyśmy znaleźli rozwiązanie to inni mogliby je zobaczyć.

W dużym skrócie działa to tak że zrobiłem jedną dużą pętlę w której wszystko się dzieje, ta pętla w ogóle się nie kończy, to jest pętla dlatego żeby przy wciśnięciu np. spacji wracało się na początek (np. dzięki continue). Mogłem użyć goto, ale tego się niby nie używa dla czytelności kodu i ogólnie wygody. Przed pętlą zrobiłem też różne zmienne które przechowują dane typu liczba internetów albo czy jakiś poziom został już zdobyty (żeby go nie przyznać ponownie) itp. No i w środku pętli dałem też ograniczenie klikania tj. jeśli przytrzymasz spację to nie dostaniesz w super szybkim tempie internetów, tylko każdy internet dostaniesz co sekundę, będą też ulepszenia sprawiające że ten czas czekania na internety zostanie skrócony lub nawet całkowicie zdjęty.
P-151216
SaJmoN170
Temat założony przez niniejszego użytkownika
» 2016-08-29 17:44:24
Problem rozwiązany, należy użyć C++11 i <thread>.
Zaktualizowany kod źródłowy:
C/C++
#include <iostream>
#include <string>
#include <ncurses.h>
#include <unistd.h>
#include <thread>

#define ESC 27

using namespace std;

long double internety = 0;

float ips = 0; //Internet Per Second


void internetynasekunde()
{
    while( true )
    {
        internety = internety + ips;
        sleep( 1 );
    }
}

int main()
{
    initscr();
    keypad( stdscr, TRUE );
    noecho();
    //nodelay(stdscr, TRUE); /*EMERGENCY!!!*/
   
    thread tick( internetynasekunde );
   
    int moreinternets;
    moreinternets = 1;
    int klawisz;
    string level;
    level = "Nikt";
    string zakupy;
   
    float sleeptime = 0;
   
    bool sklepkomunikat = 0;
    int sklepkomunikatbyl = 1;
   
    bool wejsciedosklepu = 0;
   
    //levele
    bool levelinternethunter = 0;
    bool levelpirate = 0;
    bool levelwebmaster = 0;
   
   
    while( true )
    {
        clear();
       
        printw( "Witaj w The Internet Clicker \n" );
        printw( "Twoim celem jest zdobycie jak najwiekszej\n" );
        printw( "ilosci internetow\n\n" );
        printw( "Dlaczego? Bo tak.\n" );
        printw( "Zabieraj sie do pracy.\n\n\n" );
       
        printw( "Ilosc internetow: " );
        printw( "%Lf", internety );
        printw( "\nInternety na sekunde: " );
        printw( "%g", ips );
        printw( "\nTwoj level: " );
        printw( "%s", level.c_str() );
        printw( "\nKliknij spacje zeby zebrac internety \n" );
        printw( "Zeby wyjsc kliknij escape \n" );
       
       
        if(( internety >= 10 ) &&( internety <= 20 ) &&( sklepkomunikatbyl <= 10 ) )
        {
            sklepkomunikat = 1;
            sklepkomunikatbyl++;
        }
        else
        {
            sklepkomunikat = 0;
        }
       
       
        if( internety >= 10 )
        {
            wejsciedosklepu = 1;
        }
       
        ///////////////////////////////////////////////////////////////////////////
       
        if( sklepkomunikat == 1 )
        {
            printw( "Czy wiedziales ze mozesz kupowac nowe przedmioty i ulepszenia?\n" );
        }
        if( wejsciedosklepu == 1 )
        {
            printw( "Zeby przejsc do sklepu wcisnij s\n" );
        }
       
        ///////////////////////////////////////////////////////////////////////////
       
        klawisz = getch();
        if( klawisz == 32 ) /* Spacja */ //Więcej Internetów
        {
            internety = internety + moreinternets;
            sleep( sleeptime );
            continue;
        }
        else
        if( klawisz == 27 ) //Wyjście
        {
            printw( "\n\tCzy napewno chcesz wyjsc? y/n" );
            int wyjscie;
            while( true )
            {
                wyjscie = getch();
               
                if(( wyjscie == 121 /* y */ ) ||( wyjscie == 89 /* Y */ ) )
                {
                    endwin();
                    return 0;
                }
                else
                if(( wyjscie == 110 /* n */ ) ||( wyjscie == 78 /* N */ ) )
                {
                    break;
                }
                else
                {
                    printw( "\nWcisnij y albo n\n" );
                    continue;
                }
            }
        }
        else
        if((( klawisz == 115 /* s */ ) ||( klawisz == 83 /* S */ ) ) &&( internety >= 10 ) )
        {
            clear();
            echo();
            while( true )
            {
                clear();
                printw( "SKLEP\n" );
                printw( "Co chcesz wybrac? Wpisz odpowiednia cyfre i zatwierdz enterem\n\n" );
                printw( "0. Wyjscie\n\n" );
                printw( "Przedmioty" );
                printw( "1. Noob niewolnik - +0.2 interneta na sekunde + level Internet Hunter | 5 internetow\n" );
                printw( "2. User niewolnik - +5 internetow na sekunde | 100 internetow\n" );
                printw( "3. Admin niewolnik -  +50 internetow na sekunde | 1000 internetow\n" );
                printw( "4. Zauploadowanie pliku na strone z torrentami - +200 internetow na sekunde + level Pirate | 3000 internetow\n" );
                printw( "5. Wlasna strona internetowa - +1000 internetow na sekunde + level Webmaster | 10000 internetow\n" );
                refresh();
                cin >> zakupy;
                noecho();
                if( zakupy == "0" )
                {
                    break;
                }
               
                //////////////////////////////////////////
               
                else
                if(( zakupy == "1" ) &&( internety >= 5 ) )
                {
                    ips = ips + 0.2;
                    internety = internety - 5;
                    printw( "\nDodano 0.2 internetow na sekunde\n" );
                    if( levelinternethunter == 0 )
                    {
                        level = "Internet Hunter";
                        levelinternethunter = 1;
                        printw( "Level up! Twoj nowy poziom to Internet Hunter!\n" );
                    }
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
                else
                if(( zakupy == "1" ) &&( internety < 5 ) )
                {
                    printw( "\nNie masz pieniedzy\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
               
                //////////////////////////////////////////
               
                else
                if(( zakupy == "2" ) &&( internety >= 100 ) )
                {
                    ips = ips + 5;
                    internety = internety - 100;
                    printw( "\nDodano 5 internetow na sekunde\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
                else
                if(( zakupy == "2" ) &&( internety < 100 ) )
                {
                    printw( "\nNie masz pieniedzy\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
               
                //////////////////////////////////////////
               
                else
                if(( zakupy == "3" ) &&( internety >= 1000 ) )
                {
                    ips = ips + 50;
                    internety = internety - 1000;
                    printw( "\nDodano 50 internetow na sekunde\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
                else
                if(( zakupy == "3" ) &&( internety < 1000 ) )
                {
                    printw( "\nNie masz pieniedzy\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
               
                //////////////////////////////////////////
               
                else
                if(( zakupy == "4" ) &&( internety >= 3000 ) )
                {
                    ips = ips + 200;
                    internety = internety - 3000;
                    printw( "\nDodano 200 internetow na sekunde\n" );
                    if( levelpirate == 0 )
                    {
                        level = "Pirate";
                        levelpirate = 1;
                        printw( "Level up! Twoj nowy poziom to Pirate!\n" );
                    }
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
                else
                if(( zakupy == "4" ) &&( internety < 3000 ) )
                {
                    printw( "\nNie masz pieniedzy\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
               
                //////////////////////////////////////////
               
                else
                if(( zakupy == "5" ) &&( internety >= 10000 ) )
                {
                    ips = ips + 1000;
                    internety = internety - 10000;
                    printw( "\nDodano 1000 internetow na sekunde\n" );
                    if( levelwebmaster == 0 )
                    {
                        level = "Webmastwer";
                        levelwebmaster = 1;
                        printw( "Level up! Twoj nowy poziom to Webmaster!\n" );
                    }
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
                else
                if(( zakupy == "5" ) &&( internety < 10000 ) )
                {
                    printw( "\nNie masz pieniedzy\n" );
                    printw( "Wcisnij dowolny klawisz\n" );
                    getch();
                    continue;
                }
            }
        }
    }
   
    endwin();
    return 0;
}
P-151219
Monika90
» 2016-08-29 17:49:51
Nie jest to prawidłowe użycie wątków. Nie można, ot tak sobie, czytać zmiennej w jednym wątku, a modyfikować w innym, to jest niezdefiniowane zachowanie.
P-151220
SaJmoN170
Temat założony przez niniejszego użytkownika
» 2016-08-29 17:59:07
Ale to działa. Co jest w tym złego i jak mogę to poprawić?
P-151222
michal11
» 2016-08-29 18:02:03
Strasznie brzydkie rozwiązanie.
Jeżeli jeszcze bardziej chcesz rozwijać ten projekt to lepiej będzie od razu go przepisać z podziałem na funkcje i klasy.

Dodaj sobie timer do pętli głównej i z niego korzystaj przy np. odliczaniu sekundy.
P-151223
Zibby
» 2016-08-29 18:02:22
Mógłbyś zrobić tak:
inicjujesz zmienną

C/C++
//...
bool levelwebmaster = 0;

int record_dodawanie_internetow = 0; // to jest zmienna ktora inicjujesz

while( true )
{
    clear();
    //...

Przed wypisaniem zmiennej internety pobierasz czas, i zwiększasz zmienną o różnicę między record_dodawanie_internetow, a pobranym czasem.

C/C++
printw( "Zabieraj sie do pracy.\n\n\n" );

internety = internety +( clock() - record_dodawanie_internetow ) / 1000; // dzielisz przez 1000 bo czas z clock jest podawany w milisekundach
record_dodawanie_internetow = clock(); // zapisujesz sobie pobrany czas

printw( "Ilosc internetow: " );
printw( "%d", internety );

raczej będzie działało
P-151224
SaJmoN170
Temat założony przez niniejszego użytkownika
» 2016-08-29 18:06:24
Zasmucę was - jestem tak bardzo początkującym że nawet nie umiem klasy zrobić... to po prostu zwykła, mała gierka którą będę sobie rozwijał, to nie jest raczej jakiś gigantyczny projekt...
Poza tym, dalej mi nie powiedzieliście co jest złe w tym rozwiązaniu, "Brzydkie" dla mnie nie jest odpowiedzią. Czy to ma jakiś związek z poprawnym działaniem czy tylko czytelnością (jak np. goto)?
P-151225
michal11
» 2016-08-29 18:15:59
@Monika90 ci napisała co jest nie tak.
Nie można, ot tak sobie, czytać zmiennej w jednym wątku, a modyfikować w innym, to jest niezdefiniowane zachowanie.

Poczytaj dokładnie co to sa watki i jak działają to będziesz wiedział dlaczego twoje rozwiązanie jest nieprawidłowe.
P-151227
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona