1

所以,我正在制作一个有点像矮人要塞的小游戏......但现在我正在努力让屏幕随机变化。我有 t 被分配给一个字符串,而 g 被分配给另一个。当我预定义它时它工作正常,但是当我改变它时......

这是它应该做的,并且通常输出(不改变动态改变任何东西):

# # # # # # 
# ^ # # ^ # 
# # ^ # # # 
# # # # # # 
# # # # # # 
# # # ^ # # 

(它以颜色输出)

但是当我尝试动态更改数组时,它搞砸了。这是代码:

import os
import time
import random
clear = lambda: os.system('clear')

g = '\033[32m' + '# '
t = '\033[31m' + '^ '
l = [g, g, g, g, g, g,
     g, t, g, g, t, g,
     g, g, t, g, g, g,
     g, g, g, g, g, g,
     g, g, g, g, g, g,
     g, g, g, t, g, g]

def level():
    i = 0
    while i < 50:
        print l[0] + l[1] + l[2] + l[3] + l[4] + l[5]
        print l[6] + l[7] + l[8] + l[9] + l[10] + l[11]
        print l[12] + l[13] + l[14] + l[15] + l[16] + l[17]
        print l[18] + l[19] + l[20] + l[21] + l[22] + l[23]
        print l[24] + l[25] + l[26] + l[27] + l[28] + l[29]
        print l[30] + l[31] + l[32] + l[33] + l[34] + l[35]
        time.sleep(0.2)
        i += 1
        for b in l:
            ch = round(random.random())
            if ch:
                l[b] = t
            else:
                l[b] = g
        clear()
level()

这是错误:

Traceback (most recent call last):
  File "DF.py", line 33, in <module>
    level()
  File "DF.py", line 29, in level
    l[b] = t
TypeError: list indices must be integers, not str

我该如何解决这个问题?此外,任何与此问题无关的提示或建议也将不胜感激,我是 Python 的新手,所以我需要一些专业提示:P

另外,我确信有一种方法可以以正确的格式打印出来,而无需扔掉数组并打印它。可能有一个循环,但如果我只是做标准

for i in l:
    print l[i]

不起作用,因为它不会以 6x6 打印。它会以 1x36 格式打印出来 :P 所以请帮我玩这个小游戏!

4

3 回答 3

4

你的主要问题在这里:

    for b in l:
        ch = round(random.random())
        if ch:
            l[b] = t
        else:
            l[b] = g

在 Python 中,for循环不会生成索引。它实际上为您提供了对被迭代对象中每个项目的直接引用。例如,如果你这样做:

for c in ['a', 'b', 'c']:
    print c

你不会得到

1
2
3

你会得到

a
b
c

所以当你这样做时: l[b],你试图使用列表中的项目,就好像它是它自己的索引一样。另请注意,您将无法以这种方式修改列表,这似乎是您想要做的。有关更多信息,请参见下文。

要回答您的第二个问题,一种迭代分段列表的方法是这样的;还有很多其他的,但这可能是您刚开始时最容易理解的:

for i in range(0, len(l), 6):
    print ' '.join(l[i:i + 6])

第二行中的冒号对列表进行切片,返回列表中i和之间部分的副本i + 6。该函数' '.join(...)采用字符串列表并将字符串连接在一起,并在它们之间使用空格。

最后,我看到您也在尝试修改列表。你需要做更多的事情。最好的方法(恕我直言)如下(这只是一个例子):

a = [1, 2, 3]:
for i, n in enumerate(a):
    a[i] = n * 2

enumerate是一个允许您迭代列表中的索引项目的函数。所以i这里是 的索引an是 的值a[i]

于 2012-04-21T21:44:30.367 回答
1

对于第一个问题,错误是:

for b in l:
    ch = round(random.random())
    if ch:
        l[b] = t
    else:
        l[b] = g

您正在尝试按字符本身进行索引。你应该做:

for i, b in enumerate(l):
    ch = round(random.random())
    if ch:
        l[i] = t
    else:
        l[i] = g

enumerate() 将在您迭代它时为每个字符提供索引。

关于打印问题,下面的循环应该这样做:

for i in xrange(0, 36, 6):
    print ''.join(l[i:i+6])

或者这个,如果你想要一个衬里:

print '\n'.join(''.join(l[i:i+6]) for i in xrange(0, 36, 6))
于 2012-04-21T21:45:51.410 回答
0

问题是您直接使用 b,这将取消对 b 指向的字符串的引用(因此它会导致 'l[#]',而不是 'l[4] 左右),而不是 b 的索引。使用 list.index() 函数获取 b 的索引并基于该索引分配给 l,而不是 b 的值

if ch:
    l[l.index(b)] = t
else:
    l[l.index(b)] = g
于 2012-04-21T21:44:19.527 回答