Spiel in C++
-
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.
-
curlpp::options::Url(string("https://de.wikipedia.org/wiki/Special:Random"))
funktioniert nicht , Ergebnis ist leer.Jemand eine Idee?
-
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.
-
-
@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.
-
@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.
-
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...
-
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.
-
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:
- Den XML-DOM-Baum parsen ... oder
- 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.
-
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.
-
@hustbaer Bitte schau dir auch mal mein anderes Thema an ...
-
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.
-
@wob
Sorry, hat sich schon erledigt, da war noch zu viel falsch.