Spiel in C++


  • Gesperrt

    @hustbaer Bitte schau dir auch mal mein anderes Thema an ...


  • Gesperrt

    Dieser Beitrag wurde gelöscht!


  • @wpi sagte in Spiel in C++:

    struct ToFind

    Kommentiere alle structs/Klassen. Es muss ja nicht lang sein, aber "ToFind" kann alles und nichts bedeuten. Was sind z.B. w1 und w2? Ein paar mehr Buchstaben für bessere Namen kosten nichts.

    void initToFind(struct ToFind *stf, string w)

    Welche Sprache willst du eigentlich schreiben? Das sieht nach C ohne ++ aus, aber mit string.


  • Gesperrt

    @wob
    Sorry, hat sich schon erledigt, da war noch zu viel falsch.



  • @wpi sagte in Spiel in C++:

    @hustbaer Bitte schau dir auch mal mein anderes Thema an ...

    Welches andere Thema?


  • Gesperrt

    @hustbaer sagte in Spiel in C++:

    @wpi sagte in Spiel in C++:

    @hustbaer Bitte schau dir auch mal mein anderes Thema an ...

    Welches andere Thema?

    Das hier https://www.c-plusplus.net/forum/topic/354334/c-library-mit-cygwin-bauen-und-verwenden

    Aber es hat sich schon erledigt, bin mit dem Hangman-Spiel fertig. Soll ich das zeigen?


  • Gesperrt

        void initWord()
        {
            for (int i = 0; i < w1.size(); i++)
            {
                if (w1[i] == ' ')
                {
                    w2 += "  ";
                }
                else if (w1[i] > 'z')
                {
                    w2 += "--";
                }
                else
                {
                    w2 += "_ ";
                }
            }
        }
    

    Wieso ersetzt er hier keine Sonderzeichen durch --? Die müssten doch > 'z' sein. (Zeile 9 bis 12)



  • @wpi was für ein Datentyp ist w2 denn? Ich würde darauf tippen das du dich mit Kodierungen wie utf8/16 und der entsprechenden Repräsentierung in deiner Software beschäftigen musst.



  • @wpi sagte in Spiel in C++:

    Wieso ersetzt er hier keine Sonderzeichen durch --? Die müssten doch > 'z' sein. (Zeile 9 bis 12)

    Warum müssten sie das?
    In ASCII gilt: '!' < '%' < 'A' < 'Z' < '[' < 'a' < 'z' < '}'


  • Gesperrt

    @Schlangenmensch sagte in Spiel in C++:

    @wpi was für ein Datentyp ist w2 denn?

    Das sind alles std::strings ...

    @wob sagte in Spiel in C++:

    Warum müssten sie das?

    Ich dachte, egal welches Encoding ... intern basiert es auf dem ASCII?

    Anbei mal der Code:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <regex>
    #include <curlpp/Easy.hpp>
    #include <curlpp/cURLpp.hpp>
    #include <curlpp/Options.hpp>
    
    std::string getRandomWordFromWikipedia()
    {
        curlpp::Cleanup cleanup;
        curlpp::Easy handle;
        handle.setOpt(curlpp::options::Url("https://en.wikipedia.org/wiki/special:random"));
        handle.setOpt(curlpp::options::FollowLocation(true));
        std::ostringstream os;
        os << handle;
        std::string response = os.str();
        std::regex headingRegex("<h1.+id=\"firstHeading\"[^>]*>(.+)</h1>");
        std::regex tagRegex("<[^>]+>(.+)</[^>]+>");
        std::smatch headingMatch;
        
        if (std::regex_search(response, headingMatch, headingRegex))
        {
            std::string heading = headingMatch[1];
            if (heading.find("<") != std::string::npos)
            {
                std::smatch tagMatch;
                if (std::regex_search(heading, tagMatch, tagRegex))
                {
                    return tagMatch[1];
                }
            }
        }
        
        return "";
    }
    
    struct ToFind
    {
        std::string w1;
        std::string w2;
        int tries;
        int right;
        int health;
        int hintsLeft;
    
        ToFind() : tries(0), right(0), health(100), hintsLeft(2)
        {
        }
    
        ToFind(std::string word) : w1(word), tries(0), right(0), health(100), hintsLeft(2)
        {
            initWord();
        }
    
        void setWord(std::string word)
        {
            w1 = word;
            initWord();
        }
    
        void initWord()
        {
            for (int i = 0; i < w1.size(); i++)
            {
                if (w1[i] == ' ')
                {
                    w2 += "  ";
                }
                else if (w1[i] > 'z')
                {
                    w2 += "--";
                }
                else
                {
                    w2 += "_ ";
                }
            }
        }
    
        void printStatistics()
        {
            static int round = 1;
            std::cout << "Round:      " << round << "\n";
            std::cout << "Tries:      " << tries << "\n";
            std::cout << "Rights:     " << right << " (" << (right * 100.0f / tries) << " %)\n";
            std::cout << "Health:     " << health << " from 100\n";
            std::cout << "Hints left: " << hintsLeft << "\n";
            round++;
        }
    
        bool hasWord()
        {
            return !w1.empty();
        }
    
        bool stillAlive()
        {
            return health > 0;
        }
    
        int findInToFind(char c)
        {
            int f = 0;
            for (int i = 0; i < w1.size(); i++)
            {
                if (w1[i] == c && w2[i * 2] == '_')
                {
                    f++;
                    w2[i * 2] = c;
                }
            }
    
            tries++;
    
            if (f > 0)
            {
                right++;
            }
            else
            {
                health -= 10;
            }
    
            return f;
        }
    
        void nextHint()
        {
            if (hintsLeft == 0)
            {
                std::cout << "no hints left\n";
                return;
            }
            hintsLeft--;
            std::cout << "hints left: " << hintsLeft << "\n";
    
            tries++;
    
            std::map<char, int> occurencies;
            for (int i = 0; i < w1.size(); i++)
            {
                if (w2[i * 2] == '_')
                {
                    occurencies[w1[i]]++;
                }
            }
            char maxChar;
            int maxCount = 0;
            for (auto it = occurencies.begin(); it != occurencies.end(); it++)
            {
                if (it->second > maxCount)
                {
                    maxChar = it->first;
                    maxCount = it->second;
                }
            }
            for (int i = 0; i < w1.size(); i++)
            {
                if (w1[i] == maxChar && w2[i * 2] == '_')
                {
                    w2[i * 2] = maxChar;
                }
            }
        }
    };
    
    int main(int argc, char const *argv[])
    {
        struct ToFind stf(getRandomWordFromWikipedia());
        if (!stf.hasWord())
        {
            return EXIT_FAILURE;
        }
        std::cout << "The game begins!\n";
        std::cout << "The word(s) you are looking for has a length of " << stf.w1.size() << "\n";
        while (stf.w2.find("_") != std::string::npos && stf.health > 0)
        {
            stf.printStatistics();
            std::cout << stf.w2 << "\n";
            std::cout << "Which letter next? (9 for help)\n";
            char c;
            std::cin >> c;
            if (c == '9')
            {
                stf.nextHint();
            }
            else
            {
                int f = stf.findInToFind(c);
                if (f > 0)
                {
                    std::cout << "Great, the letter " << c << " appeared " << f << " times!\n";
                }
                else
                {
                    std::cout << "Unfortunately you weren't lucky this time ...\n";
                }
            }
        }
        std::cout << "The game is over ...\n";
        if (stf.stillAlive())
        {
            std::cout << "Great, you found the word " << stf.w1 << "!\n";
        }
        else
        {
            std::cout << "Unfortunately you didn't find the word " << stf.w1 << ". :(\n";
        }
        stf.printStatistics();
        std::cout << "Any char to continue ...\n";
        char c;
        std::cin >> c;
        return EXIT_SUCCESS;
    }
    

    Ich denke langsam, mein Computer spinnt hinsichtlich des Encodings ... (Cygwin, Win11, PS, g++, .exe ...)



  • @wpi Da du Sonderzeichen mit "--" darstellen willst, denke ich das es um Umlaute geht, die dann z.B. zu "ae" werden sollen. Such mal ein "ä" in einer ASCII Tabelle 😉

    Wenn dein Wort aus eine online Quelle kommt, würde ich darauf tippen, dass es UTF8 kodiert bei dir ankommt. std::string nutzt intern char. Ein UTF kodiertes Zeichen kann aber bis zu 4 Byte lang sein. Wenn du da immer einen Char überprüfst, wird das nicht funktionieren.


  • Gesperrt

    Danke für den Hinweis auf UTF-8 vs. char ...

    Was sollte ich denn jetzt ändern, kann man std::string auf UTF8 umstellen?

    Ich möchte Sonderzeichen wie ä ö ü und é è ê und was es noch so alles gibt ... durch -- darstellen (weil ich die in der Konsole auch gar nicht eingeben kann). Nur A-Z a-z 0-9 und . sollen erlaubt sein.



  • @wpi Du kannst dir Angucken, wodran man UTF-8 Zeichen erkennen kann und das mühsam manuell machen, oder dir eine Lib Suchen, die dir die Arbeit abnimmt. Ich würde mich für zweites entscheiden.


Anmelden zum Antworten