This commit is contained in:
2023-08-07 23:10:34 +02:00
parent ed562ad1ea
commit 70d9f2aab3

View File

@ -2,8 +2,12 @@ import random, time
matrixgr = 7 # Größe des Spielfeldes (7x7) matrixgr = 7 # Größe des Spielfeldes (7x7)
def makeFeld(): 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 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
@ -12,7 +16,10 @@ def makeFeld ():
def printFelder(): def printFelder():
# Von Feld1 werden nur die abgeschossenen Felder gezeigt, von Feld2 alle. # 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: for i in output:
i += [" 1 2 3 4 5 6 7 "] i += [" 1 2 3 4 5 6 7 "]
@ -26,17 +33,20 @@ def printFelder():
if n == [0]: if n == [0]:
if f == 1: # Zeige ALLE Felder an if f == 1: # Zeige ALLE Felder an
zeile += ' [ ] ' # Feld ist leer zeile += ' [ ] ' # Feld ist leer
elif f==0: # Zeige NUR TREFFER an, ~ um vom eigenen Feld zu differenzieren elif f == 0:
zeile += ' [ ~ ] ' zeile += ' [ ~ ] '
# Zeige NUR TREFFER an, ~ um vom eigenen Feld zu differenzieren
elif n == [1]: elif n == [1]:
zeile += ' [ . ] ' # Feld wurde abgeschossen zeile += ' [ . ] ' # Feld wurde abgeschossen
elif n == [2]: elif n == [2]:
if f == 1: # Zeige ALLE Felder an if f == 1: # Zeige ALLE Felder an
zeile+=' [ ■ ] ' # Auf dem Feld ist ein ungetroffenes Schiff zeile += ' [ ■ ] '
# Auf dem Feld ist ein ungetroffenes Schiff
elif f == 0: # Zeige NUR TREFFER an elif f == 0: # Zeige NUR TREFFER an
zeile += ' [ ~ ] ' zeile += ' [ ~ ] '
elif n == [3]: elif n == [3]:
zeile+=' [ X ] ' # Das Schiff auf dem Feld wurde getroffen zeile += ' [ X ] '
# Das Schiff auf dem Feld wurde getroffen
if ord(NZeile.lower()) - 97 < matrixgr: if ord(NZeile.lower()) - 97 < matrixgr:
output[f] += [NZeile + ' ' + zeile] output[f] += [NZeile + ' ' + zeile]
@ -50,10 +60,9 @@ def printFelder():
def setFeld(spielerFeld, zeile, spalte, wert): 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 wert = getFeld(spielerFeld, zeile,
spalte) + 1 # Um den Wert im Feld um eins zu erhöhen
spielerFeld[zeile][spalte][0] = wert spielerFeld[zeile][spalte][0] = wert
@ -81,7 +90,10 @@ def zweicheck (spielerFeld):
def checkUmfeld(spielerFeld, zeile, spalte): 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 if getFeld(spielerFeld, zeile,
spalte) == 2:
# Wenn auf dem Feld schon ein Schiff ist, kann der Check
# direkt abgebrochen werden
return False return False
summe = 0 summe = 0
if matrixgr > zeile >= 0 and matrixgr > spalte >= 0: if matrixgr > zeile >= 0 and matrixgr > spalte >= 0:
@ -120,33 +132,49 @@ def setSchiff (spielerFeld, groesse, belegFeld):
versuch = 0 versuch = 0
while summeFeld(spielerFeld) != feldsumme + groesse * 2: while summeFeld(spielerFeld) != feldsumme + groesse * 2:
if versuch < 25: if versuch < 25:
spitze = [random.randint(0, matrixgr-1), random.randint(0, matrixgr-1)] spitze = [random.randint(0, matrixgr - 1),
if checkUmfeld(spielerFeld, spitze[0], spitze[1]): #spitze[0] ZEILE, spitze[1] SPALTE random.randint(0, matrixgr - 1)]
if checkUmfeld(spielerFeld, spitze[0], spitze[1]):
# spitze[0] ZEILE, spitze[1] SPALTE
if groesse == 1: if groesse == 1:
setFeld(spielerFeld, spitze[0], spitze[1], 2) 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(belegFeld, spitze[0], spitze[1], 1)
# Damit später abgerufen werden kann,
# wie groß das Schiff auf dem Feld ist.
else: else:
reihe = [] reihe = []
counter = 0 counter = 0
#Jetzt wird entschieden, ob das Schiff vertikal oder horizontal ausgerichtet sein soll. # Jetzt wird entschieden, ob das Schiff vertikal oder
orientierung = random.randint (0,1) #0: horizontal, 1: vertikal # horizontal ausgerichtet sein soll.
orientierung = random.randint(0, 1)
# 0: horizontal, 1: vertikal
if orientierung == 0: if orientierung == 0:
orig = spitze[1] orig = spitze[1]
spitze[1] = counter spitze[1] = counter
counterind = 1 #damit der Counter noch bearbeitet werden kann counterind = 1
# damit der Counter noch bearbeitet werden kann
else: else:
orig = spitze[0] orig = spitze[0]
spitze[0] = counter spitze[0] = counter
counterind = 0 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]): if checkUmfeld(spielerFeld, spitze[0], spitze[1]):
reihe += [spitze[counterind]] reihe += [spitze[counterind]]
else: else:
reihe = [] reihe = []
summe = 0 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(
for i in range (len(reihe)-1, len(reihe)-groesse-1,-1): #mindestens so lang ist wie das Schiff sein soll, kann weitergemacht werden. 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 orientierung == 0:
if checkUmfeld(spielerFeld, spitze[0], i): if checkUmfeld(spielerFeld, spitze[0], i):
summe += 1 summe += 1
@ -154,13 +182,17 @@ def setSchiff (spielerFeld, groesse, belegFeld):
if checkUmfeld(spielerFeld, i, spitze[1]): if checkUmfeld(spielerFeld, i, spitze[1]):
summe += 1 summe += 1
if summe == groesse: 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: if orientierung == 0:
setFeld(spielerFeld, spitze[0], i, 2) 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(belegFeld, spitze[0], i,
groesse)
# Damit später abgerufen werden kann, wie groß das Schiff auf dem Feld ist
else: else:
setFeld(spielerFeld, i, spitze[1], 2) 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(belegFeld, i, spitze[1],
groesse)
if summe != groesse: if summe != groesse:
spitze[counterind] += 1 spitze[counterind] += 1
@ -206,7 +238,11 @@ def schiffVersenkt (spielerFeld, belegFeld, treffer):
if 0 <= treffer[0] + i < matrixgr: if 0 <= treffer[0] + i < matrixgr:
if getFeld(belegFeld, treffer[0] + i, treffer[1]) == gr: if getFeld(belegFeld, treffer[0] + i, treffer[1]) == gr:
e = 1 e = 1
while 0<= treffer [0] + e*i < matrixgr and getFeld (belegFeld, treffer [0] + e*i, treffer [1]) == gr: while 0 <= treffer[0]+e*i<matrixgr and getFeld(belegFeld,
treffer[
0]+e*i,
treffer[
1])==gr:
schiff += [[treffer[0] + e * i, treffer[1]]] schiff += [[treffer[0] + e * i, treffer[1]]]
e += 1 e += 1
@ -214,7 +250,10 @@ def schiffVersenkt (spielerFeld, belegFeld, treffer):
if 0 <= treffer[1] + i < matrixgr: if 0 <= treffer[1] + i < matrixgr:
if getFeld(belegFeld, treffer[0], treffer[1] + i) == gr: if getFeld(belegFeld, treffer[0], treffer[1] + i) == gr:
e = 1 e = 1
while 0<= treffer [1] + e*i < matrixgr and getFeld (belegFeld, treffer [0], treffer [1] + e*i) == gr: while 0 <= treffer[1]+e*i<matrixgr and getFeld(belegFeld,
treffer[0],
treffer[
1]+e*i)==gr:
schiff += [[treffer[0], treffer[1] + e * i]] schiff += [[treffer[0], treffer[1] + e * i]]
e += 1 e += 1
@ -236,35 +275,39 @@ def schiffVersenkt (spielerFeld, belegFeld, treffer):
return True return True
def feldWahl(spielerFeld, belegSpFeld): def feldWahl(spielerFeld, belegSpFeld):
feld = str(input("Wähle das Feld, das abgeschossen werden soll! ")) 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()): 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]") print(
"Fehlerhafte Eingabe! \n Ein Feld wird beispielsweise "
"folgendermaßen angegeben:\n A1 [Enter]")
feldWahl(spielerFeld, belegSpFeld) feldWahl(spielerFeld, belegSpFeld)
return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert weiterläuft return 0 # Rückgabe, damit die Funktion nicht
# mit falschem Wert weiterläuft
feld = [ord(feld[0].lower()) - 97, int(feld[
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') 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): if not (0 <= feld[0] <= matrixgr - 1 and 0 <= feld[1] <= matrixgr - 1):
print("Dieses Feld existiert nicht! Bitte ein anderes wählen!") print("Dieses Feld existiert nicht! Bitte ein anderes wählen!")
feldWahl(spielerFeld) feldWahl(spielerFeld)
return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert weiterläuft return 0 # Rückgabe, damit die Funktion nicht
# mit falschem Wert weiterläuft
wert = getFeld(spielerFeld, feld[0], feld[1]) wert = getFeld(spielerFeld, feld[0], feld[1])
if wert == 1 or wert == 3: if wert == 1 or wert == 3:
print("Dieses Feld wurde schon abgeschossen! Bitte ein anderes wählen!") print("Dieses Feld wurde schon abgeschossen! Bitte ein anderes wählen!")
feldWahl(spielerFeld, belegSpFeld) feldWahl(spielerFeld, belegSpFeld)
return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert weiterläuft return 0 # Rückgabe, damit die Funktion nicht mit falschem Wert
# weiterläuft
setFeld(spielerFeld, feld[0], feld[1], 5) # Treffer wird eingetragen setFeld(spielerFeld, feld[0], feld[1], 5) # Treffer wird eingetragen
printFelder() printFelder()
if wert + 1 == 3: if wert + 1 == 3:
if not zweicheck(spielerFeld): if not zweicheck(spielerFeld):
print("GRATULATION! Du hast gewonnen!!!") print("GRATULATION! Du hast gewonnen!!!")
@ -274,10 +317,13 @@ def feldWahl (spielerFeld, belegSpFeld):
print("\n\n\n") print("\n\n\n")
printFelder() printFelder()
vers = "Das ganze Schiffe wurde versenkt!" 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!") print("[" + chr(feld[0] + 65) + str(feld[1] + 1) + "]", "TREFFER!",
vers, "\nEs darf direkt ein neues Feld gewählt werden!")
feldWahl(spielerFeld, belegSpFeld) feldWahl(spielerFeld, belegSpFeld)
else: else:
print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","Leider kein Treffer! Der Bot zieht nun...") print("[" + chr(feld[0] + 65) + str(feld[1] + 1) + "]",
"Leider kein Treffer! Der Bot zieht nun...")
def Initialisiere(): # Erstellt die beiden Felder def Initialisiere(): # Erstellt die beiden Felder
global gegnerFeld, eigenFeld, belegEigFeld, belegGegFeld global gegnerFeld, eigenFeld, belegEigFeld, belegGegFeld
@ -300,13 +346,16 @@ def Initialisiere (): # Erstellt die beiden Felder
fuellFeld(eigenFeld, belegEigFeld) fuellFeld(eigenFeld, belegEigFeld)
eigenFeld += ['Eigenes Feld:'] eigenFeld += ['Eigenes Feld:']
printFelder() printFelder()
eing = str(input("Ist dieses Feld akzeptabel? [J: Ja / Irgendwas: Nein, Neues!] ")) eing = str(input(
"Ist dieses Feld akzeptabel? [J: Ja / Irgendwas: Nein, Neues!] "))
print("\n\n\n") print("\n\n\n")
def SchwierigkeitsWahl(): def SchwierigkeitsWahl():
try: try:
diff = float(input("Bitte wähle die Schwierigkeit von 0-sehr einfach bis 10-sehr schwer! [0-10] ")) diff = float(input(
"Bitte wähle die Schwierigkeit von 0-sehr einfach bis "
"10-sehr schwer! [0-10] "))
except: except:
print("Keine valide Eingabe!") print("Keine valide Eingabe!")
SchwierigkeitsWahl() SchwierigkeitsWahl()
@ -326,11 +375,13 @@ def botwahl (spielerFeld, belegSpFeld, diff):
treffer = False treffer = False
if diff >= wurf: if diff >= wurf:
while getFeld(spielerFeld, feld[0], feld[1]) != 2: while getFeld(spielerFeld, feld[0], feld[1]) != 2:
feld = [random.randint (0, matrixgr-1), random.randint (0, matrixgr-1)] feld = [random.randint(0, matrixgr - 1),
random.randint(0, matrixgr - 1)]
treffer = True treffer = True
else: else:
while getFeld(spielerFeld, feld[0], feld[1]) != 0: while getFeld(spielerFeld, feld[0], feld[1]) != 0:
feld = [random.randint (0, matrixgr-1), random.randint (0, matrixgr-1)] 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() printFelder()
@ -341,14 +392,13 @@ def botwahl (spielerFeld, belegSpFeld, diff):
if schiffVersenkt(spielerFeld, belegSpFeld, feld): if schiffVersenkt(spielerFeld, belegSpFeld, feld):
print("\n\n\n") print("\n\n\n")
printFelder() printFelder()
print ("["+chr(feld[0]+65)+str(feld[1]+1)+"]","Der Bot hat getroffen! Er darf noch ein Feld wählen!") print("[" + chr(feld[0] + 65) + str(feld[1] + 1) + "]",
"Der Bot hat getroffen! Er darf noch ein Feld wählen!")
time.sleep(1) time.sleep(1)
botwahl(spielerFeld, belegSpFeld, diff / 10.25) botwahl(spielerFeld, belegSpFeld, diff / 10.25)
else: 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(): def start():
@ -365,7 +415,11 @@ def start ():
if not zweicheck(eigenFeld): if not zweicheck(eigenFeld):
break break
print ("Das Spiel hat", int((time.time()-startzeit)//60), "Minuten", int(((time.time()-startzeit)%60)//1), "Sekunden gedauert.") 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] ")) w = str(input("Noch eine Runde? [J: Ja/Irgendwas: Nein] "))
if w.lower() == 'j': if w.lower() == 'j':
start() start()
start()