Spiel in C++


  • Gesperrt

    @john-0 sagte in Spiel in C++:

    Besser sollte der Aufruf
    g++ Handmap.cpp -L/usr/lib/.... -lcurl -lcurlpp -o hm.exe

    Nein, geht auch nicht.

    Folgendes hab ich gemacht:
    Download von GitHub
    mkdir build
    cd build
    cmake ..
    cmake --build .
    make Install

    Schreibe gerade vom Handy, deshalb geht das nicht ausführlicher.

    Ich hab curlpp also nicht direkt über cygwin selber installiert...

    Aber cygwin hat eine emulierte Konsole sowie spezielles user home...

    Hab mich noch nicht ausgiebig damit befasst



  • @wpi Am Ende musst du gucken, wo die Bibliotheken liegen und den passenden Pfad angeben. Offenbar hast du die manuell selbst kompiliert, ich habe keine Ahnung wo die dann per default landen.



  • @Schlangenmensch sagte in Spiel in C++:

    @wpi Am Ende musst du gucken, wo die Bibliotheken liegen und den passenden Pfad angeben. Offenbar hast du die manuell selbst kompiliert, ich habe keine Ahnung wo die dann per default landen.

    Da offenbar mit cmake installiert wurde, dann mal die CURLConfig.cmake suchen... Siehe auch https://cmake.org/cmake/help/v3.28/module/FindCURL.html

    Jedenfalls bin ich bei cmake-Tipps raus, ich habe das zwar immer irgendwie zum Laufen bekommen, aber mit Betonung auf "irgendwie" 😉



  • @wpi sagte in Spiel in C++:

    Hallo, habt ihr vielleicht eine Idee für ein kleines/einfaches Konsolen-Spiel oder Problem, das man gut in C++ programmieren könnte, für Übungszwecke, was auch Strukturen und Klassen und so beinhaltet?

    Das sollte einfach genug sein. Hangman wurde ja schon vorgeschlagen. Ansonsten kannst du dich auch an sowas wie Snake versuchen. Oder ein klassisches SHMUP - kann man wenn man will auch im Text-Mode machen.

    Vielleicht eine TicTacToe-KI mit Schwierigkeitsstufen - oder wäre das zu umfangreich?

    Das sollte schon nach machbar sein. Klassisches 3x3 TicTacToe ist von der max. benötigten Suchtiefe her so begrenzt dass man eigentlich nicht optimieren muss. D.h. du musst dich nicht tief in diverse Optimierungen einarbeiten und kannst dich auf das Lernen von idiomatischem C++ konzentrieren.

    Alle Sprachkonstrukte und Idiome sollte mal vorkommen (auch, wenn mir das gerade etwas viel erscheint...).

    Gut wäre es auch, wenn man sich dabei Gedanken um ein Pattern wie MVC/MVP, fluent und so machen müsste.

    Alles mit einem kleinen, realistischen Projekt abzudecken ist mMn. nicht realistisch. Dazu müsste man vermutlich auch zig seltsame Anforderungen dazudefinieren. Mal ganz abgesehen davon dass es meist keine gute Idee ist zu versuchen alles auf einmal zu lernen. Fang einfach mal mit etwas kleinem an.


  • Gesperrt

    Haha, Info an alle:

    Mit

    $ pwd
    /home/...
    
    $ ls
    Hangman.cpp
    
    $ g++ -L/usr/local/lib Hangman.cpp -o hm.exe -lcurl -lcurlpp
    
    $ ls
    Hangman.cpp  hm.exe
    

    hat es schlussendlich geklappt!

    Ich weiß nicht, weshalb /usr/local/lib bei Cygwin nicht automatisch drin ist ...

    Melde mich später für ein Review wenn das Spiel fertig ist.


  • Gesperrt

    curlpp::options::Url(string("https://de.wikipedia.org/wiki/Special:Random")) funktioniert nicht 😒 , Ergebnis ist leer.

    Jemand eine Idee?


  • Gesperrt

    Weiß warum, auf der anderen Seite ist ein 301, und curlpp folgt keinen Redirects!!!

    >>> https://de.wikipedia.org/wiki/Special:Random
    
    > --------------------------------------------
    > 301 Moved Permanently
    > --------------------------------------------
    Status:	301 Moved Permanently
    Code:	301
    date:	Fri, 13 Oct 2023 13:33:02 GMT
    server:	mw1481.eqiad.wmnet
    x-content-type-options:	nosniff
    vary:	Accept-Encoding,X-Forwarded-Proto,Cookie
    last-modified:	Fri, 13 Oct 2023 13:33:02 GMT
    Location:	https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite
    content-length:	0
    content-type:	text/html; charset=UTF-8
    age:	0
    x-cache:	cp6011 miss, cp6015 miss
    x-cache-status:	miss
    server-timing:	cache;desc="miss", host;desc="cp6015"
    strict-transport-security:	max-age=106384710; includeSubDomains; preload
    report-to:	{ "group": "wm_nel", "max_age": 604800, "endpoints": [{ "url": "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0" }] }
    nel:	{ "report_to": "wm_nel", "max_age": 604800, "failure_fraction": 0.05, "success_fraction": 0.0}
    set-cookie:	NetworkProbeLimit=0.001;Path=/;Secure;Max-Age=3600
    x-client-ip:	92.205.51.165
    cache-control:	private, s-maxage=0, max-age=0, must-revalidate
    connection:	close
    
    
    
    >>> https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite
    
    > --------------------------------------------
    > 302 Found
    > --------------------------------------------
    Status:	302 Found
    Code:	302
    date:	Fri, 13 Oct 2023 13:33:02 GMT
    server:	mw1442.eqiad.wmnet
    x-content-type-options:	nosniff
    accept-ch:	
    vary:	Accept-Encoding,X-Forwarded-Proto,Cookie
    expires:	Thu, 01 Jan 1970 00:00:00 GMT
    Location:	https://de.wikipedia.org/wiki/Rayssac
    content-length:	0
    content-type:	text/html; charset=UTF-8
    age:	0
    x-cache:	cp6010 miss, cp6015 pass
    x-cache-status:	pass
    server-timing:	cache;desc="pass", host;desc="cp6015"
    strict-transport-security:	max-age=106384710; includeSubDomains; preload
    report-to:	{ "group": "wm_nel", "max_age": 604800, "endpoints": [{ "url": "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0" }] }
    nel:	{ "report_to": "wm_nel", "max_age": 604800, "failure_fraction": 0.05, "success_fraction": 0.0}
    set-cookie:	NetworkProbeLimit=0.001;Path=/;Secure;Max-Age=3600
    x-client-ip:	92.205.51.165
    cache-control:	private, s-maxage=0, max-age=0, must-revalidate
    connection:	close
    
    
    
    >>> https://de.wikipedia.org/wiki/Rayssac
    
    > --------------------------------------------
    > 200 OK
    > --------------------------------------------
    Status:	200 OK
    Code:	200
    date:	Fri, 13 Oct 2023 13:33:03 GMT
    server:	mw1405.eqiad.wmnet
    x-content-type-options:	nosniff
    content-language:	de
    accept-ch:	
    vary:	Accept-Encoding,Cookie
    last-modified:	Fri, 29 Sep 2023 13:33:03 GMT
    content-type:	text/html; charset=UTF-8
    age:	1
    x-cache:	cp6015 miss, cp6015 miss
    x-cache-status:	miss
    server-timing:	cache;desc="miss", host;desc="cp6015"
    strict-transport-security:	max-age=106384710; includeSubDomains; preload
    report-to:	{ "group": "wm_nel", "max_age": 604800, "endpoints": [{ "url": "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0" }] }
    nel:	{ "report_to": "wm_nel", "max_age": 604800, "failure_fraction": 0.05, "success_fraction": 0.0}
    set-cookie:	NetworkProbeLimit=0.001;Path=/;Secure;Max-Age=3600
    x-client-ip:	92.205.51.165
    cache-control:	private, s-maxage=0, max-age=0, must-revalidate
    accept-ranges:	bytes
    connection:	close
    

    Das ist doof. 😞



  • @wpi sagte in Spiel in C++:

    keinen Redirects

    Doch, wenn man will: CURLOPT_FOLLOWLOCATION


  • Gesperrt

    @Jockelx Weißt du zufällig, wie man die Option da hineinbekommt ... ?

        ostringstream os;
        os << curlpp::options::Url(string("https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite"), curlpp::Options::FollowLocation());
    

    lüppt nicht



  • @wpi Jaein, ich weiss wie ich das mache, nämlich indem ich curl_easy_setup nutze - wie hier.
    Was du da nutzt kenne ich nicht; wahrscheinlich nochmal irgendwein wrapper, der das vereinfacht.


  • Gesperrt

    @Jockelx sagte in Spiel in C++:

    wahrscheinlich nochmal irgendwein wrapper, der das vereinfacht

    Korrigiere: Ein wrapper, der das vereinfachen

    soll. 😉

    Ok, aber erst mal Danke.



  • @wpi sagte in Spiel in C++:

    @Jockelx sagte in Spiel in C++:

    wahrscheinlich nochmal irgendwein wrapper, der das vereinfacht

    Korrigiere: Ein wrapper, der das vereinfachen

    soll. 😉

    Ok, aber erst mal Danke.

    Tut es auch, wenn man die Dokumentation liest und versteht...

    https://github.com/jpbarrette/curlpp/blob/master/doc/guide.pdf

    Und zwar den Abschnitt "5.1 Option setting/retrieving"



  • libcurl hat eine grauenhafte API. Der C++ Wrapper scheint auch eine grauenhafte API zu haben. Daher: nicht blind auf gut Glück irgendwelche Beispiele abändern, sondern besser eins suchen wo genau das gemacht wird was man machen möchte. Und/oder erstmal die komplette Doku zu allen Funktionen lesen die in dem Beispiel/den Beispielen die man kombinieren möchte verwendet werden.


  • Gesperrt

    Vielen Dank @hustbaer , genau das meinte ich ...

    @firefly Du musst doch nicht sofort scharf schießen, nur weil jemand zu etwas eine Meinung hat ...



  • Nachtigall, ick hör dir trapsen...


  • Gesperrt

    Na ja, ich sterbe zwar immer, aber immerhin ist das Spiel fertig.^^

    #include <random>
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <string>
    #include <regex>
    #include <curlpp/Easy.hpp>
    #include <curlpp/cURLpp.hpp>
    #include <curlpp/Options.hpp>
    using namespace std;
    
    vector<string> getPossibleWords()
    {
        curlpp::Cleanup myCleanup;
        curlpp::Easy handle;
        handle.setOpt(curlpp::options::Url(string("https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite")));
        handle.setOpt(curlpp::options::FollowLocation(true));
        // handle.perform();
        ostringstream os;
        os << handle;
        string seq = os.str();
    
        vector<string> r;
        regex rgx("\\w+");
        for (sregex_iterator it(seq.begin(), seq.end(), rgx), it_end; it != it_end; ++it)
        {
            r.push_back((*it)[0]);
        }
        return r;
    }
    
    string getRandomWord(vector<string> words, int minLen, bool uppercase)
    {
        random_device dev;
        mt19937 rng(dev());
        uniform_int_distribution<mt19937::result_type> dist(0, words.size() - 1);
    
        while (1)
        {
            auto w = words[dist(rng)];
            if (w.size() >= minLen && (!uppercase || isupper(w[0])))
            {
                return w;
            }
        }
        return nullptr;
    }
    
    int main(int argc, char const *argv[])
    {
        auto v = getPossibleWords();
        auto w = getRandomWord(v, 5, true);
        string w2;
        for (int i = 0; i < w.size(); i++)
        {
            w2 += "_ ";
        }
        int len = w.size(), found = 0, tries = 0, health = 100;
        while (len > found && health > 0)
        {
            cout << "Das Spiel beginnt!" << endl;
            cout << "Das gesuchte Wort hat Länge " << len << endl;
            cout << "Du hast " << found << " gefunden und es " << tries << "-mal versucht" << endl;
            cout << w2 << endl;
    
            cout << "Welcher Buchstabe?" << endl;
            char c;
            cin >> c;
            int f = 0;
            for (int i = 0; i < w.size(); i++)
            {
                if (w[i] == c && w2[i * 2] == '_')
                {
                    f++;
                    found++;
                    w2[i * 2] = c;
                }
            }
            tries++;
            if (f > 0)
            {
                cout << "Prima, der Buchstabe " << c << " kam " << f << "-mal vor!" << endl;
            }
            else
            {
                cout << "Leider kein Glück gehabt ..." << endl;
                health -= 25;
            }
        }
        cout << "Das Spiel ist aus ..." << endl;
        if (health > 0)
        {
            cout << "Prima! Du hast das Wort " << w << " gefunden!" << endl;
        }
        else
        {
            cout << "Leider bist du tot. :-()" << endl;
        }
        return 0;
    }
    

    Falls jemand gewinnt, bitte mal melden. 😃


  • Gesperrt

    Weiß jemand, wie man "mit einfachen Mitteln" nur den sichtbaren Text einer Website/eines Wikipedia-Artikels erhalten kann (bzw. parsen)? JS und CSS sei also unwichtig ...

    Fragen dazu werden auf StackOverflow gnadenlos downgevotet.

    Prinzipiell doch zwei Ansätze:

    1. Den XML-DOM-Baum parsen ... oder
    2. HTML parsen (mit Regex ...)

    1. würde wahrscheinlich daran scheitern, dass HTML ja meistens kein wohlgeformtes XML is ...

    Es geht mir einfach darum, keine HTML-Steuerzeichen/-Tags als Suchwort zu verwenden.


  • Gesperrt

    Ich habe noch eine Frage bzw. nichtfunktionale Anforderung ...

    Die .exe ist jetzt über 1 MB. Wie schaffen die anderen Freaks das, dass eine .exe nur ein paar KB groß ist?



  • In dem man sich json von irgendeinem API holt (wikipedia hat auch eine).

    google hat ungefaehr noch ein dutzend weitere APIs ausgespuckt die ebenfalls wordlists/random words zur verfuegung stellen.

    Dein binary bekommst du kleiner wenn du entsprechende compiler flags fuer optimierung mitgibst (eg. -O3) und dir deine linker optionen mal anschaust.



  • @wpi
    libcurl ist halt nicht gerade klein.
    Du kannst libcurl kleiner bekommen, indem du sie selbst baust, und dabei alle Protokolle deaktivierst die du nicht brauchst.

    Oder du kannst die HTTP Funktionen der WinAPI verwenden. z.B. mit https://learn.microsoft.com/en-us/windows/win32/winhttp/iwinhttprequest-send
    Damit schaffst du vermutlich das kleinste Programm.


Anmelden zum Antworten