1

だから、私はドワーフ要塞のような小さなゲームを作っています...しかし今は画面をランダムに変更するだけで作業しています。私は文字列に割り当てられておらず、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]と、リスト内のアイテムを独自のインデックスであるかのように使用しようとします。また、この方法ではリストを変更できないことに注意してください。これは、あなたがやろうとしていることのようです。詳細については、以下を参照してください。

2 番目の質問に答えるには、セグメント内のリストを反復処理する 1 つの方法は次のようになります。他にもたくさんありますが、これはおそらく最初に理解するのが最も簡単です。

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

2 行目のコロンはリストをスライスiし、との間のリストのセクションのコピーを返しますi + 6。この関数' '.join(...)は文字列のリストを受け取り、それらの文字列をスペースで結合します。

最後に、あなたもリストを変更しようとしていることがわかりました。もっと何かをする必要があります。それを行うための最良の方法(imho)は次のとおりです(これは単なる例です):

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

enumerateリスト内のインデックスとアイテムを反復処理できる関数です。ここiに へのインデックスがaあり、nは の値です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])

または、これは、1 つのライナーが必要な場合:

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

問題は、b を直接使用していることです。これは、b のインデックスではなく、b が指す文字列を逆参照します (したがって、'l[4] などではなく、'l[#]' になります)。list.index() 関数を使用して b のインデックスを取得し、b の値ではなく、それに基づいて l に割り当てます。

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