[英]How can I prevent my python game from reiterating and instead carry on?
我使用pygame和livewires制作了一個簡單的游戲,其中精靈必須避免掉下蘑菇。 在特定時間掉落的蘑菇數量意味着隨着分數的增加而增加。 這是我的意思:
from livewires import games,color
import random
games.init(screen_width=633,screen_height=479,fps=50)
class Stick_Man(games.Sprite):
def update(self):
self.x=games.mouse.x
if self.left<0:
self.left=0
if self.right>games.screen.width:
self.right=games.screen.width
self.check_collision()
def check_collision(self):
if self.overlapping_sprites:
self.over_message()
def over_message(self):
b=games.Message(value="Game Over", size=100, color=color.red,x=games.screen.width/2,y=games.screen.height/2,lifetime=250,after_death=games.screen.quit)
games.screen.add(b)
class Mushroom(games.Sprite):
score=0
start=200
score_required=100
level=1
total_score=0
speed=1
mushroom=games.load_image("mushroom.jpg")
x_position=random.randrange(640)
@staticmethod
def next_level():
indicate='Level ', + Mushroom.level, ' cleared'
message=games.Message(value=indicate,size=50,color=color.red,x=games.screen.width/2,y=games.screen.height/2, lifetime=150)
games.screen.add(message)
Mushroom().score_required+=50
Mushroom().score-=Mushroom.score_required
Mushroom().start-=150
Mushroom().speed+=5
Mushroom().level+=1
if Mushroom().start==20:
Mushroom().start+=10
def __init__(self):
super(Mushroom,self).__init__(image=Mushroom.mushroom,x=games.mouse.x,y=0)
def update(self):
self.dy=Mushroom.speed
self.check()
self.check2()
def check(self):
if self.bottom==games.screen.height:
self.destroy()
Mushroom.score+=50
Mushroom.total_score+=Mushroom.score
if Mushroom().score==Mushroom.score_required:
self.next_level()
def check2(self):
if self.top==Mushroom.start:
self.duplicate()
def duplicate(self):
new_mush=Mushroom()
games.screen.add(new_mush)
background_image=games.load_image("background.jpg", transparent=False)
games.screen.background=background_image
stickman_image=games.load_image("stickman.png", transparent=True)
stickman=Stick_Man(image=stickman_image,left=1,bottom=480)
games.screen.add(stickman)
games.mouse.is_visible=False
b=Mushroom()
c=Mushroom()
a=Mushroom()
games.screen.add(b)
games.screen.add(a)
games.screen.add(c)
games.screen.event_brab=True
games.screen.mainloop()
該代碼是很容易解釋的,每當一個蘑菇等於開始時,就會創建一個新對象,從而意味着一個新的蘑菇進入。但是,發生的情況是該代碼第二次無法正常運行,而蘑菇卻無法正常工作。也不會更快地產生。 同樣,當游戲第一次開始時,第一個蘑菇到達底部的那一刻,它說級別1已清除,應該在兩個蘑菇之后。 精靈只是一個紅色的蘑菇,也是一個火柴人,如果要模擬,可以在g圖像上找到它。
所以我的問題是,如何使對象的STATS在出現另一個蘑菇時從中斷的地方繼續進行,並在正確的時間顯示消息
您的問題出在所有看起來像這樣的行中:
Mushroom().score_required+=50
這里有很多問題,所有這些問題加起來使它沒有任何用處:
Mushroom
實例(此行完成后即消失)。 a += b
實際上與a = a + b
。* 因此,當您將它們放在一起時,您正在做的是創建一個等於Mushroom.score_required + 50
的新值,然后將該值分配給臨時實例的新實例屬性(該實例立即消失)。 這對class屬性或任何其他實例沒有影響。
您在類似的行中有一個相關但不同的問題:
x_position=random.randrange(640)
除非您希望所有蘑菇都具有相同的x_position
, x_position
這不應是class屬性,而應是instance屬性,否則您將遇到各種奇怪的問題。
將游戲統計信息存儲為隨機類的類屬性是一件奇怪的事情。 您可以通過多種方法進行這項工作,但沒有充分的理由嘗試。 類屬性對於類的所有實例都可能共享的常量很有用,但它們不能代替全局變量。
更好的設計應該是這樣的:
class Game(object):
def __init__(self):
self.score = 0
self.start = 200
self.score_required = 100
self.level = 1
self.total_score = 0
def next_level(self):
indicate = 'Level ', + Mushroom.level, ' cleared'
message = games.Message(value=indicate, size=50, color=color.red,
x=games.screen.width/2, y=games.screen.height/2,
lifetime=150)
games.screen.add(message)
self.score_required += 50
self.score -= self.score_required
self.start -= 150
self.speed += 5
self.level += 1
if self.start == 20:
self.start += 10
def update_score(self, n):
game.score += n
game.total_score += game.score
if self.score == self.score_required:
self.next_level()
class Mushroom(games.Sprite):
mushroom=games.load_image("mushroom.jpg")
def __init__(self, game):
self.x_position=random.randrange(640)
self.game = game
super(Mushroom,self).__init__(image=Mushroom.mushroom,x=games.mouse.x,y=0)
def update(self):
self.dy=Mushroom.speed
self.check()
self.check2()
def check(self):
if self.bottom == games.screen.height:
self.destroy()
game.update_score(50)
def check2(self):
if self.top == Mushroom.start:
self.duplicate()
def duplicate(self):
games.screen.add(Mushroom(self.game))
game = Game()
games.screen.add(Mushroom(game))
games.screen.add(Mushroom(game))
games.screen.add(Mushroom(game))
games.screen.event_brab=True
*這不是完全正確的。 實際上, a = a + b
等效於a = a.__add__(b)
,而a += b
等效於a = a.__iadd__(b)
如果存在),僅當不存在時才回落到__add__
沒錯 對於像列表可變對象,這使得一個很大的區別,因為__iadd__
可以改變self
就地,然后返回它,這意味着你最終分配相同的對象回到a
是已經在那里了。 但是對於不可變的對象,沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.