【问题标题】:How can I set the increment on a for loop back by one in python? [duplicate]如何在python中将for循环的增量设置为1? [复制]
【发布时间】:2020-02-22 09:47:29
【问题描述】:

我正在创建一个战舰游戏,并想检查玩家目标位置周围的位置,以检查是否有任何船只位于那里,即

!(https://imgur.com/a/9Dddom0)

在这个板上,程序将检查任何船只的位置 (2,0)、(1,1)、(2,2) 和 (3,1),如果存在任何船只,则子程序将返回 True,并且如果不是,它将返回 False。

这是我当前的代码:

def RadarScan(Board, Ships, R, C):
    around = [[C, R - 1], [C + 1, R], [C, R + 1], [C - 1, R]]
    for i in around:
        for x in range(2):
            if int(i[x]) > 9 or int(i[x]) < 0:
                around.remove(i)
    near = False
    for i in range(len(around)):
        if Board[around[i][0]][around[i][1]] == "-" or "m" or "h":
            continue
        else:
            near = True
            break
    if near == True:
        return True
    else:
        return False

当检查目标周围的位置是否在棋盘上时,我使用一个 for 循环来增加周围的列表,其中包含所有周围的位置,但是假设周围的第二个位置是 (10,9) , for 循环会删除这个位置,因为它不在棋盘上,然后递增到周围的下一个位置,即第三个位置,但是周围只剩下原始位置 1、3 和 4,所以它会跳过检查原来的位置 3,而是直接去原来的位置 4。

(对不起,如果这有点混乱)

所以我的问题是,我可以在 'around.remove(i)' 下添加一些东西,将 for 循环 'for i in around' 的增量向后移动 1 吗?

【问题讨论】:

  • 你为什么要使用第一个嵌套的 for 循环?将元素添加到周围列表时只需检查 9?那么你在列表中只有有效的项目,你不需要进一步关心这个
  • @simirimia ,我该怎么做?
  • 从根本上说,您试图通过“将迭代器移回一个”来解决的问题是在迭代列表时尝试从列表中删除项目。
  • 另外,我不知道你从哪里学会写for i in range(len(...)),但不要那样做,不要再听谁让你这样做。只需直接遍历元素即可。

标签: python list for-loop multidimensional-array increment


【解决方案1】:

修改您正在迭代的项目不起作用。

我不知道你为什么有int(i[x])。您是否希望 RC 不是整数?

Board[][] == "-" or "m" or "h" 始终是 True,因为 "m" or "h" 始终是 True

你的循环最好写成:

for x, y in around:
    if x in range(10) and y in range(10):
        if Board[x][y] not in "-mh":
            return True
return False

【讨论】:

  • 工作如梦!非常感谢您,先生:)
【解决方案2】:

如果我正确理解您的问题,一种方法可能是手动索引:

def RadarScan(Board, Ships, R, C):
    around = [[C, R - 1], [C + 1, R], [C, R + 1], [C - 1, R]]
    index = 0
    for i in range(len(around)):
        index += 1
        for x in range(2):
            if int(around[index][x]) > 9 or int(around[index][x]) < 0:
                around.remove(around[index])
                index -= 1

    near = False
    for i in range(len(around)):
        if Board[around[i][0]][around[i][1]] == "-" or "m" or "h":
            continue
        else:
            near = True
            break
    if near == True:
        return True
    else:
        return False

【讨论】:

  • 您永远不会检查 around[0] 的情况,因为您在循环开始时递增!
  • 我总是把事情搞砸...
【解决方案3】:

For 循环不能做到这一点。使用 while 循环:

def RadarScan(Board, Ships, R, C):
    around = [[C, R - 1], [C + 1, R], [C, R + 1], [C - 1, R]]
    c= 0
    while c < len(around)-1:
        i = around[c]
        for x in range(2):
            if int(i[x]) > 9 or int(i[x]) < 0:
                around.remove(i)
                c-= 1
        c += 1
    near = False
    for i in range(len(around)):
        if Board[around[i][0]][around[i][1]] == "-" or "m" or "h":
            continue
        else:
            near = True
            break
    if near == True:
        return True
    else:
        return False

这应该可以解决问题

【讨论】:

  • c 在这里没有递增,但是当我在 'c -= 1' 之后添加一个 else 语句,它将 c 递增 1 时,我收到一条错误消息,其中一个无效的位置已经通过(我是使用 (9,9) 作为目标位置,因为它有两个场外值)
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 2016-01-31
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多