前提・実現したいこと
シミュレーションするプログラミングを作成しています。しかし、リストのインデックスについてエラーが発生してしまいます。どう改善すれば良いでしょうか。
<方針>
・地面をN×Nのマス目とし、2次元配列tree[x][y]で表す。木があるところを1,無いところを0とし、一定確率P で生えている。
・火災を表現するために燃えている木を2,燃え尽きた木を3とする。
tree[x][y]=2 :(x,y)が燃えている
<ルール>
・(x,y)が2のとき、次のステップで3となる。
・(x,y)が1のとき、上下左右四つの隣接点のいずれかが2であれば、次のステップで(x,y)は2になる。
・上の条件に当てはまらない場合、状態は変化しない。
tree[x][y]の初期値は0か1とし、第1ステップでどこか一カ所の木を2の状態にする(火災発生)。そして、完全に鎮火するまでステップを更新していく。
最終的に燃えてしまう(状態3になる)土地の面積は全体の割になるか求める。
長くなりましたが、よろしくお願いします。
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-1-228afae0222f> in <module> 30 for y in tree[1:-1]: 31 for x in y[1:-1]: ---> 32 if tree[x][y] == green and (tree[x+1][y]==burn or tree[x-1][y]==burn or tree[x][y+1]==burn or tree[x][y-1]==burn): 33 temp[x][y] = tree[x][y] + 1 34 TypeError: list indices must be integers or slices, not list
該当のソースコード
python
1import random 2import numpy as np 3 4 5N=4 6P=0.8 7 8 #要素が確率P で1、1-P で0になるN*Nの二次元リストを作成 9tree= [random.choices([0, 1], weights=[1-P, P], k=N) for y in range(N)] 10 11 #どれか一つの要素1を2にする 12while True: 13 idx_y = random.randrange(len(tree)) 14 idx_x = random.randrange(len(tree[0])) 15 if tree[idx_x][idx_y] == 1: 16 tree[idx_x][idx_y] = 2 17 break 18 else: 19 continue 20 21 22empty = 0 23green = 1 24burn = 2 25end = 3 26 #外枠を除いた内側、 二次元リストの端、端を除いた外枠の辺で場合分け 27 #リストの要素に2がなくなるまで続けたい 28while True: 29 # 1<= x <=N-2, かつ 1<= y <=N-2 の範囲 :内側 30 for y in tree[1:-1]: 31 for x in y[1:-1]: 32 if tree[x][y] == green and (tree[x+1][y]==burn or tree[x-1][y]==burn or tree[x][y+1]==burn or tree[x][y-1]==burn): 33 temp[x][y] = tree[x][y] + 1 34 35 36 #端 37 if tree[0][0] == green and ( tree[x+1][y]==burn or tree[x][y+1]==burn ): 38 tre[0][0] += 1 39 40 if tree[N-1][0] == green and ( tree[x-1][y]==burn or tree[x][y+1]==burn ): 41 tree[N-1][0] += 1 42 43 if tree[0][N-1] == green and ( tree[x+1][y]==burn or tree[x][y-1]==burn ): 44 tree[0][N-1] += 1 45 46 if tree[N-1][N-1] == green and ( tree[x-1][y]==burn or tree[x][y-1]==burn ): 47 tree[N-1][N-1] += 1 48 49 50 #端以外の外辺 51 for x in y[1:-1]: 52 if tree[x][0] == green and (tree[x+1][y]==burn or tree[x-1][y]==burn or tree[x][y+1]==burn ): 53 temp[x][0] = tree[x][0] + 1 54 55 if tree[x][N-1] == green and (tree[x+1][y]==burn or tree[x-1][y]==burn or tree[x][y-1]==burn ): 56 temp[x][N-1] = tree[x][N-1] + 1 57 58 for y in tree[1:-1]: 59 if tree[0][y] == green and (tree[x+1][y]==burn or tree[x][y+1]==burn or tree[x][y-1]==burn ): 60 temp[0][y] = tree[0][y] + 1 61 62 if tree[N-1][y] == green and (tree[x-1][y]==burn or tree[x][y+1]==burn or tree[x][y-1]==burn ): 63 temp[N-1][y] = tree[N-1][y] + 1 64 65 #鎮火する 66 for y in N: 67 for x in y: 68 if tree[x][y] == 2: 69 temp[x][y] = end 70 71 for y in tree: 72 for x in y: 73 tree[x][y] = temp[x][y] 74 break 75 76A = tree.count(3)/N*N 77print(A)
回答2件
あなたの回答
tips
プレビュー