Я пытаюсь сделать свою собственную версию игры Battleships (на немецком языке: Schiffe versenken).
Я сделал игровое поле как dataframe
(10x10).Координаты кораблей создаются случайным образом.У меня есть 4 разных типа кораблей (начиная с длины от 5 до 2).Каждый из этих кораблей представляет собой список.Элементы списка состоят из случайно созданных начальных координат (ship_row, ship_col), и в зависимости от того, является ли корабль горизонтальным или вертикальным, другие элементы имеют либо ship_row+n
, либо ship_col+n
.
Проблема:Может случиться так, что длина корабля превысит борт dataframe
.Как я могу установить границы для этих списков кораблей и как я могу сделать петлю, чтобы создать новый список кораблей, если первый созданный превышает границы?
Вот мой код для примера корабля Schlachtschiff:
board=[]
for n in range (10):
board.append(['O']*10)
board = pd.DataFrame(board)
g= rd.randint(1,2)
random_row(board)
random_col(board)
ship_row = random_row(board)
ship_col = random_col(board)
for Schlachtschiff in board:
if g==1:
Schlachtschiff = [(ship_row, ship_col),(ship_row, ship_col+1),(ship_row, ship_col+2),(ship_row, ship_col+3),(ship_row, ship_col+4)]
else:
Schlachtschiff= [(ship_row, ship_col),(ship_row+1, ship_col),(ship_row+2, ship_col),(ship_row+3, ship_col),(ship_row+4, ship_col)]
Я пытался решить это с помощью цикла while, просматривая последний элемент созданного списка, но это не остановило бы:
while Schlachtschiff[-1] not in board:
if g==1:
Schlachtschiff = [(ship_row, ship_col),(ship_row, ship_col+1),(ship_row, ship_col+2),(ship_row, ship_col+3),(ship_row, ship_col+4)]
else:
Schlachtschiff= [(ship_row, ship_col),(ship_row+1, ship_col),(ship_row+2, ship_col),(ship_row+3, ship_col),(ship_row+4, ship_col)]
if Schlachtschiff[-1] in board:
break
Чтобы остановить перекрытие кораблей, я написалэтот код (Примечание: «Kreuzer - это второй тип корабля, созданный так же, как описано выше):
for i in Schlachtschiff:
for j in Kreuzer:
if i == j:
random_row(board)
random_col(board)
ship_row_1 = random_row(board)
ship_col_1 = random_col(board)
g= rd.randint(1,2)
if g==1:
Kreuzer = [(ship_row, ship_col),(ship_row, ship_col+1),(ship_row, ship_col+2)]
else:
Kreuzer = [(ship_row, ship_col),(ship_row+1, ship_col),(ship_row+2, ship_col)]
Теперь у меня больше нет этой проблемы благодаря помощи @smci. Мой код выглядит таксейчас:
board = []
board = pd.DataFrame(data='□', index=range(1,10+1), columns=list('ABCDEFGHIJ'))
print(board)
def random_row(board):
return rd.randint(0,len(board)-1)
def random_col(board):
return rd.randint(0,len(board)-1)
def Schiff_erstellen(Schiff,Start,Stop):
g= rd.randint(1,2)
random_row(board)
random_col(board)
ship_row = random_row(board)
ship_col = random_col(board)
Schiff=[(ship_row, ship_col)]
while Schiff[-1] > (ship_row_probe, ship_col_probe):
g= rd.randint(1,2)
random_row(board)
random_col(board)
ship_row = random_row(board)
ship_col = random_col(board)
Schiff=[(ship_row, ship_col)]
if g == 1:
for i in range(Start,Stop):
Schiff.append((ship_row, ship_col+i))
else:
for i in range(Start,Stop):
Schiff.append((ship_row+i, ship_col))
if Schiff[-1] <= (ship_row_probe, ship_col_probe):
break
return Schiff