Rückkehr zum Savestate scheint überhaupt nicht zu funktionierenPython

Python-Programme
Anonymous
 Rückkehr zum Savestate scheint überhaupt nicht zu funktionieren

Post by Anonymous »

Ich habe versucht, Python zu lernen und nach vielen Jahren wieder in die Codierung zu kommen, also habe ich im Terminal ein sehr einfaches Schlachtschiff -Spiel versucht. Ich habe viele Straßensperren gehabt, die ich durcharbeitet habe, aber ich habe mich über meine Funktionen generate_ (n) Ship () verblüfft. Ich versuchte, den Code so zu schreiben, dass ich die Funktion mit einem Savestate begann, der den aktuellen Stand des Boards übernahm, so dass die Funktion später, wenn die Funktion beschloss, ein Schiff auf einen anderen Raum zu platzieren, der bereits einen hatte, aufgeben, auf den Savestate zurückgesetzt und es erneut versuchen konnte, bis er (n) leere Leerzeichen aufgenommen und platziert wurde. < /P>

Code: Select all

import random

board = []
pboard = []

row = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
col = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

def print_board(board, prnt):
for x in range(10):
board.append(["O"] * 10)
if prnt == True:
print("  ".join(board[x]))

def print_pboard(pboard):
for x in range(10):
pboard.append(["O"] * 10)
print("  ".join(pboard[x]))

print_board(board, False)
print_pboard(pboard)
print("Welcome to Battleship!")

def get_coords():
coord = str(input("Enter coordinates (e.g., A1): ").upper())
if len(coord) == 3:
if coord[2] == "0":
return row.index(coord[0]), 9
if len(coord) != 2:
print("Invalid input. Please enter a letter followed by a number (e.g., A1).")
return get_coords()
if coord[0] not in row or not coord[1].isdigit() or int(coord[1]) < 1 or int(coord[1]) > 10:
print("Invalid coordinates.  Please try again.")
return get_coords()
return row.index(coord[0]), int(coord[1]) - 1

def generate_5ship(board):
orientation = random.choice(["horizontal", "vertical"])
savestate = board.copy()

if orientation == "horizontal":
x = [random.randint(4, 9)]
y = [random.randint(0, 9)]
for i in range(1, 5):
x.append(x[0] - i)

else:
x = [random.randint(0, 9)]
y = [random.randint(4, 9)]
for i in range(1, 5):
y.append(y[0] - i)

pos = x, y

if len(pos[0]) > len(pos[1]):
for i in range(5):
inty = sum(pos[1])
if board[x[i]][inty] == "O":
board[x[i]][inty] = "5"
else:
board = savestate.copy()
return generate_5ship(board)
else:
for i in range(5):
intx = sum(pos[0])
if board[intx][y[i]] == "O":
board[intx][y[i]] = "5"
else:
board = savestate.copy()
return generate_5ship(board)

def generate_4ship(board):
orientation = random.choice(["horizontal", "vertical"])
savestate = board.copy()
print("board")
print_board(board, True)
print("savestate")
print_board(savestate, True)

if orientation == "horizontal":
x = [random.randint(3, 9)]
y = [random.randint(0, 9)]
for i in range(1, 4):
x.append(x[0] - i)

else:
x = [random.randint(0, 9)]
y = [random.randint(4, 9)]
for i in range(1, 4):
y.append(y[0] - i)

pos = x, y

if len(pos[0]) > len(pos[1]):
for i in range(4):
inty = sum(pos[1])
if board[x[i]][inty] == "O":
board[x[i]][inty] = "4"
else:
print("board before reverting")
print_board(board, True)
board = savestate.copy()
print("board after reverting")
print_board(board, True)
return generate_4ship(board)
else:
for i in range(4):
intx = sum(pos[0])
if board[intx][y[i]] == "O":
board[intx][y[i]] = "4"
else:
board = savestate.copy()
return generate_4ship(board)

def generate_3ship(board):
orientation = random.choice(["horizontal", "vertical"])
savestate = board.copy()

if orientation == "horizontal":
x = [random.randint(2, 9)]
y = [random.randint(0, 9)]
for i in range(1, 3):
x.append(x[0] - i)

else:
x = [random.randint(0, 9)]
y = [random.randint(2, 9)]
for i in range(1, 3):
y.append(y[0] - i)

pos = x, y

if len(pos[0]) > len(pos[1]):
for i in range(3):
inty = sum(pos[1])
if board[x[i]][inty] == "O":
board[x[i]][inty] = "3"
else:
board = savestate.copy()
return generate_3ship(board)
else:
for i in range(3):
intx = sum(pos[0])
if board[intx][y[i]] == "O":
board[intx][y[i]] = "3"
else:
board = savestate.copy()
return generate_3ship(board)

def generate_2ship(board):
orientation = random.choice(["horizontal", "vertical"])
savestate = board.copy()

if orientation == "horizontal":
x = [random.randint(1, 9)]
y = [random.randint(0, 9)]
for i in range(1, 2):
x.append(x[0] - i)

else:
x = [random.randint(0, 9)]
y = [random.randint(1, 9)]
for i in range(1, 2):
y.append(y[0] - i)

pos = x, y

if len(pos[0]) >  len(pos[1]):
for i in range(2):
inty = sum(pos[1])
if board[x[i]][inty] == "O":
board[x[i]][inty] = "2"
else:
board = savestate.copy()
return generate_2ship(board)
else:
for i in range(2):
intx = sum(pos[0])
if board[intx][y[i]] == "O":
board[intx][y[i]] = "2"
else:
board = savestate.copy()
return generate_2ship(board)

def is_hit(x, y):
if board[x][y] == "X":
print("Hit!")
pboard[x][y] = "X"
board[x][y] = "O"
elif pboard[x][y] == "X":
print("Already hit!")
else:
print("Miss!")
pboard[x][y] = "M"

def fill_board():
generate_5ship(board)
generate_4ship(board)
generate_4ship(board)
generate_3ship(board)
generate_3ship(board)
generate_3ship(board)
generate_2ship(board)
generate_2ship(board)
generate_2ship(board)
generate_2ship(board)

def get_win_condition():
for i in range(10):
for j in range(10):
if board[i][j] == "X":
return False
return True

def get_misses():
misses = 0
for i in range(10):
for j in range(10):
if pboard[i][j] == "M":
misses += 1
return misses

def get_hits_left():
hits = 0
for i in range(10):
for j in range(10):
if board[i][j] == "X":
hits += 1
return hits

fill_board()

while True:
print_board(board, True)
x, y = get_coords()
is_hit(x, y)
print_pboard(pboard)
print("Hits left: " + str(get_hits_left()))
if get_win_condition() == True:
print("You win!")
print("You missed " + str(get_misses()) + " times!")
break
print("Game Over!")
< /code>
Dies ist die Funktion, die ich zum Debuggen verwendet habe. Ich hatte gehofft, dass es tun würde, den aktuellen Zustand der Board zu retten, dann eine "Samen" -Koordinate zu wählen, das Schiff (in diesem Fall 4 lange) zu bauen, indem ich nach der Zeichenfolge "o" prüfe und es dann durch "x" ersetzt, um ein Schiff anzuzeigen, und dann von der entsprechenden Seite des Tupels basierend auf seiner Entscheidung, vertikal oder horizontal oder horizontal oder horizontal oder horizontal oder horizont zu werden, abzuziehen. Ich habe die X durch ihre entsprechenden Längen durch Debugging -Zwecke ersetzt. Wenn die Funktion mit einem bereits vorhandenen Schiff im Vorstand kollidiert, erwarte ich, dass die elsee Erklärung den Wert des neu geänderten Boards wieder in den Savestate ersetzt, und versuchen Sie es erneut. Stattdessen platziert es so viele wie möglich, stoppt, wenn es erkennt, dass es nicht kann, überspringt die else -Anweisung vollständig und kehrt einfach zum Beginn der Funktion zurück. < /P>
p.s. Wenn Sie sich fragen, warum ich die Summe für INTX oder Inty genommen habe, konnte ich aus irgendeinem Grund nicht herausfinden, wie ich das einzige Element in der Liste abrufen und als Ganzzahl speichern kann. Die Summe der Liste zu nehmen war das erste, was funktionierte.  < /P>
def generate_4ship(board):
orientation = random.choice(["horizontal", "vertical"])
savestate = board.copy()
print("board")
print_board(board, True)
print("savestate")
print_board(savestate, True)

if orientation == "horizontal":
x = [random.randint(3, 9)]
y = [random.randint(0, 9)]
for i in range(1, 4):
x.append(x[0] - i)

else:
x = [random.randint(0, 9)]
y = [random.randint(4, 9)]
for i in range(1, 4):
y.append(y[0] - i)

pos = x, y

if len(pos[0]) > len(pos[1]):
for i in range(4):
inty = sum(pos[1])
if board[x[i]][inty] == "O":
board[x[i]][inty] = "4"
else:
print("board before reverting")
print_board(board, True)
board = savestate.copy()
print("board after reverting")
print_board(board, True)
return generate_4ship(board)
else:
for i in range(4):
intx = sum(pos[0])
if board[intx][y[i]] == "O":
board[intx][y[i]] = "4"
else:
board = savestate.copy()
return generate_4ship(board)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post