diff --git a/schiffe-versenken.py b/schiffe-versenken.py index 0dced47..ffd5a73 100644 --- a/schiffe-versenken.py +++ b/schiffe-versenken.py @@ -80,30 +80,30 @@ def zweicheck (spielerFeld): def checkUmfeld (spielerFeld, zeile, spalte): - if getFeld (spielerFeld, zeile, spalte) != 0: + 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 zeile+1 < matrixgr: - if getFeld (spielerFeld, zeile+1, spalte) == 0: + if getFeld (spielerFeld, zeile+1, spalte) != 2: summe += 1 else: summe+= 1 if spalte+1 < matrixgr: - if getFeld (spielerFeld, zeile, spalte+1) == 0: + if getFeld (spielerFeld, zeile, spalte+1) !=2: summe += 1 else: summe+= 1 if zeile-1 >= 0: - if getFeld (spielerFeld, zeile-1, spalte) == 0: + if getFeld (spielerFeld, zeile-1, spalte) !=2: summe += 1 else: summe+= 1 if spalte-1 >= 0: - if getFeld (spielerFeld, zeile, spalte-1) == 0: + if getFeld (spielerFeld, zeile, spalte-1) !=2: summe += 1 else: summe+= 1 @@ -114,7 +114,7 @@ def checkUmfeld (spielerFeld, zeile, spalte): return True -def setSchiff (spielerFeld, groesse): +def setSchiff (spielerFeld, groesse, belegFeld): feldsumme = summeFeld(spielerFeld) versuch = 0 while summeFeld(spielerFeld) != feldsumme + groesse*2 : @@ -123,6 +123,7 @@ def setSchiff (spielerFeld, groesse): 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. else: reihe = [] counter = 0 @@ -155,8 +156,11 @@ def setSchiff (spielerFeld, groesse): 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. 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. + if summe != groesse: spitze [counterind] += 1 versuch += 1 @@ -169,26 +173,67 @@ def setSchiff (spielerFeld, groesse): setSchiff (spielerFeld, groesse) -def fuellFeld (Feld): +def fuellFeld (Feld, belegFeld): for i in range (1): - setSchiff (Feld, 4) + setSchiff (Feld, 4, belegFeld) for i in range (2): - setSchiff (Feld, 3) + setSchiff (Feld, 3, belegFeld) for i in range (2): - setSchiff (Feld, 2) + setSchiff (Feld, 2, belegFeld) for i in range (3): - setSchiff (Feld, 1) + setSchiff (Feld, 1, belegFeld) -def feldWahl (spielerFeld): +def schiffVersenkt (spielerFeld, belegFeld, treffer): + gr = getFeld (belegFeld, treffer [0], treffer [1]) + + schiff = [treffer] + + 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 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: + e = 1 + while getFeld (belegFeld, treffer [0], treffer [1] + e*i) == gr: + schiff += [[treffer[0], treffer [1]+e*i]] + e += 1 + + 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): feld = str(input("Wähle das Feld, das abgeschossen werden soll! ")) feld.replace (" ", "") if (len(feld) != 2 ) or (not feld[0].isalpha ()) or (not feld[1].isdigit()): print ("Fehlerhafte Eingabe! \n Ein Feld wird beispielsweise folgendermaßen angegeben:\n A1 [Enter]") - feldWahl (spielerFeld) + feldWahl (spielerFeld, belegSpFeld) return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert weiterläuft @@ -214,28 +259,36 @@ def feldWahl (spielerFeld): if not zweicheck (spielerFeld): print ("GRATULATION! Du hast gewonnen!!!") return 0 - print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","TREFFER!\nEs darf direkt ein neues Feld gewählt werden!") - feldWahl (spielerFeld) + vers = '' + if schiffVersenkt (spielerFeld, belegSpFeld, feld): + print ("\n\n\n") + printFelder() + vers = "Das ganze Schiffe wurde versenkt!" + print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","TREFFER!", vers, "\nEs darf direkt ein neues Feld gewählt werden!") + feldWahl (spielerFeld, belegSpFeld) else: print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","Leider kein Treffer! Der Bot zieht nun...") - def Initialisiere (): # Erstellt die beiden Felder + global gegnerFeld, eigenFeld global gegnerFeld, eigenFeld gegnerFeld= makeFeld () - fuellFeld (gegnerFeld) + belegGegFeld = makeFeld () + fuellFeld (gegnerFeld, belegGegFeld) while summeFeld (gegnerFeld) != 34: gegnerFeld= makeFeld () - fuellFeld (gegnerFeld) + fuellFeld (gegnerFeld, belegGegFeld) gegnerFeld += ['Gegnerisches Feld:'] print ("Das gegnerische Feld wurde generiert!") eing = '' - while eing != ('J' or 'j'): + while eing.lower () != ('j'): eigenFeld = makeFeld () - fuellFeld (eigenFeld) + belegEigFeld = makeFeld () + fuellFeld (eigenFeld, belegEigFeld) while summeFeld (eigenFeld) != 34: + belegEigFeld = makeFeld () eigenFeld= makeFeld () - fuellFeld (eigenFeld) + fuellFeld (eigenFeld, belegEigFeld) eigenFeld += ['Eigenes Feld:'] printFelder() eing = str(input("Ist dieses Feld akzeptabel? [J: Ja / Irgendwas: Nein, Neues!] ")) @@ -257,7 +310,7 @@ def SchwierigkeitsWahl (): return diff -def botwahl (spielerFeld, diff): +def botwahl (spielerFeld, belegSpFeld, diff): diff *= 10 wurf = random.randint (-5, 105) feld = [random.randint (0, matrixgr-1), random.randint (0, matrixgr-1)] @@ -276,6 +329,9 @@ def botwahl (spielerFeld, diff): 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, diff/10.25) @@ -292,11 +348,11 @@ def start (): Initialisiere () printFelder () while True: - feldWahl (gegnerFeld) + feldWahl (gegnerFeld, belegGegFeld) if not zweicheck (gegnerFeld): break time.sleep (1) - botwahl (eigenFeld, level) + botwahl (eigenFeld, belegEigFeld, level) if not zweicheck (eigenFeld): break