有没有办法修复战舰战场验证器列表索引超出范围的错误?

2024-05-20 00:04:51 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,输入是一个10x10战舰场,代码检查战舰的定位是否有效

特别是对于该矩阵:

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

shipsize函数达到“IndexError:list index out-range”(索引器:列表索引超出范围),这对 我

  def validate_battlefield(field):
        ships = {}
        for row in range(len(field[0])):
            for col in range(len(field)):
                if field[row][col] == 1:
                    try:
                        result = Shipsize(row, col, field)
                        ships[result] = ships.get(result, 0) + 1
                    except ValueError:
                        return False
        return ships.get(4, 0) == 1 and ships.get(3, 0) == 2 and ships.get(2, 0) == 3 and ships.get(1, 0) == 4
    
    
    def ValidCorner(row, col, field):
        if row == len(field) - 1:
            return True
        if col == 0:
            return field[row + 1][col + 1] != 1
        if col == len(field[0]) - 1:
            return field[row + 1][col - 1] != 1
        return field[row + 1][col + 1] != 1 and field[row + 1][col - 1] != 1
    
    
    def ValidSide(row, col, field):
        if row == len(field) - 1 or col == len(field[0]) - 1:
            return True
        return not (field[row + 1][col] != 0 and field[row][col + 1] != 0)
    
    
    def ValidPoint(row, col, field):
        return ValidCorner(row, col, field) and ValidSide(row, col, field)
    
    
    def Shipsize(row, col, field):
        if not ValidPoint(row, col, field):
            raise ValueError('Nope')
        field[row][col] = -1
        if row < len(field) and field[row+1][col] == 1:
            return 1 + Shipsize(row + 1, col, field)
        if col < len(field[0]) and field[row][col+1] == 1:
            return 1 + Shipsize(row, col + 1, field)
        return 1