6

如何简化这个 if 语句?它是一个加号:http: //i.stack.imgur.com/PtHO1.png

如果语句完成,则在 x 和 y 坐标处设置一个块。

for y in range(MAP_HEIGHT):
    for x in range(MAP_WIDTH):
        if (x%5 == 2 or x%5 == 3 or x%5 == 4) and \
            (y%5 == 2 or y%5 == 3 or y%5 == 4) and \
            not(x%5 == 2 and y%5 == 2) and \
            not(x%5 == 4 and y%5 == 2) and \
            not(x%5 == 2 and y%5 == 4) and \
            not(x%5 == 4 and y%5 == 4):
            ...
4

6 回答 6

15

这是一样的:

if (x % 5 == 3 and y % 5 > 1) or (y % 5 == 3 and x % 5 > 1): 
于 2010-11-03T14:44:26.107 回答
12

基本上,您正在平铺 5x5 二进制模式。这是一个明确的表达:

pattern = [[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 1, 1, 1],
           [0, 0, 0, 1, 0]]

for y in range(MAP_HEIGHT):
    for x in range(MAP_WIDTH):
        if pattern[x%5][y%5]:
           ...

这是一种非常简单且通用的方法,可以轻松修改模式。

于 2010-11-03T18:08:08.627 回答
7

有两个微不足道的修复:

  • 缓存和的x % 5结果y % 5
  • 使用in或链接<来测试值:

此外,<= 4(or < 5) 的测试实际上是多余的,因为和的每个值都将小于 5。lxly

for y in range(MAP_HEIGHT):
    for x in range(MAP_WIDTH):
        lx = x % 5 # for local-x
        ly = y % 5 # for local-y
        if lx > 1 and y > 1 and \
           not (lx == 2 and ly == 2) and \
           not (lx == 4 and ly == 2) and \
           not (lx == 2 and ly == 4) and \
           not (lx == 4 and ly == 4):

或者你可以只保留一个实际允许的元组列表:

cross_fields = [(2, 3), (3, 2), (3, 3), (3, 4), (4, 3)]

for y in range(MAP_HEIGHT):
    for x in range(MAP_WIDTH):
        if (x % 5, y % 5) in cross_fields:
于 2010-11-03T14:37:55.317 回答
2

基于 Konrad 的回答,您可以进一步简化它:

for y in range(MAP_HEIGHT):
    for x in range(MAP_WIDTH):
        lx = x % 5 # for local-x
        ly = y % 5 # for local-y
        if (1 < lx < 5 and 1 < y < 5 and 
           (lx, ly) not in ((2, 2), (4, 2), (2, 4), (4, 2))):
于 2010-11-03T14:44:01.263 回答
1

康拉德的第二个答案:-

cross_fields = [(2, 3), (3, 2), (3, 3), (3, 4), (4, 3)]

for y in range(MAP_HEIGHT):
  for x in range(MAP_WIDTH):
    if (x % 5, y % 5) in cross_fields:

可能是最好的一个。

但是,我会贡献:-

for y in range(MAP_HEIGHT):
  for x in range(MAP_WIDTH):
    lx = x % 5
    ly = y % 5
    if (lx > 1 and ly == 3) or (ly > 1 and lx == 3):
于 2010-11-03T15:01:01.690 回答
0

优化这样的逻辑函数的一般解决方案是卡诺图。您的真值表将是您想要的文字加形状,其中行和列是您的模块化测试。

于 2010-11-04T05:25:17.693 回答