Я пытался выучить Python и вернуться к кодированию через многие годы, поэтому я попытался сделать очень простую игру в линку в терминале. У меня было много препятствий, через которые я проработал, но я стал озадаченным на своих функциях Generate_ (n) Ship (). Я попытался написать код так, чтобы я начал функцию с сохранением, который взял текущее состояние доски, так что позже, если функция решила попытаться поместить корабль на другое пространство, в котором он уже имел, он мог сдаться, сбросить в сохранение и попытаться попробовать еще раз, пока он не выберет и не поместит (n) пустые пространства. < /P>
.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][inty] == "O":
board[x][inty] = "5"
else:
board = savestate.copy()
return generate_5ship(board)
else:
for i in range(5):
intx = sum(pos[0])
if board[intx][y] == "O":
board[intx][y] = "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][inty] == "O":
board[x][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] == "O":
board[intx][y] = "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][inty] == "O":
board[x][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>
Это функция, которую я использовал для отладки. То, что я надеялся, это спасение текущего состояния доски, затем выбрать координату «семян», построить корабль (в данном случае 4 длиной), проверив строку «O», а затем заменив его «X», чтобы указать корабль, а затем вычитать с соответствующей стороны Tuple, основанного на его решении, чтобы указать по вертикально или горизонтально. Я заменил x их соответствующими длины, опять же для целей отладки. Когда функция начинает столкнуться с ранее существовавшим кораблем на доске, я ожидаю, что оператор ELSE заменит значение недавно измененной платы обратно на его SaveState, а затем попробуйте еще раз. Вместо этого он помещает столько, сколько может, останавливается, когда понимает, что не может, полностью пропускает оператор Else и просто возвращается к началу функции. Если вам интересно, почему я взял сумму для Intx или Inty, я по какой -то причине не смог выяснить, как получить единственный элемент в списке и сохранить его как целое число. Взятие суммы списка было первым, что сработало. < /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)
Подробнее здесь: https://stackoverflow.com/questions/795 ... whatsoever
Вернувшись к Savestate, кажется, не работает вообще ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение empy saveState в модели просмотра при использовании koin с компоновкой
Anonymous » » в форуме Android - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-