Скажем, у меня есть 2D-массив, например:

[
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 1, 0, 2],
    [0, 2, 2, 0, 2],
    [1, 1, 2, 1, 1],
]

И я хочу, чтобы два игрока (игрок 1 представлен 1, а игрок 2 представлен 2) могли размещать фишки вниз по столбцам (например, соединить 4). Как мне найти следующую доступную строку (если есть)?

Я могу разобрать номер столбца

Благодарность!

1
Derp Diamonds 2 Май 2021 в 22:46

3 ответа

Лучший ответ
table = [                                                                           
    [0, 0, 0, 0, 0],                                                                
    [0, 0, 0, 0, 0],                                                                
    [0, 0, 1, 0, 2],                                                                                                                
    [0, 2, 2, 0, 2],                                                                                                                
    [1, 1, 2, 1, 1],                                                                                                                
]                                                                                                                                   
                                                                                                                                    
def move(col, player, table):                                                   
    available_rows = [i for i in range(len(table)) if table[i][col]==0]         
    if available_rows == []:                                                    
        return False # i.e. you can not place on column col. invalid move                     
    target_row = available_rows[-1]  # target_row is the next available move on column col                                           
    table[target_row][col] = player                                             
    return True # i.e. valid move                                                                
                                                                                
print(table)                                                                    
move(0, 2, table)  # player 2 has placed its move on column 0 (zero based index)                                                             
print(table) 

Выход

[[0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0],
 [0, 0, 1, 0, 2], 
 [0, 2, 2, 0, 2],
 [1, 1, 2, 1, 1]
]

[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 1, 0, 2],
 [1, 2, 2, 0, 2],
 [1, 1, 2, 1, 1]]

Вы должны проверить, является ли вывод хода верным или нет, чтобы убедиться, что ход действителен.

1
Aven Desta 2 Май 2021 в 20:12

Вы можете использовать цикл for для просмотра массива и проверки, есть ли в текущей строке какой-либо ноль.

for row in array:
   if row.count(0) > 0:
      # this row has available slots
      # Do something here
      break
else:
   # No free slot at all for all rows
   # Do something here
0
remiliacn 2 Май 2021 в 19:57

Думаю, я нашел решение:

def findNextRow(self, rowNumber):
    for rowIndex in range(len(self._grid), 0, -1):
        if self._grid[rowNumber][rowIndex] == 0:
            return rowIndex-1
    return False

Вы выполняете цикл назад по 2-му массиву. Если номер столбца, который вы проанализировали, и текущая строка равна 0, верните индекс-1 (поскольку индексирование массива python начинается с 0). Если строка не найдена, цикл завершится, ничего не вернув, поэтому вы можете вернуть False.

0
Derp Diamonds 2 Май 2021 в 20:07