2016-03-10 100 views
0

我正在做一个关于游戏战舰的项目,其中一个功能让我难堪。功能的说明是:在什么情况下我的功能可能无法按预期工作?

第一个参数是一个方势船队网格,所述第二和 第三参数是含有 船的顶部/左上角的单元格的行和列索引,第四参数是代表一艘船的字符 ,第五个参数是船的尺寸。 如果船在正确的尺寸 完全连续或完全位于给定的起始 单元格的列中,则此函数返回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)

  • 对于垂直船舶,将所有船舶从船舶启动行的ship_size行添加到列表中。然后在该列表中,将每行索引列中的字符追加到另一个列表中(3)

  • 然后我将列表(1)与列表(2)和列表(3)进行比较。该功能将只返回真,如果:

  • 列表2或项目list3匹配列表1并有由ship_size指定

我已经折磨我这么多的情况下大脑的相同数量的该网格的字符他们都按预期工作。我没有看到我的函数几乎没有通过检查器,所以任何建议将不胜感激。

我也直觉地感觉到,有一种更简单的方法可以做到这一点,我也尝试过想办法做到这一点,但却做不到。也许我现在的方法太困扰了。任何指向可能更简单的解决方案的指针都会很棒。

回答

0

1)是不是允许的numpy?因为你有垂直切片,所以你不需要在这种情况下调整列的大小。

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 
相关问题