C Programm Schiffe versenken



  • Hallo.
    Ich bin zurzeit dran das Spiel Schiffe versenken in C zu programmieren. Es soll nichts kompliziertes sein, ein einfach 5x5 Feld, 5 Schiffe á größe 1 Feld, 2 Spieler die selber setzen und eine anschließende Auswertung wer gewonnen und verloren hat.

    Nun bereits bin ich wie folgt vorgegangen:
    - Ich habe 6 eindemensionale Arrays untereinander gemacht wo das erste Array A-E ausgeben und die restlichen nur Ws für Wasser, das ganze in einer Ausgabe Funktion so das ich es immer wieder benutzen könnte

    Mein weiteres vorgehen sollte wie folgt aussehen, ich habe entweder vor eine switch-case Anweisung zu machen mit (ja wirklich) 25 cases für alle Fälle, A1-D5, in jedem case will ich dann die Funktion einbauen, das er dann jenachdem das 2., 3., 4., 5. oder 6. an der richtigen Position ein W durch ein S ersetzt und das 2x für Eigenes Feld und Gegner, und nach den switch cases dann die Ausgabe der 2x 6 Arrays nebeneinander.
    Nun wäre halt die Frage, kann ich "A1" o.Ä. als case nehmen? Bisher ging das nicht so richtig, auch soll ja die switch anweisung nur 5x durchlaufen werden mit keinen doppelten Eingaben, dann soll auch die veränderung im Array gespeichert werden und hinterher beim Schießen auf die Schiffe auch geprüft werden ob jeweils ein W oder S da ist

    Das wäre so grob mein Plan, ich weiss nicht was haltet ihr davon? Ist das überhaupt möglich? Habt ihr vielliecht eine komplett andere Idee?

    Danke für alles 🙂

    PS: Bin Anfänger 😃



  • case mit "A1" usw. geht natürlich nicht.
    Baue dir ein Koordinatensystem mit int x,y und setze Funktionen ein für jede Operation die du brauchst (fill,check,display,...).



  • Pascal007 schrieb:

    Es soll nichts kompliziertes sein, ein einfach 5x5 Feld, 5 Schiffe á größe 1 Feld, 2 Spieler die selber setzen und eine anschließende Auswertung wer gewonnen und verloren hat.

    Rechtschreibung? Zeichensetzung?

    Und meinst du nicht zwei Spielfelder? Für jeden Spieler eines? Damit die ihre Schiffe auf dem gleichen Feld platzieren können? "A-3" - "Treffer!" - "Bei mir auch!" - "Was?"

    Pascal007 schrieb:

    - Ich habe 6 eindemensionale Arrays untereinander gemacht

    "ich habe X gemacht" - schlechter Ausdruck.

    Und warum?

    /*Größe*/
    #define SIZE_X (5U)
    #define SIZE_Y SIZE_X 
    
    /*Spielfelder*/
    enum tile map1[SIZE_X * SIZE_Y];
    enum tile map2[SIZE_X * SIZE_Y];
    

    Musst dann halt nur noch definieren, welche Zustände ein enum tile annehmen kann. Gibt ja nicht so viele: Wasser, Schiff, Treffer ... damit lässt sich arbeiten.

    Und deine Ausgabe machst du gleich für ein Spielfeld. Dann kannst du vor der eigentlichen Ausgabe die Spaltenbuchstaben ausgeben und dann durch jede Line noch mal die Zeilennummer, und dann den Zustand des Feldes. Das sind vielleicht 4 Zeilen Code mit printf .

    Pascal007 schrieb:

    Mein weiteres vorgehen sollte wie folgt aussehen, ich habe entweder vor eine switch-case Anweisung zu machen mit (ja wirklich) 25 cases für alle Fälle, A1-D5, in jedem case will ich dann die Funktion einbauen, das er dann jenachdem das 2., 3., 4., 5. oder 6. an der richtigen Position ein W durch ein S ersetzt und das 2x für Eigenes Feld und Gegner, und nach den switch cases dann die Ausgabe der 2x 6 Arrays nebeneinander.

    Ich habe keinen Plan, was du hier vermitteln willst.

    Lies doch einfach die Eingabe ein, konvertiere Buchstaben/Zahlenkombination in einen Index, und den nutzt du dann einfach, um in map_x zu prüfen, ob da nur Wasser oder Schiff ist. Und wenn da Schiff ist, dann ist es ein Treffer. Nix mit 25 Switch Cases.

    Für die Berechnung an sich willst du vermutlich fgets verwenden, und den Index bekommst du (beim Format "Buchstabe-Zahl") durch:

    if((unsigned char)buffer[0] - 'A' > SIZE_X
    || buffer[1] != '-'
    || (unsigned char)buffer[2] - '0' > SIZE_Y)
    {
        /*Fehlerbehandlung*/
    }
    
    index = (buffer[2] - '0') * SIZE_X + buffer[0] - 'A';
    if(map_x[index] == TILE_SHIP)
    {
        puts("TREFFER!");
        map_x[index] = TILE_HIT;
    }
    

    Das unsigned char ist hier wichtig, weil uns das erlaubt, die Checks so einfach wie möglich zu gestalten, ansonsten müssten wir auch auf kleiner prüfen.

    EDIT: Damit der Check auch funktioniert, müssen SIZE_X und SIZE_Y das U -Suffix bekommen. Sonst wird der Vergleich mit vorzeichenbehafteten Werten gemacht, und dann braucht man nur ein Leerzeichen als Buchstabe eingeben, und es wird akzeptiert.



  • dachschaden schrieb:

    Ich habe keinen Plan, was du hier vermitteln willst.


Log in to reply