diff --git a/schiffe-versenken.py b/schiffe-versenken.py index 9a83b82..715d6e1 100644 --- a/schiffe-versenken.py +++ b/schiffe-versenken.py @@ -1,9 +1,13 @@ import random, time -matrixgr = 7 # Größe des Spielfeldes (7x7) +matrixgr = 7 # Größe des Spielfeldes (7x7) -def makeFeld (): - feld = [[[0] for i in range(matrixgr)] for e in range(matrixgr)] # Erzeugt ein mit Nullen befülltes Feld, was bedeutet, dass dort weder ein (zerstörtes) Schiff ist, noch ein fehlgeschlagener Angriff stattgefunden hat + +def makeFeld(): + feld = [[[0] for i in range(matrixgr)] for e in range( + matrixgr)] # Erzeugt ein mit Nullen befülltes Feld, was bedeutet, + # dass dort weder ein (zerstörtes) Schiff ist, noch ein + # fehlgeschlagener Angriff stattgefunden hat return feld @@ -12,58 +16,63 @@ def makeFeld (): def printFelder(): # Von Feld1 werden nur die abgeschossenen Felder gezeigt, von Feld2 alle. - output = [[gegnerFeld [matrixgr]],[' ' + eigenFeld [matrixgr]]] # In die Liste Output werden die auszugebenden Elemente eingetragen, damit sie am Ende alle gleichzeitig nebeneinander ausgegeben werden können + output = [[gegnerFeld[matrixgr]], [ + ' ' + eigenFeld[matrixgr]]] + # In die Liste Output werden die auszugebenden Elemente eingetragen, + # damit sie am Ende alle gleichzeitig nebeneinander ausgegeben werden können for i in output: - i+= [" 1 2 3 4 5 6 7 "] + i += [" 1 2 3 4 5 6 7 "] felder = [gegnerFeld, eigenFeld] - for f in range (2): # f als erstes 0, dann 1 - NZeile = 'A' # Bezeichner für die Zeile + for f in range(2): # f als erstes 0, dann 1 + NZeile = 'A' # Bezeichner für die Zeile for i in felder[f]: zeile = '' for n in i: if n == [0]: - if f == 1: # Zeige ALLE Felder an - zeile+=' [ ] ' # Feld ist leer - elif f==0: # Zeige NUR TREFFER an, ~ um vom eigenen Feld zu differenzieren - zeile+=' [ ~ ] ' - elif n== [1]: - zeile+=' [ . ] ' # Feld wurde abgeschossen - elif n==[2]: - if f == 1: # Zeige ALLE Felder an - zeile+=' [ ■ ] ' # Auf dem Feld ist ein ungetroffenes Schiff - elif f== 0: # Zeige NUR TREFFER an - zeile+=' [ ~ ] ' - elif n==[3]: - zeile+=' [ X ] ' # Das Schiff auf dem Feld wurde getroffen + if f == 1: # Zeige ALLE Felder an + zeile += ' [ ] ' # Feld ist leer + elif f == 0: + zeile += ' [ ~ ] ' + # Zeige NUR TREFFER an, ~ um vom eigenen Feld zu differenzieren + elif n == [1]: + zeile += ' [ . ] ' # Feld wurde abgeschossen + elif n == [2]: + if f == 1: # Zeige ALLE Felder an + zeile += ' [ ■ ] ' + # Auf dem Feld ist ein ungetroffenes Schiff + elif f == 0: # Zeige NUR TREFFER an + zeile += ' [ ~ ] ' + elif n == [3]: + zeile += ' [ X ] ' + # Das Schiff auf dem Feld wurde getroffen - if ord(NZeile.lower())-97 < matrixgr: - output [f] += [NZeile + ' ' + zeile] + if ord(NZeile.lower()) - 97 < matrixgr: + output[f] += [NZeile + ' ' + zeile] else: - output [f] += [' ' + zeile] - NZeile = chr(ord(NZeile)+1) + output[f] += [' ' + zeile] + NZeile = chr(ord(NZeile) + 1) - for i in range (0, len(output[0])): - print (output [0][i], ' ' + output [1][i]) - print ("") + for i in range(0, len(output[0])): + print(output[0][i], ' ' + output[1][i]) + print("") -def setFeld (spielerFeld, zeile, spalte, wert): - #zeile = ord(zeile.lower())-97 # Weil die Zeilen traditionell nach Buchstaben benannt werden, muss erst der Buchstabe in seinen ASCII-Wert umgewandelt werden und dann um 97 verringer (ASCII 97 = 'a') - #spielerFeld [zeile][spalte-1][0] = wert # Weil die Nummerierung der Spalten bei 1 anfangen soll hier -1 +def setFeld(spielerFeld, zeile, spalte, wert): if wert == 5: - wert = getFeld (spielerFeld, zeile, spalte) +1 # Um den Wert im Feld um eins zu erhöhen - spielerFeld [zeile][spalte][0] = wert + wert = getFeld(spielerFeld, zeile, + spalte) + 1 # Um den Wert im Feld um eins zu erhöhen + spielerFeld[zeile][spalte][0] = wert -def getFeld (spielerFeld, zeile, spalte): - #zeile = ord(zeile.lower())-97 - #return spielerFeld [zeile][spalte-1][0] - return spielerFeld [zeile][spalte][0] +def getFeld(spielerFeld, zeile, spalte): + # zeile = ord(zeile.lower())-97 + # return spielerFeld [zeile][spalte-1][0] + return spielerFeld[zeile][spalte][0] -def summeFeld (spielerFeld): +def summeFeld(spielerFeld): summe = 0 for i in spielerFeld: for e in i: @@ -72,7 +81,7 @@ def summeFeld (spielerFeld): return summe -def zweicheck (spielerFeld): +def zweicheck(spielerFeld): for i in spielerFeld: for e in i: for n in e: @@ -80,34 +89,37 @@ def zweicheck (spielerFeld): return True -def checkUmfeld (spielerFeld, zeile, spalte): - if getFeld (spielerFeld, zeile, spalte) == 2: # Wenn auf dem Feld schon ein Schiff ist, kann der Check direkt abgebrochen werden +def checkUmfeld(spielerFeld, zeile, spalte): + if getFeld(spielerFeld, zeile, + spalte) == 2: + # Wenn auf dem Feld schon ein Schiff ist, kann der Check + # direkt abgebrochen werden return False summe = 0 if matrixgr > zeile >= 0 and matrixgr > spalte >= 0: - if zeile+1 < matrixgr: - if getFeld (spielerFeld, zeile+1, spalte) != 2: + if zeile + 1 < matrixgr: + if getFeld(spielerFeld, zeile + 1, spalte) != 2: summe += 1 else: - summe+= 1 + summe += 1 - if spalte+1 < matrixgr: - if getFeld (spielerFeld, zeile, spalte+1) !=2: + if spalte + 1 < matrixgr: + if getFeld(spielerFeld, zeile, spalte + 1) != 2: summe += 1 else: - summe+= 1 + summe += 1 - if zeile-1 >= 0: - if getFeld (spielerFeld, zeile-1, spalte) !=2: + if zeile - 1 >= 0: + if getFeld(spielerFeld, zeile - 1, spalte) != 2: summe += 1 else: - summe+= 1 + summe += 1 - if spalte-1 >= 0: - if getFeld (spielerFeld, zeile, spalte-1) !=2: + if spalte - 1 >= 0: + if getFeld(spielerFeld, zeile, spalte - 1) != 2: summe += 1 else: - summe+= 1 + summe += 1 if summe < 4: return False @@ -115,257 +127,299 @@ def checkUmfeld (spielerFeld, zeile, spalte): return True -def setSchiff (spielerFeld, groesse, belegFeld): +def setSchiff(spielerFeld, groesse, belegFeld): feldsumme = summeFeld(spielerFeld) versuch = 0 - while summeFeld(spielerFeld) != feldsumme + groesse*2 : + while summeFeld(spielerFeld) != feldsumme + groesse * 2: if versuch < 25: - spitze = [random.randint(0, matrixgr-1), random.randint(0, matrixgr-1)] - if checkUmfeld(spielerFeld, spitze[0], spitze[1]): #spitze[0] ZEILE, spitze[1] SPALTE + spitze = [random.randint(0, matrixgr - 1), + random.randint(0, matrixgr - 1)] + if checkUmfeld(spielerFeld, spitze[0], spitze[1]): + # spitze[0] ZEILE, spitze[1] SPALTE if groesse == 1: - setFeld (spielerFeld, spitze[0], spitze[1], 2) - setFeld (belegFeld, spitze [0], spitze [1], 1) # Damit später abgerufen werden kann, wie groß das Schiff auf dem Feld ist. + setFeld(spielerFeld, spitze[0], spitze[1], 2) + setFeld(belegFeld, spitze[0], spitze[1], 1) + # Damit später abgerufen werden kann, + # wie groß das Schiff auf dem Feld ist. else: reihe = [] counter = 0 - #Jetzt wird entschieden, ob das Schiff vertikal oder horizontal ausgerichtet sein soll. - orientierung = random.randint (0,1) #0: horizontal, 1: vertikal + # Jetzt wird entschieden, ob das Schiff vertikal oder + # horizontal ausgerichtet sein soll. + orientierung = random.randint(0, 1) + # 0: horizontal, 1: vertikal if orientierung == 0: - orig = spitze [1] - spitze [1] = counter - counterind = 1 #damit der Counter noch bearbeitet werden kann + orig = spitze[1] + spitze[1] = counter + counterind = 1 + # damit der Counter noch bearbeitet werden kann else: - orig = spitze [0] - spitze [0] = counter + orig = spitze[0] + spitze[0] = counter counterind = 0 - while spitze [counterind] < matrixgr: #Ab jetzt wird überprüft, ob in der ausgewählten Reihe überhaupt das Schiff hinpasst. + while spitze[ + counterind] < matrixgr: +# Ab jetzt wird überprüft, ob in der ausgewählten Reihe überhaupt das Schiff +# hinpasst if checkUmfeld(spielerFeld, spitze[0], spitze[1]): reihe += [spitze[counterind]] else: reihe = [] summe = 0 - if len(reihe) >= groesse and reihe.count(orig)==1: #.count zählt, wie oft die mitgegebene Zahl in der Liste vorkommt. Wenn sie vorkommt und die Liste - for i in range (len(reihe)-1, len(reihe)-groesse-1,-1): #mindestens so lang ist wie das Schiff sein soll, kann weitergemacht werden. + if len(reihe) >= groesse and reihe.count( + orig) == 1: + # .count zählt, wie oft die mitgegebene Zahl in der Liste vorkommt. Wenn + # sie vorkommt und die Liste mindestens so lang ist wie das Schiff sein + # soll, kann weitergemacht werden + for i in range(len(reihe) - 1, + len(reihe) - groesse - 1, + -1): if orientierung == 0: - if checkUmfeld (spielerFeld, spitze[0], i): + if checkUmfeld(spielerFeld, spitze[0], i): summe += 1 else: - if checkUmfeld (spielerFeld, i, spitze[1]): + if checkUmfeld(spielerFeld, i, spitze[1]): summe += 1 if summe == groesse: - for i in range (len(reihe)-1, len(reihe)-groesse-1,-1): + for i in range(len(reihe) - 1, + len(reihe) - groesse - 1, -1): if orientierung == 0: - setFeld (spielerFeld, spitze[0], i, 2) - setFeld (belegFeld, spitze[0], i, groesse) # Damit später abgerufen werden kann, wie groß das Schiff auf dem Feld ist. + setFeld(spielerFeld, spitze[0], i, 2) + setFeld(belegFeld, spitze[0], i, + groesse) + # Damit später abgerufen werden kann, wie groß das Schiff auf dem Feld ist else: - setFeld (spielerFeld, i, spitze[1], 2) - setFeld (belegFeld, i, spitze[1], groesse) # Damit später abgerufen werden kann, wie groß das Schiff auf dem Feld ist. + setFeld(spielerFeld, i, spitze[1], 2) + setFeld(belegFeld, i, spitze[1], + groesse) if summe != groesse: - spitze [counterind] += 1 + spitze[counterind] += 1 versuch += 1 else: - spielerFeld = makeFeld () + spielerFeld = makeFeld() versuch = 0 - if summeFeld(spielerFeld) != feldsumme + groesse*2 : - spielerFeld = makeFeld () - setSchiff (spielerFeld, groesse) + if summeFeld(spielerFeld) != feldsumme + groesse * 2: + spielerFeld = makeFeld() + setSchiff(spielerFeld, groesse) -def fuellFeld (Feld, belegFeld): - for i in range (1): - setSchiff (Feld, 4, belegFeld) +def fuellFeld(Feld, belegFeld): + for i in range(1): + setSchiff(Feld, 4, belegFeld) - for i in range (2): - setSchiff (Feld, 3, belegFeld) + for i in range(2): + setSchiff(Feld, 3, belegFeld) - for i in range (2): - setSchiff (Feld, 2, belegFeld) + for i in range(2): + setSchiff(Feld, 2, belegFeld) - for i in range (3): - setSchiff (Feld, 1, belegFeld) + for i in range(3): + setSchiff(Feld, 1, belegFeld) -def schiffVersenkt (spielerFeld, belegFeld, treffer): - gr = getFeld (belegFeld, treffer [0], treffer [1]) +def schiffVersenkt(spielerFeld, belegFeld, treffer): + gr = getFeld(belegFeld, treffer[0], treffer[1]) if gr == 1: - for i in range (-1, 2, 2): - if 0 <= treffer [0] + i < matrixgr: - setFeld (spielerFeld, treffer [0]+i, treffer [1], 1) - for i in range (-1, 2, 2): - if 0 <= treffer [1] + i < matrixgr: - setFeld (spielerFeld, treffer [0], treffer [1]+i, 1) + for i in range(-1, 2, 2): + if 0 <= treffer[0] + i < matrixgr: + setFeld(spielerFeld, treffer[0] + i, treffer[1], 1) + for i in range(-1, 2, 2): + if 0 <= treffer[1] + i < matrixgr: + setFeld(spielerFeld, treffer[0], treffer[1] + i, 1) return True schiff = [treffer] - for i in range (-1, 2, 2): - if 0 <= treffer [0] + i < matrixgr: - if getFeld(belegFeld, treffer [0] + i, treffer [1]) == gr: + for i in range(-1, 2, 2): + if 0 <= treffer[0] + i < matrixgr: + if getFeld(belegFeld, treffer[0] + i, treffer[1]) == gr: e = 1 - while 0<= treffer [0] + e*i < matrixgr and getFeld (belegFeld, treffer [0] + e*i, treffer [1]) == gr: - schiff += [[treffer[0]+e*i, treffer [1]]] + while 0 <= treffer[0]+e*i= wurf: - while getFeld(spielerFeld, feld [0], feld [1]) != 2: - feld = [random.randint (0, matrixgr-1), random.randint (0, matrixgr-1)] + while getFeld(spielerFeld, feld[0], feld[1]) != 2: + feld = [random.randint(0, matrixgr - 1), + random.randint(0, matrixgr - 1)] treffer = True else: - while getFeld(spielerFeld, feld [0], feld [1]) != 0: - feld = [random.randint (0, matrixgr-1), random.randint (0, matrixgr-1)] + while getFeld(spielerFeld, feld[0], feld[1]) != 0: + feld = [random.randint(0, matrixgr - 1), + random.randint(0, matrixgr - 1)] - setFeld (spielerFeld, feld[0], feld[1], 5) + setFeld(spielerFeld, feld[0], feld[1], 5) printFelder() if treffer: - if not zweicheck (spielerFeld): - print ("Schade! Der Bot hat gewonnen!") + if not zweicheck(spielerFeld): + print("Schade! Der Bot hat gewonnen!") return 0 - if schiffVersenkt (spielerFeld, belegSpFeld, feld): - print ("\n\n\n") - printFelder () - print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","Der Bot hat getroffen! Er darf noch ein Feld wählen!") - time.sleep (1) - botwahl (spielerFeld, belegSpFeld, diff/10.25) + if schiffVersenkt(spielerFeld, belegSpFeld, feld): + print("\n\n\n") + printFelder() + print("[" + chr(feld[0] + 65) + str(feld[1] + 1) + "]", + "Der Bot hat getroffen! Er darf noch ein Feld wählen!") + time.sleep(1) + botwahl(spielerFeld, belegSpFeld, diff / 10.25) else: - print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","Der Bot hat nicht getroffen! Du bist nun dran!") + print("[" + chr(feld[0] + 65) + str(feld[1] + 1) + "]", + "Der Bot hat nicht getroffen! Du bist nun dran!") - - - -def start (): - startzeit = time.time () - level = SchwierigkeitsWahl () - Initialisiere () - printFelder () +def start(): + startzeit = time.time() + level = SchwierigkeitsWahl() + Initialisiere() + printFelder() while True: - feldWahl (gegnerFeld, belegGegFeld) - if not zweicheck (gegnerFeld): + feldWahl(gegnerFeld, belegGegFeld) + if not zweicheck(gegnerFeld): break - time.sleep (1) - botwahl (eigenFeld, belegEigFeld, level) - if not zweicheck (eigenFeld): + time.sleep(1) + botwahl(eigenFeld, belegEigFeld, level) + if not zweicheck(eigenFeld): break - print ("Das Spiel hat", int((time.time()-startzeit)//60), "Minuten", int(((time.time()-startzeit)%60)//1), "Sekunden gedauert.") - w = str (input ("Noch eine Runde? [J: Ja/Irgendwas: Nein] ")) + print("Das Spiel hat", int((time.time() - startzeit) // 60), "Minuten", + int(((time.time() - startzeit) % 60) // 1), "Sekunden gedauert.") + w = str(input("Noch eine Runde? [J: Ja/Irgendwas: Nein] ")) if w.lower() == 'j': - start () + start() + + +start()