diff --git a/schiffe-versenken.py b/schiffe-versenken.py index 403bebc..9a83b82 100644 --- a/schiffe-versenken.py +++ b/schiffe-versenken.py @@ -4,14 +4,16 @@ 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 - return feld + return feld +# RAUS : +# noinspection PyTypeChecker 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 - + for i in output: i+= [" 1 2 3 4 5 6 7 "] @@ -27,7 +29,7 @@ def printFelder(): elif f==0: # Zeige NUR TREFFER an, ~ um vom eigenen Feld zu differenzieren zeile+=' [ ~ ] ' elif n== [1]: - zeile+=' [ . ] ' # Feld wurde abgeschossen + zeile+=' [ . ] ' # Feld wurde abgeschossen elif n==[2]: if f == 1: # Zeige ALLE Felder an zeile+=' [ ■ ] ' # Auf dem Feld ist ein ungetroffenes Schiff @@ -35,14 +37,14 @@ def printFelder(): zeile+=' [ ~ ] ' elif n==[3]: zeile+=' [ X ] ' # Das Schiff auf dem Feld wurde getroffen - + if ord(NZeile.lower())-97 < matrixgr: output [f] += [NZeile + ' ' + zeile] else: output [f] += [' ' + zeile] NZeile = chr(ord(NZeile)+1) - - for i in range (0,len(output[0])): + + for i in range (0, len(output[0])): print (output [0][i], ' ' + output [1][i]) print ("") @@ -50,62 +52,63 @@ def printFelder(): 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 - if wert == 5: + if wert == 5: 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 + #zeile = ord(zeile.lower())-97 #return spielerFeld [zeile][spalte-1][0] return spielerFeld [zeile][spalte][0] + def summeFeld (spielerFeld): summe = 0 - for i in spielerFeld: + for i in spielerFeld: for e in i: for n in e: summe += n return summe -def zweicheck (spielerFeld): - for i in spielerFeld: +def zweicheck (spielerFeld): + for i in spielerFeld: for e in i: for n in e: if n == 2: 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 return False summe = 0 - if zeile < matrixgr and spalte = 0 and spalte >= 0: + if matrixgr > zeile >= 0 and matrixgr > spalte >= 0: if zeile+1 < matrixgr: if getFeld (spielerFeld, zeile+1, spalte) != 2: summe += 1 else: summe+= 1 - if spalte+1 < matrixgr: + if spalte+1 < matrixgr: if getFeld (spielerFeld, zeile, spalte+1) !=2: summe += 1 - else: + else: summe+= 1 - + if zeile-1 >= 0: if getFeld (spielerFeld, zeile-1, spalte) !=2: summe += 1 else: summe+= 1 - + if spalte-1 >= 0: if getFeld (spielerFeld, zeile, spalte-1) !=2: summe += 1 else: - summe+= 1 - + summe+= 1 + if summe < 4: return False else: @@ -129,20 +132,20 @@ def setSchiff (spielerFeld, groesse, belegFeld): 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 + spitze [1] = counter + counterind = 1 #damit der Counter noch bearbeitet werden kann else: orig = spitze [0] - spitze [0] = counter + spitze [0] = counter counterind = 0 - + 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]): + 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 + 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 orientierung == 0: if checkUmfeld (spielerFeld, spitze[0], i): @@ -162,27 +165,27 @@ def setSchiff (spielerFeld, groesse, belegFeld): if summe != groesse: spitze [counterind] += 1 versuch += 1 - else: + else: spielerFeld = makeFeld () versuch = 0 - + if summeFeld(spielerFeld) != feldsumme + groesse*2 : spielerFeld = makeFeld () setSchiff (spielerFeld, groesse) - + def fuellFeld (Feld, belegFeld): for i in range (1): - setSchiff (Feld, 4, belegFeld) + setSchiff (Feld, 4, belegFeld) for i in range (2): - setSchiff (Feld, 3, belegFeld) + setSchiff (Feld, 3, belegFeld) for i in range (2): - setSchiff (Feld, 2, belegFeld) + setSchiff (Feld, 2, belegFeld) for i in range (3): - setSchiff (Feld, 1, belegFeld) + setSchiff (Feld, 1, belegFeld) def schiffVersenkt (spielerFeld, belegFeld, treffer): @@ -206,7 +209,7 @@ def schiffVersenkt (spielerFeld, belegFeld, treffer): while 0<= treffer [0] + e*i < matrixgr and getFeld (belegFeld, treffer [0] + e*i, treffer [1]) == gr: schiff += [[treffer[0]+e*i, treffer [1]]] e += 1 - + for i in range (-1, 2, 2): if 0 <= treffer [1] + i < matrixgr: if getFeld(belegFeld, treffer [0], treffer [1] + i) == gr: @@ -218,21 +221,21 @@ def schiffVersenkt (spielerFeld, belegFeld, treffer): for i in schiff: if getFeld (spielerFeld, i[0], i[1]) == 2: return False - + for i in schiff: for e in range (-1,2,2): if 0 <= i[0] + e < matrixgr: if getFeld (spielerFeld, i[0]+e, i[1]) != 3: setFeld (spielerFeld, i[0]+e, i[1], 1) - + for e in range (-1,2,2): if 0 <= i[1] + e < matrixgr: if getFeld (spielerFeld, i[0], i[1]+e) != 3: setFeld (spielerFeld, i[0], i[1]+e, 1) - + return True - + def feldWahl (spielerFeld, belegSpFeld): @@ -242,10 +245,10 @@ def feldWahl (spielerFeld, belegSpFeld): print ("Fehlerhafte Eingabe! \n Ein Feld wird beispielsweise folgendermaßen angegeben:\n A1 [Enter]") feldWahl (spielerFeld, belegSpFeld) return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert weiterläuft - + feld = [ord(feld[0].lower())-97, int(feld[1])-1] # Weil die Zeilen traditionell nach Buchstaben benannt werden, muss erst der Buchstabe in seinen ASCII-Wert umgewandelt werden und dann um 97 verringert (ASCII 97 = 'a') - + if not (0 <= feld [0] <= matrixgr-1 and 0 <= feld [1] <= matrixgr-1): print ("Dieses Feld existiert nicht! Bitte ein anderes wählen!") feldWahl (spielerFeld) @@ -257,11 +260,11 @@ def feldWahl (spielerFeld, belegSpFeld): print ("Dieses Feld wurde schon abgeschossen! Bitte ein anderes wählen!") feldWahl (spielerFeld, belegSpFeld) return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert weiterläuft - + setFeld (spielerFeld, feld[0],feld[1], 5) # Treffer wird eingetragen printFelder() - + if wert+1 == 3: if not zweicheck (spielerFeld): print ("GRATULATION! Du hast gewonnen!!!") @@ -282,7 +285,7 @@ def Initialisiere (): # Erstellt die beiden Felder belegGegFeld = makeFeld () fuellFeld (gegnerFeld, belegGegFeld) while summeFeld (gegnerFeld) != 34: - gegnerFeld= makeFeld () + gegnerFeld= makeFeld () fuellFeld (gegnerFeld, belegGegFeld) gegnerFeld += ['Gegnerisches Feld:'] print ("Das gegnerische Feld wurde generiert!") @@ -293,7 +296,7 @@ def Initialisiere (): # Erstellt die beiden Felder fuellFeld (eigenFeld, belegEigFeld) while summeFeld (eigenFeld) != 34: belegEigFeld = makeFeld () - eigenFeld= makeFeld () + eigenFeld= makeFeld () fuellFeld (eigenFeld, belegEigFeld) eigenFeld += ['Eigenes Feld:'] printFelder() @@ -312,7 +315,7 @@ def SchwierigkeitsWahl (): print ("Der Schwierigkeitsgrad muss zwischen 0 und 10 sein!") SchwierigkeitsWahl () return 0 - + return diff @@ -328,7 +331,7 @@ def botwahl (spielerFeld, belegSpFeld, diff): else: 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) printFelder() if treffer: @@ -345,7 +348,7 @@ def botwahl (spielerFeld, belegSpFeld, diff): print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","Der Bot hat nicht getroffen! Du bist nun dran!") - + def start (): @@ -361,10 +364,8 @@ def start (): 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] ")) if w.lower() == 'j': start () - -start () \ No newline at end of file