2009-12-08 64 views
0

我剛開始學習Python,並且正在努力爲康威的人生遊戲編寫一個程序。我試圖用邊界條件創建一個封閉的宇宙(這是對面/角落)。我想我已經完成了這個工作,但是我沒有在循環運行時迭代,也無法解決如何執行此操作。首先十分感謝!康威的生活:迭代Python中的封閉宇宙

def iterate_conway_closed(universe_t0, n_iter=1, display=False): 
# This function is similar to your iterate_conway_open function 
# but instead of adding a zero guard ring it should add a 
# ‘wrapping ring’ as explained earlier. Use the same apply_rules 
# function as part 1) to actually apply the rules once you have 
# padded the universe. 
# Note that unlike the always 0 guard ring for an open universe 
# the wrapping ring will need updating after every call to 
# apply rules to reflect changes in the universe 

height, width=universe_t0.shape 
universe_array=numpy.zeros((height+2, width+2), dtype=numpy.uint8) 
universe_array[1:-1, 1:-1]=universe_t0 

def count(n_iter): 
    n=0 
    while n<= n_iter: 
     yield n 
     n+=1 

for n in range(0,n_iter): 
    universe_array[:1,1:-1]=universe_t0[-1:,:] # Maps the bottom row 
    universe_array[0,1:-1]=universe_t0[-1:,0:]# Maps the top row 
    universe_array[1:-1,0]=universe_t0[:,0]# Maps the left column 
    universe_array[1:-1,-1]=universe_t0[:,-1]# Maps the right column 
    universe_array[0,0]=universe_t0[-1,0]# Maps the bottom left corner 
    universe_array[0,-1]=universe_t0[-1,-1]# Maps the bottom right corner 
    universe_array[-1,0]=universe_t0[0,0]# Maps the top left corner 
    universe_array[-1,-1]=universe_t0[0,-1]# Maps the top right corner  

for i in range(0, n_iter): 
    universe_array=apply_rules(universe_array) 


if display==True: 
    b_print(universe_array) 

return universe_array[1:-1, 1:-1] 
+0

我們需要更多的細節,以瞭解你遇到的問題是什麼。 – 2009-12-08 15:42:37

+0

我只是不能解決爲什麼我的程序沒有迭代 - 它應該更新每個進化的邊界條件 – user227194 2009-12-08 22:06:30

+0

看到我的修改答案爲可能的問題 – cobbal 2009-12-09 18:13:50

回答

1

你的問題可能是break聲明

編輯:還有,你可能只想要1循環中,首先你初始化universe_arrayn_iter次,做後的第一次沒什麼。那麼你應用規則n_iter次,你很可能希望把它們放在同一個循環中,以便在每次迭代後正確更新Universe。

+0

爲什麼它應該是一個問題? – Joschua 2009-12-08 16:03:55

+1

你的循環是'while:... break'。由於'break'總是被執行,所以循環在一次迭代後總是停止。有意義的是,'break'應該由'if'語句來保護。 – 2009-12-08 16:35:31

0

據我所知您要創建一個迭代器函數。您需要的是用yield替換return

作爲例子,如果你想使一個迭代器函數返回範圍爲0x做到這一點:

def count(x=0): 
    n = 0 
    while n <= x: 
     yield n 
     n += 1 

然後你就可以通過一個for語句迭代它:

for i in count(10): 
    print(i) 

# prints 0,1,2,3,4,5,6,7,8,9,10 (instead of "," there are line breaks) 

break也是問題,因爲它會一直執行,while循環遍歷。

+0

非常感謝你們的回覆!所以我明白我必須擺脫休息時間,並且在映射邊界函數的位之前添加了def count(n_iter)函數,並從原始函數中刪除了n = 1個事物。這聽起來好嗎?非常感謝! DEF計數(n_iter): n = 0的 而N <= n_iter: 得到N N + = 1 – user227194 2009-12-08 18:55:34

+0

你能在問題,以反映這些新的更新更新代碼? – cobbal 2009-12-08 19:01:50

+0

沒有樂趣。 ;)當你回答你的問題時,你可以將它切碎。如果您的問題尚未得到解答,請將上述問題更新爲新代碼。然後我會試着回答它。 – Joschua 2009-12-08 19:43:28