C++ Schiffe Versenken



  • Stichwort: Modularität

    Wenn du beispielsweise die interne Spiellogik von der Ein- und Ausgabe getrennt hast, dann könntest du irgendwann einfach diese Spiellogik-Dateien nehmen und statt der Konsole ein Projekt mit einer Windows-GUI erstellen.
    Außerdem gibt es eine Richtlinie, daß einzelnen Dateien nicht größer als ca. 1000 Zeilen groß sein sollten (damit man noch einen Überblick darüber hat).

    P.S. Ich muss sagen, dein Code hat mich sehr an meine ersten BASIC Programme erinnert (auf dem C16 bzw. C64) - trotz C++. Und daher verstehe ich auch, warum es für Anfänger einfacher ist mit Imperative Programmierung zu beginnen (und so zu denken) als gleich mit objektorientierter Programmierung (und Denkweise).
    Als nächsten Schritt solltest du deinen Code in kleinere Funktionen unterteilen (am besten gleich so, daß du Eingabe, Verarbeitungsfunktionen (Spiellogik) und Ausgabe getrennt hältst).
    Und viele deiner bisherigen Codezeilen lassen sich stark vereinfache. Laß einfach den Computer für dich rechnen, anstatt selber, z.B. deine switch-case-Anweisungen:

    Pair Koordinatenverarbeitung(int x, int y) // oder besser char x, char y
    {
      int x1 = 0;
    
      if (x >= 'A' && x <'Z')
        x1 = 10 * (x - 'A' + 1);
      else if (x >= 'a' && x <'z')
        x1 = 10 * (x - 'a' + 1);
    
      // ähnliches für y
      // ...
    }
    

    (oder zusätzlich noch toupper() bzw. tolower() verwenden, damit man nur einmal die Formel hinschreiben braucht)

    Oder deine AppData-Zuweisung zu

    strcpy(&appdata[i], "\\C++ Schiffe versenken\\Optionen.cfg");
    

    usw...

    Viel Spaß und Erfolg weiterhin.



  • Ok, Danke für deine Tipps!

    Die switch case in der Koordinatenverarbeitung habe ich schon durch tolower ersetzt.

    Das mit Appdata werd ich auch noch änder, Danke. Nachdem ich damit fertig bin teil ich das Programm dann mal auf



  • Konnte jetzt ein paar Tage nicht weiter dran arbeiten, habe aber jetzt wieder Zeit.

    Wenn ich das mit dem strcpy verwende, bekomme ich folgenden Fehler:
    error C2664: 'strcpy': Konvertierung des Parameters 1 von 'TCHAR *' in 'char *' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Was könnte ich den sonst nehmen um einen String an ein TCHAR "dranzuhängen"?



  • Das liegt am MSVC. Du scheinst mit Unicode Support* zu kompilieren.

    *Weitet sich das TCHAR Gedöns echt bis auf strcpy aus???



  • Was meinst du mit deinem letzten Satz?

    EDIT: Und kann ich Unicode Support deaktivieren bzw. ist Unicode Support für irgendwas wichtig?



  • Unicode kann man über die Präprozessoreinstellungen (in den Projekteinstellungen) deaktivieren ("_UNICODE" entfernen) und wird nur benötigt, wenn du Nicht-ASCII-Zeichen anzeigen lassen willst (z.B. Umlaute, kyrillisch, arabisch, etc.)

    Aber wenn du durchgehend TCHAR in deinem Programm benutzt, dann mußt du auch die jeweiligen MS-Ersatzfunktionen benutzen, z.B. für strcpy -> _tcscpy, s. strcpy, wcscpy, _mbscpy.

    Für ein reines Konsolenprogramm (als Anfänger) würde ich dir wirklich empfehlen, UNICODE zu deaktivieren und statt TCHAR überall nur char zu benutzen. Wichtig ist dann auch _tmain durch main zu ersetzen).

    Bei der Umstellung wirst du dann erst ein paar Fehler erhalten, aber daraus lernt man ja...



  • Ok, Danke. Denke trotzdem, dass ich UNICODE drin lassen werde und dann halt die Ersatzfunktion verwenden werde, weil ich schon gerne Umlaute ausgeben lassen würde. Damit funktionierts übrigens einwandfrei!
    Danke 😉

    Habe aber hier noch eine allgemeine Frage:

    string s = columns*10+27;
    

    Wie kann ich das ausrechnen lassen und dann als ZAHL im string speichern? Gibt es eine Funktion dafür?


  • Mod

    jkhsjdhjs schrieb:

    Wie kann ich das ausrechnen lassen und dann als ZAHL im string speichern? Gibt es eine Funktion dafür?

    Ab C++11 gibt's to_string dafür. Ohne C++11 geht's auch über Stringstreams, spezielle Features der Implementierung (manche Compiler kennen ein itoa) oder zur Not auch a la C über sprintf.

    Aber to_string sollte hier die bevorzugte Methode sein.



  • Danke!

    Ich hab VC++ Express 2008 und string included, dennoch gibt es Fehler:

    error C3861: "to_string": Bezeichner wurde nicht gefunden.
    

    Nutzt VC++ Express 2008 kein C++11 bzw. seit wann gibt es C++11?



  • jkhsjdhjs schrieb:

    Danke!

    Ich hab VC++ Express 2008 und string included, dennoch gibt es Fehler:

    error C3861: "to_string": Bezeichner wurde nicht gefunden.
    

    Nutzt VC++ Express 2008 kein C++11 bzw. seit wann gibt es C++11?

    Seit 2011 gibt es das.



  • Ah, okay. Na dann werd ich wohl in VC++ 2012 weiterprogrammieren. Danke 😉


  • Mod

    jkhsjdhjs schrieb:

    Nutzt VC++ Express 2008 kein C++11 bzw. seit wann gibt es C++11?

    C++11 steht für 2011, was die andere Frage wohl beantworten sollte. Es war zwar schon lange vorher bekannt, dass es kommen würde und was ungefähr drin sein würde, aber beim Microsoft-Compiler hat man erst in der 2010er Version angefangen, die Neuerungen im großen Stil einzufügen.

    Kommt ein Upgrade in Frage? 2008 ist schon eine ganze Weile her, besonders in Computerbelangen. 5 Jahre sind 1/3 der Zeit, seit es C++ als offiziell standardisierte Sprache gibt! Da die Expressversionen für private Zwecke kostenlos sind, sollte es doch kein Problem sein, etwas aktuelleres einzusetzen.



  • Jo. Habe VC++ 2008 auch nur genutzt, weil die bei uns in der Schule die selbe Version nutzen und damit ich dann nicht immer ein neues Projekt erstellen muss, sondern ein und das selbe zu Hause und in der Schule verwenden kann. Danke nochmal 😉



  • So, hätte da nochmal ne Frage.
    Habe ja jetzt auch die Dateispeicherung eingebaut.
    Beim Debugging hat auch alles einwandfrei funktioniert. Nur wenn ich dann die Release Version kompiliere um es auf die Website zu stellen, die ich spaßeshalber erstellt habe, dann wird keine Datei geschrieben.
    Habe schon gegooglet, anscheinend haben andere auch ähnliche Probleme. Soll ein Bug im Compiler sein, wie ich gehört habe. Kann ich irgendwas tun, damit ich trotzdem eine Release Version erstellen kann und dass die Dateien geschrieben werden?
    Den Code findet ihr auf schiffe-versenken.de.vc


  • Mod

    jkhsjdhjs schrieb:

    Soll ein Bug im Compiler sein, wie ich gehört habe.

    Ich behaupte einfach mal, dass der Fehler in deinem Code ist. Was auch immer der Fehler überhaupt genau ist, denn das beschreibst du nicht.

    Den Code findet ihr auf schiffe-versenken.de.vc

    Großartig. 1200 Zeilen Code, davon 95% irgendwelche gotoxys. Meinst du, das will sich irgendjemand durchlesen, noch dazu mit so einer vagen Fehlerbeschreibung?
    http://www.c-plusplus.net/forum/304133
    http://www.c-plusplus.net/forum/200753
    http://www.tty1.net/smart-questions_de.html
    http://www.tty1.net/smart-questions_de.html#dontclaimbug



  • LMAO! 😃 😃

    Minimum:
    - Intel(R) Pentium(R) III Prozessor mit 300 MHz
    - Grafikkarte mit 32MB GDDR
    - 50MB DDR RAM
    - 100KB freier Festplattenspeicher
    - Microsoft Visual C++ 2008 Redistributable x86 / x64
    - Auflösung: 1920x1080 oder höher

    für ein flüssiges Spielerlebnis empfohlen:
    - Intel(R) Core 2 Duo E7200 3GHz
    - Grafikkarte mit 512MB GDDR3
    - 512MB DDR2 RAM
    - 100KB freier Festplattenspeicher
    - Microsoft Visual C++ 2008 Redistributable x86 / x64
    - Auflösung: 1920x1080 oder höher



  • @SeppJ:
    Aber wie ist es möglich, dass es am Code liegt, wenn es doch beim Debuggen geht und in der Release Version nicht?

    @lolalter:
    Ja, hab einfach iwas hingeschrieben halt ^^


  • Mod

    jkhsjdhjs schrieb:

    @SeppJ:
    Aber wie ist es möglich, dass es am Code liegt, wenn es doch beim Debuggen geht und in der Release Version nicht?

    Klingt nach typischem Symptom von undefinierten Verhalten.



  • SeppJ schrieb:

    jkhsjdhjs schrieb:

    @SeppJ:
    Aber wie ist es möglich, dass es am Code liegt, wenn es doch beim Debuggen geht und in der Release Version nicht?

    Klingt nach typischem Symptom von undefinierten Verhalten.

    SeppJ, so wie ich das verstehe erzeugt die Releasekompilierung keine *.exe Datei.
    Kann aber auch sein, dass der mit "Datei geschrieben" etwas anderes meint.



  • Ja, sry für das Missverständnis. Mein Code soll eine Datei schreiben, in der die Einstellungen gespeichert sind. Dies tut er aber nicht. Sonst funktioniert es einwandfrei. Die Debug-Exe schreibt aber eine Datei mit den Einstellungen, nur halt die Release-Exe nicht.


Anmelden zum Antworten