Reaktionsspiel in c++


  • Banned

    @Wade1234 sagte in Reaktionsspiel in c++:

    überleg dir halt irgendein schönes projekt. du kannst da frei entscheiden, ob das mit c, assembler, brainfuck, javascript oder was weiß ich was gemacht werden soll.

    Ich bastele mir einen Brainfuck-Prozessor, die RISC-Maschine schlechthin. 🐱

    du wirst dich wundern, wie nett und geistreich alle auf einmal sein können, wenn du mit ihnen und nicht gegen sie handelst.

    Aber der Spaß bleibt dabei auf der Strecke.



  • Das hat nichts mit "Hackordnung" zu tun, sondern damit, dass du hier andauernd Standpunkte vertrittst, die Code objektiv gesehen schlechter machen und ignorierst alle Begründungen dazu. Das nervt, weil jemand deinen Ratschlägen folgen könnte, ließe man sie kritiklos stehen.

    Zum Beispiel ist deine Aussage

    rand() ist in den meisten Fällen ausreichend. Außer man braucht evtl. einen CSPRNG, der kryptografischen Anforderungen genügt.

    schlicht falsch, da es für Zufall nicht nur Anwendungsfälle in der Kryptografie gibt. In vielen Simulationen ist man zum Beispiel auch auf "guten Zufall" angewiesen, hat aber keine kryptografischen Anforderungen und bekommt mit rand trotzdem falsche Ergebnisse. Nicht ohne Grund hat STL schon 2013 einen Vortrag zu Rand considered harmful gemacht.

    Sicherlich, bei einem Würfelspiel für Programmieranfänger ist das alles egal. Und gerade weil es in diesem Fall kein Problem ist, rand zu verwenden, war das auch nur einer von mehreren Hinweisen.


  • Banned

    @wob sagte in Reaktionsspiel in c++:

    Das hat nichts mit "Hackordnung" zu tun, sondern damit, dass du hier andauernd Standpunkte vertrittst, die Code objektiv gesehen schlechter machen und ignorierst alle Begründungen dazu. Das nervt, weil jemand deinen Ratschlägen folgen könnte, ließe man sie kritiklos stehen.

    Zum Beispiel ist deine Aussage

    rand() ist in den meisten Fällen ausreichend. Außer man braucht evtl. einen CSPRNG, der kryptografischen Anforderungen genügt.

    schlicht falsch, da es für Zufall nicht nur Anwendungsfälle in der Kryptografie gibt. In vielen Simulationen ist man zum Beispiel auch auf "guten Zufall" angewiesen, hat aber keine kryptografischen Anforderungen und bekommt mit rand trotzdem falsche Ergebnisse. Nicht ohne Grund hat STL schon 2013 einen Vortrag zu Rand considered harmful gemacht.

    Sicherlich, bei einem Würfelspiel für Programmieranfänger ist das alles egal. Und gerade weil es in diesem Fall kein Problem ist, rand zu verwenden, war das auch nur einer von mehreren Hinweisen.

    Wenn ich etwas schreibe, ist das meine Meinung und nicht die absolute Wahrheit. Immerhin hat dich mein Einwand dazu inspiriert, diesen Vortrag zu verlinken: https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
    Das wäre wohl sonst kaum passiert. Ich bin kein Troll, der Diskussionen sabotiert, sondern ich belebe sie. 🐱



  • @Swordfish Swordfish danke danke erstmals für deine Antwort jedoch verstehe ich nicht was du mit then = now(); (Zeile 3) und bei Zeile 12 meinst falls du mir das nur erklären könntest oder ein link schicken könntest würde das für mich reichen und nochmals danke für die sonstigen Tipps ich werde sie mir merken.
    mfg



  • Irgendwie musst Du Dir merken, ab wann der Benutzer seine Eingabemöglichkeit bekommt (then = now()). Wenn Du Dir das gemerkt hast, kannst Du die Schleife abbrechen, wenn Deine x Sekunden verstrichen sind. (now() - then > x Sekunden).

    zB

    #include <chrono>
    
    // ...
    
    using clock = std::chrono::high_resolution_clock;
    auto then{ clock::now() };  // 1)
    do {
    	// ...
    } while (clock::now() - then < std::chrono::milliseconds{ 5000 });
    

    1) Vielleicht sollte man then besser start nennen, ich weiß es nicht.

    Geschmacksmuster:

    #include <chrono>
    #include <random>
    #include <thread>
    #include <iostream>
    
    #include <conio.h>
    
    using namespace std::chrono_literals;
    
    template<typename Engine>
    char get_random_letter(Engine &engine)
    {
    	return std::uniform_int_distribution<int>{ 'a', 'z' }(engine);
    }
    
    void countdown(unsigned seconds)
    {
    	for (unsigned i = seconds; i; --i) {
    		std::cout << i << '\n';
    		std::this_thread::sleep_for(1s);
    	}
    }
    
    char get_timed_input(std::chrono::milliseconds timeout, std::chrono::milliseconds &elapsed)
    {
    	using clock = std::chrono::high_resolution_clock;
    
    	auto then{ clock::now() };
    	int input{};
    	
    	do {
    		if (_kbhit()) {
    			input = _getch();
    		}
    		elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() - then);
    	} while (elapsed < timeout);
    
    	return input;
    }
    
    int main()
    {
    	using clock = std::chrono::high_resolution_clock;
    	std::mt19937 mt{ static_cast<unsigned>(clock::now().time_since_epoch().count()) };
    	constexpr auto timeout{ 5000ms };
    
    	char again;
    	do {
    		std::cout << "Get ready!\n";
    		countdown(3);
    		auto ch{ get_random_letter(mt) };
    		std::cout << "Press '" << ch << "'!\n\n";
    		
    		std::chrono::milliseconds elapsed;
    		auto input{ get_timed_input(timeout, elapsed) };
    
    		if (elapsed >= timeout) {
    			std::cout << "Too late :(\n\n";
    		}
    		else if(input == ch) {
    			std::cout << "Yay!\nTime: " << elapsed.count() << "ms\n\n";
    		}
    		else {
    			std::cout << "Nope, '" << input << "' != '" << ch << "' :(\n\n";
    		}
    
    		std::cout << "Again? (y/n) ";
    		std::cin >> again;
    		std::cout.put('\n');
    	} while (again == 'y');
    }
    

    @RBS2 sagte in Reaktionsspiel in c++:

    Aber ich finde die arrogante Abwertung einiger C++-Fanboys gegenüber anderen Sprachen auch nicht so gut.

    Geh weg. du bist hier in einem Thread mit einer Frage zu C++. du willst eine Diskussion über std::rand() vs whatever? mach einen Thread dazu auf. Für deine anderen sinnfreien Beiträge hast du bereits hier und hier Arena genug.

    @Wade1234 sagte in Reaktionsspiel in c++:

    ja du nimmst ihnen damit ihr ansehen, ihre aufgabe oder was auch immer weg.

    Das ist nicht das Problem. Ständig Threads ohne Sinn OT zu ziehen ist das Problem. Diskussion zum Selbstzweck bringt keinem was.



  • Ich möchte nur kurz anmerken, das die ganzen mathematischen Einwände gegen rand() für diese Anwendung nicht ziehen. z.B. swordfish Link liefert keine Erklärung, warum aus oben genannten Programm rand() entfernt werden sollte.

    Auch mit den C++ Random Zeug ist es möglich zu failen. Noch viel schlimmer als mit rand, weil es eben so viel mehr gibt. Bei komplexen Anwendungen muss man daher immer wissen was man tut.



  • warum macht ihr dann nicht alle so, wie ihr das wollt? die frage lautete doch, wieso _getch() zurückkehrt, obwohl das eigentlich nicht der fall sein sollte, und nicht, wie man eine möglichst tolle zufallszahl im bereich von 2^n zum testen von was auch immer erstellt.



  • @Wade1234 sagte in Reaktionsspiel in c++:

    die frage lautete doch, wieso _getch() zurückkehrt, obwohl das eigentlich nicht der fall sein sollte

    weil mit if (_kbhit()) vorher sichergestellt ist, daß eine Taste gedrückt wurde, die mit _getch() sofort gelesen werden kann.

    @TGGC sagte in Reaktionsspiel in c++:

    Ich möchte nur kurz anmerken, das die ganzen mathematischen Einwände gegen rand() für diese Anwendung nicht ziehen. z.B. swordfish Link liefert keine Erklärung, warum aus oben genannten Programm rand() entfernt werden sollte.

    Das war auch nicht an den OP gerichtet, sondern an RBS2s behauptung, die Art/Qualität eines RNGs würde nur eine Rolle spielen, wenn es um Kryptographie geht.

    @TGGC sagte in Reaktionsspiel in c++:

    Auch mit den C++ Random Zeug ist es möglich zu failen. Noch viel schlimmer als mit rand, weil es eben so viel mehr gibt. Bei komplexen Anwendungen muss man daher immer wissen was man tut.

    Das steht glaube ich außer Frage.



  • @Swordfish sagte in Reaktionsspiel in c++:

    weil mit if (_kbhit()) vorher sichergestellt ist, daß eine Taste gedrückt wurde, die mit _getch() sofort gelesen werden kann.

    ja aber eigentlich sollte getch doch blockieren, oder nicht? mal davon abgesehen, dass conio meine ich eigentlich eine erweiterung des borland compilers ist / war und schon mit c nicht wirklich viel zu tun hat.



  • _getch() blockt auch, bis etwas gelesen werden kann. Aber _getch() wird nur ausgeführt, wenn vorher _kbhit() true war. Es ist also sichergestellt, daß sofort eine Eingabe gelesen werden kann, also _getch() sofort zurückkehrt.

    @Wade1234 sagte in Reaktionsspiel in c++:

    mal davon abgesehen, dass conio meine ich eigentlich eine erweiterung des borland compilers ist / war und schon mit c nicht wirklich viel zu tun hat.

    _getch() und _kbhit() gibt es bei MS in <conio.h> auch curses und PDCurses haben sowas.

    @Wade1234 sagte in Reaktionsspiel in c++:

    schon mit c nicht wirklich viel zu tun hat.

    wth? Was kann man mit C nicht aufrufen?


  • Administrator

    Bitte zurück zum Thema. Auch Trolle beleben Diskussionen, nur nicht im positiven Sinne. Ich habe mal ein paar der Sinn freien Beiträge weggeworfen.


Log in to reply