我對python和編程都是新手,我正在為一個以python為中心的類做最后一個項目。我似乎不知道如何工作的一個要求是將遞歸集成到我們的代碼中,以展示工作知識。我用pygame設計了一個簡單的“子彈地獄”式游戲。
我的目標是,當子彈與敵人接觸時,一系列的子彈將作為一種short-term修改器從玩家位置發射。
每當子彈擊中敵人時,此代碼在主循環中運行:
for i in reversed(range(len(bullets))):
for j in reversed(range(len(enemies))):
if bullets[i].collided(enemies[j].rect):
del enemies[j]
del bullets[I]
s.global_score += 100
more_bullets(10)
#print("Hit!")
#print(s.global_score)
break
"more_bullets”函數是我遞歸的焦點,它調用:
def more_bullets(n):
if(n > 0):
spawnx = sq.rect.x+10 + sq.rect.width/2 - 10
b = Square(s.red, spawnx,sq.rect.y, 10,30)
b.direction = 'N'
b.player_speed = 10
bullets.append(b)
spawnx = sq.rect.x-10 + sq.rect.width/2 - 10
b = Square(s.red, spawnx,sq.rect.y, 10,30)
b.direction = 'N'
b.player_speed = 10
bullets.append(b)
pygame.display.update()
more_bullets(n-1)
print(f"Fired x {n}")
目前的結果是,我的debug打印了10次,使我認為遞歸功能正常,但是當沖突發生時,只有一組項目符號觸發。我認為所有10發子彈的發射速度都超過了我的記錄,只是在屏幕上疊加而已。
有沒有一個easy-to-use函數可以減慢子彈的發射速度?或者在這里搞亂了一些更根本的東西?
You're correct.
我不相信有一種“簡單的方法”可以按照你的想法去做你所要求的事情。遞歸是即時的,這意味著函數在被調用時會立即運行10次。為了讓它發出一連串交錯的子彈,你需要一些計時器、隊列或者沿著主循環運行的那些線的東西,而遞歸并不是一種自然的適合。這同樣適用于在一段時間內運行的任何類型的游戲邏輯功能。
這不是要問的問題,但這里有一個想法,你可以做什么,即使這是一種重復使用的遞歸:添加一個參數到該函數,指示子彈被射出的角度。然后,在每次遞歸調用時向該參數添加一點。這樣,一個弧形的子彈將同時射出。