Mehrere Schiffe implementieren im Battleship Game

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DRAXX
User
Beiträge: 9
Registriert: Freitag 28. August 2020, 06:50

Hallo, ich habe dieses Battleship vor einiger Zeit programmiert und möchte nun mehr als ein Schiff haben.

Code: Alles auswählen

from Ship import Ship
from random import randint

print("""
                                                ___      ____      ___  ______________    ____            _______________    _______________      _____        _____   ______________
                                                \  \    /    \    /  /  |     ________|  |    |          /       _______|   /               \    |   _ \      / _   |  |     ________|
                                                 \  \  /  /\  \  /  /   |     |____      |    |          |      /          /       ___       \   |  | \ \    / / |  |  |     |____
                                                  \  \/  /  \  \/  /    |      ____|     |    |          |     |          |       |___|       |  |  |  \ \  / /  |  |  |      ____|
                                                   \    /    \    /     |     |_______   |    |________  |      \_______   \                 /   |  |   \ \/ /   |  |  |     |________
                                                    \__/      \__/      |_____________|  |_____________|  \_____________|   \_______________/    |__|    \__/    |__|  |______________|

                                                                                                  ______________      _______________
                                                                                                 |_____    _____|    /               \
                                                                                                       |  |         /       ___       \
                                                                                                       |  |        |       |___|       |
                                                                                                       |  |         \                 /
                                                                                                       |__|          \_______________/


                                                             ______________         _______       ______________    ______________    ____            _______________
                                                            |       _      \       /   _   \     |_____    _____|  |_____    _____|  |    |           |     _________|
                                                            |      |_|      |     /   / \   \          |  |              |  |        |    |           |     |____
                                                            |     _________/     /   /___\   \         |  |              |  |        |    |           |          |         _____
                                                            |       _      \    /   _______   \        |  |              |  |        |    |           |      ____|        |_____|
                                                            |      |_|      |  /   /       \   \       |  |              |  |        |    |________   |     |_________
                                                            |______________/  /___/         \___\      |__|              |__|        |_____________|  |_______________|


                                                                                      ______________      ____          ____    ____    ___________
                                                                                    /      ____     \    |    |        |    |  |    |  |      _    \
                                                                                   /      |    |____|    |    |        |    |  |    |  |     |_|    |
                                                                                   \      |__________    |    |________|    |  |    |  |    _______/
                                                                                    \____________    \   |     ________     |  |    |  |   |
                                                                                    _____        |    |  |    |        |    |  |    |  |   |
                                                                                    \    \_______|    |  |    |        |    |  |    |  |   |
                                                                                     \_______________/   |____|        |____|  |____|  |___|
                                                                                    """)

def createBoard(x,y):
    board = []
    for i in range(y):
        row = []
        for j in range(x):
            row.append("O")
        board.append(row)
    return board

def printBoard(board):
    numbers = []
    for i in range(1,len(board[0])+ 1 ):
        numbers.append(str(i))
    print(" ", " ".join(numbers))
    counter = 1
    for row in board:
        print(str(counter)," ".join(row))
        counter +=1

name_spieler = input("Wie heisst du?: ")
print("Ok, los gehts", name_spieler, "!")
board = createBoard(9, 9)
printBoard(board)

def random_reihe(board):
        return randint(0, len(board) - 1)

def random_kolone(board):
        return randint(0, len(board[0]) - 1)

schiff_reihe = random_reihe(board)
schiff_kolone = random_kolone(board)

#user wird zum raten gefragt
def main():

    Punkte = 0

    for turn in range(40):
        rate_reihe = None
        rate_kolone = None
        while rate_reihe is None:
            try:
                rate_reihe = int(input("Rate die Reihe (1-9): "))-1
                if rate_reihe in range(len(board)):
                    pass
            except ValueError:
                    print("Bitte eine Nummer eingeben: ")
        while rate_kolone is None:
            try:
                rate_kolone = int(input("Rate die Kolone (1-9): "))-1
                if rate_kolone not in range(len(board)):
                    pass
            except ValueError:
                    print("Bitte eine Nummer eingeben: ")

    #Wenn Spieler das richtige Feld getroffen hat
        if schiff_reihe == rate_reihe and schiff_kolone == schiff_kolone:
          board[rate_kolone][rate_reihe] = "X"
          print("Glückwunsch, du hast das Battleship gesenkt! ")

          if turn == 1:
            Punkte += 3
            print("Du hast", Punkte, "Punkte")
          elif turn == 2:
            Punkte += 2
            print("Du hast", Punkte, "Punkte")
          else:
            Punkte += 1
            print("Du hast", Punkte , "Punkte")

            restart = input("Willst du nochmal spielen ?: ")
            if restart == "ja" or "Ja":
                  main()
                  printBoard(board)
            else:
                if __name__ == '__main__':
                    main()
                    print("Du hattest", Punkte, "Punkte")
                    print("Game Over")

    # den spieler warnen falls er ausserhalb des Spielfeldes geraten hat
        else:
            if (rate_reihe < 0 or rate_reihe > 10 ) or (rate_kolone < 0 or rate_kolone > 10):
                print("Oops, das ist leider nicht im Spielfeld.")
    # warnen falls gleich geraten wurde wie vorher
            elif board[rate_kolone][rate_reihe] == "*":
                print("Da hast du schonmal geraten.")
    #Wenn die Rate falsch ist, dann das Feld mit * markieren
            else:
                print("Du hast nicht getrofen!")
                board[rate_kolone][rate_reihe] = "*"

    #Turn und board nochmals hier ausdrucken
            print("Runde ",  str(turn + 1 ), "von 40.")
            printBoard(board)

#Wenn der Spieler es 40 mal versucht hat und nicht getroffen hat, das Spiel beenden
if __name__ == '__main__':
    main()
    print("Du hattest", Punkte, "Punkte")
    print("Game Over")
Zudem habe ich auch ein Class gemacht, dass dies ermöglichen solle, ich weiss aber nicht wie ich es implementieren soll. Hier ist der Code dafür :

Code: Alles auswählen

from random import randint

class Ship:
    size = randint(1, 5)
    position = []
    ships = 4
    def __init__(self, position:list, size = randint(1, 5), ships = 4):
        self.size = size
        self.position = position

    def x(self):
       return self.position[0]
    def y(self):
       return self.position[1]

    def getSize(self):
        return self.size

    def num_Ships(self):
        return self.ships
Bin für jede Antwort dankbar.
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, nicht mal 2 und mal 6.
Variablennamen und Funktionen werden komplett klein geschrieben. Auf oberster Ebene sollte kein ausführbarer Code stehen, vor allem nicht mitten zwischen Funktionsdefinitionen und vor allem nicht, wenn Du schon eine main-Funktion hast.

Zur Klasse: es darf keine Klassenvariablen geben, zumal Du sie ja in __init__ hast alle wieder überschreibst.
Die Typannotation ist überflüssig und zu sehr einschränkend.
Defaultparameter werden bei der Definition der Funktion ausgewertet, das randint wird also nur einmal aufgerufen und alle Schiffe haben den selben size-Wert.
Triviale Getter schreibt man in Python nicht. `ships` hat in einer Klasse `Ship` nichts zu suchen, weil es ja 1 Schiff beschreibt.
x und y würde ich als Properties definieren.

Code: Alles auswählen

class Ship:
    def __init__(self, position, size=None):
        if size is None:
            size = randint(1, 5)
        self.size = size
        self.position = position

    @property
    def x(self):
        return self.position[0]

    @property
    def y(self):
        return self.position[1]
Im Hauptprogramm mußt Du halt einige Schiffe erzeugen, in einer Liste speichern und beim Suchen von Treffern immer für jedes Schiff in der Liste die Prüfung machen.
DRAXX
User
Beiträge: 9
Registriert: Freitag 28. August 2020, 06:50

Ja, aber wie, Entschuldigung falls dies etwas nervig ist, ich bin aber ein Anfänger und zerbreche mir den Kopf darüber. Ich weiss einfach nicht, wie ich es machen soll.
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

Teile Dein Problem in kleine Unterprobleme, die Du einfach lösen kannst. Erster Schritt wäre, genau zu beschreiben, welche Schritte das Programm nacheinander ablaufen soll, also 1. Feld mit Schiffen erzeugen, 2. Nutzer nach Position frage, 3. Testen, ob dort ein Schiff ist. usw.
Antworten