2014-06-12 172 views
3

好的,這是我第一次在這個網站,所以我希望我得到這個權利。Pygame蛇遊戲

我在Pygame做了一個蛇遊戲,爲了學校的評估任務,我有個問題。我無法讓蛇的身體部位消失。

目前,這是如何產生的身體部位:

def more_body(bodyparts, x, y, z): 
    body = pygame.sprite.Sprite() 
    body.image = pygame.image.load('body.png') 
    body.rect = head.image.get_rect() 
    body.rect.right = x 
    body.rect.top = y 
    body.timeleft = z 
    bodyparts.add(body) 

身體刪除檢查,如IS,是這樣的。

for x in bodyparts: 
    body.timeleft -= 1 
    if body.timeleft == 0: 
     body = False 

bodyparts是,相當明顯,正文部分的分組。它是OrderedUpdates精靈組。

問題是代碼似乎不喜歡這個解決方案。目前,該錯誤被列爲「NameError:name'body'未定義」。如果我試圖擴展它的檢查來引用bodyparts.body.timeleft而不是body.timeleft,我反而得到「AttributeError:'OrderedUpdates'對象沒有屬性'body'」。

我想出了第二種解決方案。由於bodyparts是OrderedUpdates組,所以應該可以根據列表中的位置來選擇和刪除特定的片段。因此,計劃的步驟如下:

  1. 將len(bodyparts)與先前設置的變量進行比較。
  2. 如果長度超過蛇的長度,刪除第一個添加到bodyparts的項目 - 我不確定這是否是第一個或最後一個。

我的主要問題是:

這是一個可行的解決方案,您將能夠提供的代碼來做到這一點?我能否像列表一樣對待它,然後分割它,以便正式組件的前端(或後端,取決於它們的添加方式)被刪除?任何你可以提供的解決方案都會有很大的幫助。

回答

1
for x in bodyparts: 
    body.timeleft -= 1 
    if body.timeleft == 0: 
     body = False 

在這裏,你迭代子畫面組,存儲在變量x每個精靈。你永遠不會定義body,所以會引發異常。

即使你這樣做了,將body設置爲False也不會奇妙地從精靈組中刪除精靈。要做到這一點,你的方法是remove

所以您應將循環更改爲:

for body in bodyparts: 
    body.timeleft -= 1 
    if body.timeleft == 0: 
     bodyparts.remove(body) 

而不是使用一個精靈組,你也可以使用一個簡單的列表,和刪除元素一旦它變得太大:

max_len = 4 # current max length of snake 
bodyparts = [] 

def more_body(bodyparts, x, y, z): 
    body = ... 
    bodyparts.append(body) 
    bodyparts=bodyparts[-max_len:] 

此外,您應該只加載一次圖像'body.png'並重復使用它,而不是每次加載它。

+0

我實際上並沒有意識到刪除方法。有了這個說法,X體衝突應該是顯而易見的......>。不管怎樣,這完全解決了這個問題,謝謝。 – Leafsw0rd