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. |
|
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: #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;
void internetynasekunde() { while( true ) { internety = internety + ips; sleep( 1 ); } }
int main() { initscr(); keypad( stdscr, TRUE ); noecho(); 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; 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 ) { internety = internety + moreinternets; sleep( sleeptime ); continue; } else if( klawisz == 27 ) { printw( "\n\tCzy napewno chcesz wyjsc? y/n" ); int wyjscie; while( true ) { wyjscie = getch(); if(( wyjscie == 121 ) ||( wyjscie == 89 ) ) { endwin(); return 0; } else if(( wyjscie == 110 ) ||( wyjscie == 78 ) ) { break; } else { printw( "\nWcisnij y albo n\n" ); continue; } } } else if((( klawisz == 115 ) ||( klawisz == 83 ) ) &&( 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; }
|
|
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.
|
|
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ć? |
|
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. |
|
Zibby |
» 2016-08-29 18:02:22 Mógłbyś zrobić tak: inicjujesz zmienną bool levelwebmaster = 0;
int record_dodawanie_internetow = 0;
while( true ) { clear();
Przed wypisaniem zmiennej internety pobierasz czas, i zwiększasz zmienną o różnicę między record_dodawanie_internetow, a pobranym czasem. printw( "Zabieraj sie do pracy.\n\n\n" );
internety = internety +( clock() - record_dodawanie_internetow ) / 1000; record_dodawanie_internetow = clock();
printw( "Ilosc internetow: " ); printw( "%d", internety );
raczej będzie działało |
|
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)? |
|
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. |
|
1 « 2 » 3 |