Was soll ich programmieren(Anfänger)?



  • Ich hab vor einem Jahr angefangen C++ zu lernen.
    Seitdem hab ich ein Lotto Simulation und Tic Tac Toe Spiel (was gegen einen spielt)
    programmiert.Jetz wollte ich eine 4 Gewinnt spiel Programmiern aber irgentwie weiß ich net wie ich des machen soll 😕
    Ich hab dann mal im Internet geguckt un hab aber nur was von KI gefunden weiß aber net wie des gehen soll. 😞 Wär sehr dankbar wenn mir jemand helfen könnte.
    Und wenn ich schon dabei bin kann mir jemand sagen wie ich was bei einem Programm dauerhaft speichern kann auch wenn das Programm geschlossen wird.Oder wie ich das Programm sih selber umschreiben lassen kann???
    Freu mich für jede Antwort 😉



  • 4 Gewinnt ist als gegner nicht mehr ganz trivial.

    Eine einfache Version könnte, immer wenn du 3 in einer Reihe hast den 4. zu verhindern und sonst an einer eigenen reihe bauen, wenn er Fallen erkennen soll wirds kompliziert, nichts für anfänger beim Programmieren (vll für KI-Anfänger 😉 )

    Wenn du wie bei 4 Gewinnt eine feste Spielfeldgröße hast ist speichern eigentlich ganz einfach:
    1 für Spieler 1
    2 für Spieler 2
    0 für leer

    dann hast du das spielfeld warscheinlich als char feld[][] oder int feld[][]

    2 verschachtelte for-Schleifen, die äußere vertikal die innere horizontal das feld durchlaufen lassen, kennziffer in eine Textdatei schreiben, leerzeichen anfügen. Dann kannst du immer nach durchlauf der inneren Schleife noch '\n' anfügen.

    lässt sich dann über ifstream wieder einlesen 😉



  • Wenn du bei einem Programm dauerhaft etwas speichern willst brauchst du Dateien. Sieh dich mal nach fstream, ifstream und ofstream um. (sehr hilfreich ist www.cppreference.com)



  • Ich hab im internet nichts überftream,ifstream oder ofstream gefunden könn ihr mir grob sagen was des machen soll oder wie man des anwendent??



  • Hallo Kollege!
    Programmiere selbst auch erst seit gut einem Jahr auf C und C++! Um ein Spielbrett zu zeichnen währe die Antwort von "darthdespotism" nicht schlecht: einfach in einer For-Schleife. Weiß ja nicht was du schon für Kenntnisse hast also hier einfach mal ein kleines Beispiel einer For-Schleiße:

    for (int x = 0; x < 10; ++x) {
      for (int y = 0; y < 10; ++y) {
        /* Zeichen-Operationen mit den Koordinaten x und y */
      }
    }
    

    Um dinge abzuspeichern kannst du z.B. mit den C Funktionen wie z.B. "fopen" (FileOpen) usw. mit Dateien arbeiten, also Dateien- erstellen/ lesen/ schreiben!
    Auch hierzu gerne ein kleines Beispiel:

    FILE *hFile // mein FileHandle
    if (hFile = fopen("C:\Datei.txt", "w")) { /* "w" steht für write */
      fprintf(hFile, "Dies ist mein gespeicherter Text!"); /* "..." ist ein char* (Char-Pointer) */
      fclose(hFile);
    }
    // Nun laden wir den Text wieder
    if (hFile = fopen("C:\Datei.txt", "r")) { /* "r" steht für read */
      char StrRead[1024]; /* Anzahl der max. zu lesenden Zeichen */
      fgets(StrRead, 1024, hFile); /* in den char* 'StrRead' wird die zu ladende Zeile geschrieben! */
      fclose(hFile);
    }
    

    Hoffe ich konnte helfen und du kannst was damit anfangen! 🙂



  • naja, wie man mit cout und cin umgeht weiszt du, ja?

    nun machst du:

    ifstream in("dateiname.dat");
    

    resp.

    ofstream out("dateiname.dat");
    

    und kannst dann anstelle von cin eben in und anstelle von out cout schreiben (gleiche handhabung halt)

    inkludieren musst du fstream

    Es ist natürlich mehr dahinter, aber es sollte fürs erst reichen.
    Sieh dich mal an entsprechender Stelle um, also bei einem Tutorial. Vielleicht auf www.volkhard.de ich weisz aber nicht mehr ob ers drin hatte.



  • Danke jetz muss ich nur mal anfangen. 🙂 😃 🙄
    Nen Feld hatte ich schon mal gemachr bei nem Tic Tac Toe Spiel aber ich konnt
    damals noch nie z.B. ne Highscore oder so schreiben.



  • Bin froh dass ich dir helfen konnte! 😃

    An deiner Stelle würde ich mir gleich ein paar Funktionen schreiben die du immer wieder in deinen Programmen einsetzten kannst! Z.B. "ReadFile(int nr, char *filename)" oder so! Die Nummer verwändest du dann einfach für ein Array! Falls das jetzt etwas blöd zu verstehen ist, hier ein kleines Beispiel:

    #define MAX_FILES 10
    FILE *hFile[MAX_FILES];
    
    bool ReadFile(int nr, char *file_name) {
      if (hFile[nr] = fopen(file_name, "r"))
        return true;
      else
        return false;
    }
    
    bool EOF(int nr) {
      return feof(hFile[nr]); /* hab ich noch nicht erwähnt! EOF steht für File-EndOfFile */
    }
    
    /* Sonstige Funktion wie z.B. "ReadString", "WriteString" usw. */
    

    Neben bei:
    Wenn du einen char* bzw. 'char zeile[]' hast und willst ihn in einen C++String umwandeln kannst du dass z.B. so machen:

    zeile[1024];
    string str;
    
    fgets(zeile, MAX_STR_LEN, hFile[nr]);
    zeile[strlen(zeile)-1] = 0;
    /* letztes Zeichen muss durch die Zahl 0 (nicht Ziffer 0) ersätzt werden damit C++ weiß, dass die Zeile zuende ist */
    for (unsigned int i = 0; i != strlen(zeile); ++i)
    /* i muss unsigned sein weil die Funktion 'strlen(...)' auch unsigned ist! (gibt die Anzahl Zeichen in einem char* zurück!) */
      str += zeile[i];
    

    Hoffe ich konnte dir damit noch mal helfen! 🙂

    Aber mal nur so aus Interesse: welche Grafikbibliothek verwändest du für deine Spiele?



  • Wir sind hier im C++ Forum ... und das was du da schreibst ist unter C++ kein sauberes Programmieren ...

    und wenn dann müsste dein code

    bool ReadFile(size_t file_number, const char* file_name) 
    {
        if (file_name == NULL || file_number >= MAX_FILES)
            return false;
    
        hFile[file_number] = fopen(file_name, "r"))
    
       return (hFile[file_number] != NULL);
    }
    

    ... und selbst dann ist das mehr C als C++ -.-

    und dein anderer Code ist auch schwachsinnig -.- ... so wäre das wohl sinniger:

    std::ifstream file_stream(std::ios::in | std:ios::binary);
    if (!file_stream)
        return false;
    
    std::string string_line;
    while (file_stream.eof() == false)
    {
        std::getline(file_stream, string_line);
        // Hier ist string_line mit Daten gefüllt.
    }
    file_stream.close();
    

    Und zu deinem Edit ... er braucht normal für sowas GARKEINE Grafikbibliothek.



  • SCHLAU! 😡

    Ich hatte auch nicht wegen des Dateien Lesen und Schreibens nach der Grafikbibliothek gefragt sondern weil er von einem Spiel geredet hatte!

    Außerdem heißt das Forum "C/C++ Forum" und ich habe eben eine C Funktion aufgeführt, zugegeben nicht perfeckt aber es sollte ja auch nur als BeispielIdee dienen.
    Und da ich bis her noch nicht gerade von eigenen Beispielen überschüttet wurde wollte ich eben einem anderen Anfänger ein paar meiner Beispiele geben, da ich seine Situation durchaus kenne!



  • Es heiszt C/C++ Forum, aber wir sind hier im C++ Berreich, wenn du es dir mal ansiehst.



  • Habe Vier Gewinnt programmiert und es in die ZFX Open Source Ecke gestellt. Es handelt sich um eine Version 1.0.
    Einige Sachen sind erst in neueren Versionen realisiert (verbesserte KI-Stärke, KI in Thread ausgelagert, absolute Flicker-Free-Drawing, GUI Verbesserungen).

    Die Version, die ich veröffentlicht habe hat eine mittelgute bis gute KI. Kannste Dir ja mal angucken und schauen, ob es Dir weiterhilft.

    Hier die Adresse:
    http://www.zfx.info/OpenSource.php?ID=3

    Verwendet wird nur die WinApi.



  • Bis jetz hab ich noch gar keine Grafikbibliothek benutzt.
    Ich hab alles nur immer mit so ner Konsole gemacht Wo ich dann z.B. mein Tic Tac Toe Feld so dargestellt hab:
    1|0|0
    2|2|0
    1|0|0
    naja daran kann man noch arbeiten 😃
    Die Beispiele hab ich zwar net alles verstanden aber so des Grundprinzip. Muss mal in einem Buch weiter lesen damit ich alles versteh.Aber danke für eure Hilfe 👍



  • Hab mal ne Frage warum klappt das nicht oder was macht das Überhaupt:

    FILE*hFile;
    hFile=fopen("C:\highscore.txt","w");

    fprintf(hFile,"Ein Sieg");
    fclose(hFile);
    }

    Ich kanns zwar ohne Error Meldung combilieren lassen aber es Tut nicht das was es soll oder was ich dachte was es machen soll. 😡



  • Tut mir leid, hat noch kleines gefehlt!
    Du musst noch die Bibliothek "iostream" inkludieren!

    #include <iostream> /* Input- Output Streams */
    

    Also, ich hab`s jetzt noch mal als ganz kleines Programm geschrieben und getestet! Bei mir funktioniert folgender Code einwandfrei:

    // SimpleFileTest3 - (24.3.2007)
    
    #include <iostream>
    
    int main(void) {
        FILE *hFile;
        if (hFile = fopen("MyFile.txt", "w")) {
            fprintf(hFile, "Dieser Text wurde von einem C Programm erstellt!");
            fclose(hFile);
        }
        return 0;
    }
    
    // ==========
    


  • Hallo

    Sorry, aber das hier ist ein c++-Forum und da sollte man eben auch möglichst c++-Lösungen anbieten. Das, was du da machst gehört ins c-Forum.

    chrische



  • Tut, mir leid wenn euch dass wirklich so sehr stört! 😞

    ich weiß ja dass das C ist und nicht C++ ist aber auf die letzte Rückfrage musste ich eben noch mal kurz ne Antwort geben!

    Aber da ich neu bin werd ich in Zukunft mehr darauf anchten! 👍



  • Das klappt nicht, weil Du den Backslash im Pfadnamen nicht escapt hast.

    hFile=fopen("C:\highscore.txt","w");
    

    So müsste es gehen...

    hFile=fopen("C:\\highscore.txt","w");
    


  • Stimmt 'NickHappy', darauf hab ich in seinem Programm gar nicht geachtet! 💡

    In Windows ist das eh egal ob man "/" oder "\" schreibt und um nicht immer "\" schreiben zu müssen schreibe ich nur noch "/"! 😉



  • LukasBanana schrieb:

    In Windows ist das eh egal ob man "/" oder "\" schreibt und um nicht immer "\" schreiben zu müssen schreibe ich nur noch "/"! 😉

    Lieber Lukas,

    ich kann zwar nicht mit Sicherheit sagen, ob Du da Recht hast, weil ich ausschliesslich unter Linux arbeite. Aber ich könnte mir vorstellen, dass das vom verwendeten SDK abhängt. Wenn Du mit VC++ arbeitest ist das möglicherweise anders, als wenn Du g++ (MinWG, DevC++) verwendest. Vielleicht kann da mal ein Windows-Entwickler was zu sagen, der Fall interessiert mich jetz mal.

    Ist das Implementeirungsabhängig? Setzen die Gnu-Libraries den Slash bei Dateioperationen automatisch in einen Backslash um? Wie macht VC das?

    Grüsse
    emax

    PS: ich frage aus aktuellem Anlass: mein derzeitiges Projekt wird unter Linux entwickelt, soll aber portabel sein, Zielplattformen: Linux, AIX, Windows und (wirklich!) AS400.



  • Hallo "emax",

    Das du unter Linux arbeitest find ich echt klasse, ich will selbst bald von Windows abkommen, hab auch schon unter VMWare Workstation mein kleines KnopixLinux laufen! 🙂

    Ich arbeite mit "GnuC++"! In GnuC++ schneit das mit dem Slash oder Backslash egal zu sein, auch in PureBasic und Blitz3D ist das unwichtig!
    Wie dass in VisualC++ aussieht weiß ich nicht aber vermutlich ist das Windows allgemein egal, dafür ist Windows ja auch bekanntlich langsamer als Linux! 😉


Anmelden zum Antworten