0

我有一个相当具体的问题:

我想使用\033[语法在特定位置打印出字符。这就是下面的代码应该做的:(字典cells具有相同的键,coords但具有'*''-'作为值。)

coords = {'x'+str(x)+'y'+str(y) : (x,y) for x,y, in itertools.product(range(60), range(20))}

for key, value in coords.items():  

    char = cells[key]  
    x,y = value
    HORIZ=str(x)
    VERT=str(y)
    char = str(char)
    print('\033['+VERT+';'+HORIZ+'f'+char)

但是,我注意到,如果我将它放入一个无限的 while 循环中,它并不总是在相同的位置打印相同的字符。只有轻微的变化,但它会删除一些并在一些循环后将它们放回原处。我已经用列表试过了,它似乎表现得很好,所以我倾向于认为它与字典有关,但我不知道它可能是什么。您可以在此处的控制台中看到问题:SharedConsole。我很高兴收到有关此问题的每个提示。

关于一个相关主题:打印后,应该对cellsdict的值进行一些更改,但由于我不知道的原因,只执行了前两个规则,其余规则被忽略。规则应测试单元周围有多少邻居(位于 中population)并应用相应的规则。在我的实现中,我有某种奇怪的肿瘤生长(这不应该发生,好像周围有超过三个细胞应该死亡)(参见FreakingTumor):

if cells_copy [coord] == '-':
    if population == 3:
        cells [coord] = '*'
if cells_copy [coord] == '*':
    if population > 3:
        cells [coord] = '-'
    elif population <= 1:
        cells [coord] = '-'
    elif population == 2 or 3:
        cells [coord] = '*'

population我多次检查了这个变量,所以我很确定这不是问题。我为缓慢的控制台感到抱歉。

提前致谢!基里尔

4

1 回答 1

1

你的语法

    elif population == 2 or 3:

评估为

    elif (population == 2) or (3 != 0):

并且 3 永远不会是 0,因此该子句始终为 True。你想写的是

    elif population == 2 or population == 3:

或许

    elif population in (2,3):

这个逻辑可以简化为

EMPTY = '-'
FULL = '*'
if cells_copy[coord] == EMPTY:
    if population == 3:
        cells[coord] = FULL
else:
    if population not in set([2,3]):
        cells[coord] = EMPTY

我还建议合并你的写作(一次写一整行):

# Make sure everything in `cells` is a string
ESC = chr(27)

for y in xrange(20):
    outp = (cells['x{}y{}'.format(x,y)] for x in xrange(60))
    print('{}[{};{}f{}'.format(ESC, y, x, ''.join(outp)), end='')

您可能还会从制作cells列表而不是列表中受益dict

WIDTH = 60
HEIGHT = 20
cells = [[EMPTY]*WIDTH for y in xrange(HEIGHT)]
于 2012-07-04T18:43:28.627 回答