Grid-структура данных и алгоритм размещения для реализации моих линкоров? - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь сделать свою собственную версию игры 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...