我在游戏Battleship上做了一个项目,其中一个功能让我很难过。功能描述如下:
第一个参数是方形潜在的舰队网格,第二个参数和 第三个参数是包含的单元格的行和列索引 在船的左上角,第四个参数是一个字符 代表船舶,第五个参数是船舶的大小。 如果船出现的尺寸正确,此函数将返回True 在给定的开始时完全连续或完全在一列中 细胞
我的代码:
def has_ship(fleet_grid, row, column, ship_char, ship_size):
row, column = row - 1, column - 1
ship_char_in_grid = check_specified_character(fleet_grid, ship_char)
ship_list = []
for size in range(ship_size):
ship_list.append(ship_char)
horizontal_row = fleet_grid[row]
horizontal_ship = horizontal_row[column : column + ship_size]
vertical_column = fleet_grid[row: row + ship_size]
vertical_ship = []
for row_of_interest in vertical_column:
vertical_ship.append(row_of_interest[column])
return ship_char_in_grid == ship_size and ship_size \
(vertical_ship == ship_list or horizontal_ship == ship_list)
check_specified_character
查看指定字符出现在整个网格中的次数。
我基本上做的是:
将船舶字符ship_size次数附加到列表(1)
对于水平船舶,隔离指定的行,从起始字符(由列指定)追加到ship_size字符后追加到另一个列表中(2)
对于垂直船舶,将船舶启动的行中的所有ROWS附加到ship_size行到列表中。然后在该列表中,将每行索引列的char附加到另一个列表(3)
然后我将列表(1)与列表(2)和列表(3)进行比较。该函数仅在以下情况下返回True:
list2或list3与list1匹配,并且该网格中的字符数与ship_size
我已经在很多场景中绞尽脑汁,他们都按预期工作了。我不知道我的功能如何几乎没有通过检查器,所以任何建议都将不胜感激。
我也觉得直觉上有一种更简单的方法可以做到这一点,而且我也试图想办法做到这一点,但无法做到。也许我对当前的方法太过困惑了。任何可能更简单的解决方案的指针都会很棒。
答案 0 :(得分:0)
1)不允许小块吗?在这种情况下,您需要进行所有列修改,因为您有垂直切片。
2)你也可以将网格迭代为矩阵,即:
has_ship=True
for i in range(ship_size):
if (grid[row+i][col] != ship_char) and (grid[row][col+i] != ship_char) :
has_ship=False
break