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

些細な修正が 2 つあります。

  • x % 5andの結果をキャッシュするy % 5
  • inまたはチェーンを使用<して値をテストします。

さらに、<= 4(または) のテストは、およびのすべての値が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

Konrad の 2 番目の回答:-

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 に答える