Python中的调用函数已损坏

时间:2012-01-25 14:14:12

标签: python pygame

当我在python 2.7中使用pygame编写一个基本的UFO游戏时,我遇到了一个错误,但是它没有出现在consol中。发生了什么:

  1. 我正在编程
  2. 对代码进行了一些更改
  3. 菜单屏幕工作正常,我去玩游戏
  4. 然后不断重启。
  5. 我编辑了一些代码,所以它会在while循环中,直到它能正确调用命令。
  6. 而且仍然会打电话给命令。
  7. 如果您想要图片,可以在这里下载它们和Sorcecode: http://dl.dropbox.com/u/33487921/A%20Problem.zip

    以下是代码:

    import sys, pygame, random
    from pygame.locals import *
    from time import gmtime, strftime
    pygame.init()
    
    width = int(500*2)
    height = int(300*2)
    width2 = width + (width/5)
    height2 = height + ((height/3)/2)
    screen = pygame.display.set_mode((width, height2))
    pygame.display.set_caption("MoeTM's UFO Game")
    
    class FlyingObject():
        def Restart(self):
            self.amount = 0
            self.array = []
        def New(self, FPS):
            self.amount += 1
            for i in range(self.amount):
                if i == self.amount-1:
                    self.array.append([])
                    Strength = random.randrange(1, 101, 1)
                    if Strength in range(1, 51, 1):
                        Type = 1
                    if Strength in range(51, 76, 1):
                        Type = 2
                    if Strength in range(76, 88, 1):
                        Type = 3
                    if Strength in range(88, 94, 1):
                        Type = 4
                    if Strength in range(94, 101, 1):
                        Type = 5
                    X = random.randrange(0,1,1)
                    if X == 0:
                        XMove = random.randrange(1,6,1)
                    if X == 1:
                        XMove = random.randrange(1,6,1)
                        XMove /= 5.0
                    Y = random.randrange(0,2,1)
                    if Y == 0:
                        YMove = random.randrange(1,6,1)
                    if Y == 1:
                        YMove = random.randrange(1,6,1)
                        YMove /= 5.0
                    XMove *= 10
                    YMove *= 10
                    XMove *= FPS
                    YMove *= FPS
                    TLBR = random.randrange(0,4,1)
                    if TLBR == 0:#top
                        XIntercept = random.randrange(0,width+1,1)
                        YIntercept = -5
                    if TLBR == 1:#left
                        XIntercept = -5
                        YIntercept = random.randrange(0,height+1,1)
                    if TLBR == 2:#bottom
                        XIntercept = random.randrange(0,width+1,1)
                        YIntercept = height + 5
                    if TLBR == 3:#right
                        XIntercept = width + 5
                        YIntercept = random.randrange(0,height+1,1)
                    if XIntercept in range((width/4)*3,width+1,1):
                        XMove = -XMove
                    if YIntercept in range((height/4)*3,height+1,1):
                        YMove = -YMove
                    if XIntercept in range((width/4),(width/4)*3, 1):
                        chance = random.randrange(0,2,1)
                        if chance == 1:
                            XMove=-XMove
                    if YIntercept in range((height/4),(height/4)*3, 1):
                        chance = random.randrange(0,2,1)
                        if chance == 1:
                            YMove=-YMove
                    if XMove < 1 and YMove >= 1:
                        XMove *= 3
                        YMove *= 3
                    if YMove < 1 and XMove >= 1:
                        XMove *= 3
                        YMove *= 3
                    if YMove < 1 and XMove <1:
                        XMove *= 3
                        YMove *= 3
                    self.array[i] = [XMove,YMove,XIntercept,YIntercept,False,False, Type, "image"]
        def Move(self, PX, PY, IX, IY):
            for i in range(self.amount):
                self.array.append([])
                if self.array[i][2] > width +10 or self.array[i][2] < -10:
                    self.array[i][4] = False
                    self.array[i][5] = True
                if self.array[i][3] > height +10 or self.array[i][3] < -10:
                    self.array[i][4] = False
                    self.array[i][5] = True
                Check = True
                if self.array[i][4] == False and self.array[i][5] == True:
                    Check = False
                if Check == True:
                    self.array[i][2] += self.array[i][0]#XIntercept+=XMove
                    self.array[i][3] += self.array[i][1]#YIntercept+=Ymove
                    if self.array[i][2] in range(0,width+1,1) and self.array[i][3] in range(0,height+1,1):
                        self.array[i][4] = True
                        self.array[i][5] = True
                    else:
                        self.array[i][4] = False
                    if int(self.array[i][2]+5) in range(PX, PX+IX, 1) and int(self.array[i][3]+5) in range(PY, PY+IY, 1):
                        self.colide(self.array[i][6])
                        self.array[i][4] = False
                        self.array[i][5] = True
        def Blit(self):
            for i in range(self.amount):
                self.array.append([])
                Check = True
                if self.array[i][4] == False and self.array[i][5] == True:
                    Check = False
                if Check == True:
                    screen.blit(self.array[i][7], (int(self.array[i][2]), int(self.array[i][3])))
    class Bullits(FlyingObject):
        def colide(self, damage=1):
            Play.Game.Player.Hit(damage)
        def Convert(self):
            for i in range(self.amount):
                self.array.append([])
                self.array[i][7]=self.Image = pygame.image.load("images\Bullit"+str(self.array[i][6])+".png")
    class Orbs(FlyingObject):
        def colide(self, ammount=1):
            Play.Game.Player.GotPoint(ammount)
        def Convert(self):
            for i in range(self.amount):
                self.array.append([])
                self.array[i][7]=self.Image = pygame.image.load("images\Orb"+str(self.array[i][6])+".png")
    class UFO():
        def __init__(self):
            self.health = 10
            self.maxhealth = 50
            self.startinghealth = 10
            self.maxspeed = 20
            self.Image = pygame.image.load("images\UFO.png")
            self.Heart0 = pygame.transform.scale(pygame.image.load("images\Heart0.png"), (width/50,height/30))
            self.Heart1 = pygame.transform.scale(pygame.image.load("images\Heart1.png"), (width/50,height/30))
            self.Heart2 = pygame.transform.scale(pygame.image.load("images\Heart2.png"), (width/50,height/30))
            self.Heart3 = pygame.transform.scale(pygame.image.load("images\Heart3.png"), (width/50,height/30))
            self.Heart4 = pygame.transform.scale(pygame.image.load("images\Heart4.png"), (width/50,height/30))
            self.Heart5 =pygame.transform.scale( pygame.image.load("images\Heart5.png"), (width/50,height/30))
    
            self.ix = 100
            self.iy = 40
            self.points = 0
            self.collection = 0
            self.x = (width-self.ix)/2
            self.y = (height-self.iy)/2
            self.HeartCol= []
            self.DA = "New"
            for i in range(0,10,1):
                self.HeartCol.append([])
                dif = int((width/2.5)/10)
                higt = int(((height2-height)/2)+height)
                self.HeartCol[i] = [dif*i, higt]
        def New(self):
            print "Starting"
            self.health = self.startinghealth
            self.x = (width-self.ix)/2
            self.y = (height-self.iy)/2
            self.DA = "Alive"
            print Alive
        def Hit(self, damage=1):
            self.health -= damage
            if self.health <= 0:
                self.DA = "Dead"
        def GotPoint(self, amount=1):
            self.points += amount
            if self.points >= 10:
                self.points -= 10
                self.collection += 1
                self.health += 1
                if self.health >= self.maxhealth:
                    self.health = self.maxhealth
        def Move(self,mx,my):
            if mx >= width - (self.ix/2):
                mx = width - self.ix
            elif mx <= self.ix/2:
                mx = 0
            else:
                mx = mx - (self.ix/2)
            if my >= height - (self.iy/2):
                my = height - self.iy
            elif my <= self.iy/2:
                my = 0
            else:
                my = my - (self.iy/2)
            if mx > self.x:
                if mx-self.x > self.maxspeed:
                    self.x += self.maxspeed
                else:
                    self.x = mx
            if mx < self.x:
                if self.x-mx > self.maxspeed:
                    self.x -= self.maxspeed
                else:
                    self.x = mx
            if my > self.y:
                if my-self.y > self.maxspeed:
                    self.y += self.maxspeed
                else:
                    self.y = my
            if my < self.y:
                if self.y-my > self.maxspeed:
                    self.y -= self.maxspeed
                else:
                    self.y = my
        def Blit(self):
            screen.blit(self.Image, (self.x, self.y))
        def ForBlit(self):
            return self.x, self.y, self. ix, self.iy
        def Toolbar(self):
            pygame.draw.rect(screen, [127,127,127], pygame.Rect(0, height, width, height2))
            for i in range(0,10,1):
                if self.health >= 41+i:
                    screen.blit(self.Heart5, (self.HeartCol[i][0], self.HeartCol[i][1]))
                elif self.health >= 31+i:
                    screen.blit(self.Heart4, (self.HeartCol[i][0], self.HeartCol[i][1]))
                elif self.health >= 21+i:
                    screen.blit(self.Heart3, (self.HeartCol[i][0], self.HeartCol[i][1]))
                elif self.health >= 11+i:
                    screen.blit(self.Heart2, (self.HeartCol[i][0], self.HeartCol[i][1]))
                elif self.health >= 1+i:
                    screen.blit(self.Heart1, (self.HeartCol[i][0], self.HeartCol[i][1]))
                else:
                    screen.blit(self.Heart0, (self.HeartCol[i][0], self.HeartCol[i][1]))
        def DOA(self):
            return self.DA
        def New(self):
            pass
    class Background():
        def __init__(self):
            self.sr = 5
            self.bg = [0,0,0]
        def New(self):
            self.amountOfStars = random.randrange(10,51,1)
            self.stars=[]
            for i in range(self.amountOfStars):
                x = random.randrange(self.sr*2,width-(self.sr*2)+1,1)
                y = random.randrange(self.sr*2,height-(self.sr*2)+1,1)
                coulerr = random.randrange(200,256,1)
                coulerg = random.randrange(200,256,1)
                coulerb = random.randrange(0,56,1)
                size = random.randrange(5, 10, 1)
                self.stars.append([])
                self.stars[i] = [[x,y],[coulerr,coulerg,coulerb],size]
        def Blit(self):
            screen.fill(self.bg)
            for i in range(self.amountOfStars):
                self.stars.append([])
                pygame.draw.circle(screen,self.stars[i][1],self.stars[i][0],self.stars[i][2])
    
    class Text():
        def Text(self, Text, TextSize, Couler):
            self.Couler = Couler
            self.TextSize = int(TextSize)
            self.Text = str(Text)
            self.font = pygame.font.Font(None, self.TextSize)
            self.text = self.font.render(self.Text, 1, self.Couler)
            self.Size = self.text.get_rect()
            self.ctext = self.text
            self.cCouler = self.Couler
        def Position(self, X, Y):
            self.X = X
            self.Y = Y
            self.Position = self.X,self.Y
        def Blit(self):
            screen.blit(self.ctext, [self.X,self.Y])
        def IsItClicked(self, MouseX, MouseY):
            if MouseX in range(self.X,self.X+self.Size[2]+1,1) and MouseY in range(self.Y,self.Y+self.Size[3]+1,1):
                return True
            else:
                return False
        def Hover(self, MouseX=0, MouseY=0, couler=-1):
            if couler == -1:
                couler = self.Couler
            hover = self.IsItClicked(MouseX, MouseY)
            if hover == True:
                self.cCouler = couler
                self.ctext = self.font.render(self.Text, 1, self.cCouler)
            else:
                self.cCouler = self.Couler
                self.ctext = self.font.render(self.Text, 1, self.cCouler)
    
    
    class Menu():
        def __init__(self):
            self.Move = (height2/4)/2
            self.move = self.Move*2
            self.Menu = Text()
            self.Menu.Text("MoeTM's UFO Game", 50, [255,255,0])
            self.Menu.Position((width - self.Menu.Size[2])/2,self.Menu.Size[0])
            self.Play = Text()
            self.Play.Text("Play The Game!", 30, [255,255,0])
            self.Play.Position(self.Play.Size[0]+20,self.Play.Size[0]+self.Move)
            self.Shop = Text()
            self.Shop.Text("Enter the Shop, Why?", 30, [255,255,0])
            self.Shop.Position(self.Shop.Size[0]+20,self.Shop.Size[0]+self.move*2-self.Move)
            self.Saves = Text()
            self.Saves.Text("Save the game, ;P", 30, [255,255,0])
            self.Saves.Position(self.Saves.Size[0]+20,self.Saves.Size[0]+self.move*3-self.Move)
            self.Options = Text()
            self.Options.Text("Options...", 30, [255,255,0])
            self.Options.Position(self.Options.Size[0]+20,self.Options.Size[0]+self.move*4-self.Move)
    
            self.Area = "Menu"
        def Blit(self, MouseX=0, MouseY=0):
            if self.Area == "Menu":
                self.Play.Hover(MouseX, MouseY, [192,255,0])
                self.Shop.Hover(MouseX, MouseY, [192,255,0])
                self.Saves.Hover(MouseX, MouseY, [192,255,0])
                self.Options.Hover(MouseX, MouseY, [192,255,0])
                self.Play.Blit()
                self.Shop.Blit()
                self.Saves.Blit()
                self.Options.Blit()
            if self.Area == "Shop":
                pass
            if self.Area == "Saves":
                pass
            if self.Area == "Options":
                pass
            if self.Area != "Play":
                self.Menu.Hover(MouseX, MouseY, [192,255,0])
                self.Menu.Blit()
        def IsClicked(self, MouseX, MouseY):
            if self.Area == "Menu":
                play = self.Play.IsItClicked(MouseX, MouseY)
                if play == True:
                    self.Area = "Play"
                Shop = self.Shop.IsItClicked(MouseX, MouseY)
                if Shop == True:
                    self.Area = "Shop"
                Saves = self.Saves.IsItClicked(MouseX, MouseY)
                if Saves == True:
                    self.Area = "Saves"
                Options = self.Options.IsItClicked(MouseX, MouseY)
                if Options == True:
                    self.Area = "Options"
            menu = self.Menu.IsItClicked(MouseX, MouseY)
            if menu == True:
                self.Area = "Menu"
        def getArea(self):
            return self.Area
    class Game():
        def __init__(self):
            self.Player = UFO()
            self.Background = Background()
            self.Orbs = Orbs()
            self.Bullits = Bullits()
            self.Death = pygame.image.load("images\Death.png")
            self.Death = pygame.transform.scale(self.Death, (width2, height2))
            self.death = 0
        def New(self):
            while True:
                self.Player.New()
                Place = self.Player.DOA()
                if Place != "New":
                    self.TotalTime = 0
                    self.Background.New()
                    self.Bullits.Restart()
                    self.Orbs.Restart()
        def Blit(self):
            self.Bullits.Convert()
            self.Orbs.Convert()
            self.Background.Blit()
            self.Bullits.Blit()
            self.Orbs.Blit()
            self.Player.Blit()
        def Move(self, MX, MY):
            self.Player.Move(MX, MY)
            PX, PY, IX, IY = self.Player.ForBlit()
            self.Bullits.Move(PX, PY, IX, IY)
            self.Orbs.Move(PX, PY, IX, IY)
        def Updater(self, time):
            self.TotalTime += time
        def Death(self):
            if self.death >= 1: return 0
            self.death += 1
            time = float(self.TotalTime) * 10
            time = int(time)
            time /= 10.0
            time = str(time)
            self.DeadText = Text()
            text = "You died in "+time+" seconds"
            self.DeadText.Text(text,50,[0,0,0])
            self.DeadText.Position((width-self.DeadText.Size[2])/2,(height2-self.DeadText.Size[3])/2)
        def DeadBlit(self):
            screen.blit(self.Death, (0, 0))
            self.DeadText.Blit()
    class Main():
        def __init__(self):
            self.Game = Game()
            self.Menu = Menu()
            self.DA= ""
            self.seconds = 0
            self.clock = pygame.time.Clock()
            self.FPS = 0.1
            self.QUIT = False
            self.Place = ["","New"]
            self.difficalty1 = 10
            self.difficalty2 = 5
        def Main(self):
            while True:
                for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            self.QUIT = True
                        if event.type == KEYDOWN:
                            if event.key == K_p:
                                time = strftime("%a, %d %b %Y %H:%M:%S", gmtime())
                                pygame.image.save(screen, time+".png")
                            #if event.key == K_DOWN:
    
                            #if event.key == K_UP:
                        if event.type == MOUSEBUTTONDOWN:
                            self.Menu.IsClicked(MouseX, MouseY)
                if self.QUIT == True:
                        pygame.quit()
                        break
                self.seconds += self.clock.tick()/1000.0
                if self.seconds >= self.FPS:
                    MouseX,MouseY = pygame.mouse.get_pos()
                    self.Place[0] = self.Menu.getArea()
                    if self.Place[0] == "Play" and self.Place[1] == "New":
                        self.Game.New()
                    screen.fill([0,0,0])
                    if self.Place[0] != "Play":
                        self.Menu.Blit(MouseX, MouseY)
                    if self.Place[0] == "Play":
                        if self.Place[1] != "Dead":
                            self.Game.Move(MouseX,MouseY)
                            self.Game.Updater(self.seconds)
    
                            randomChance = random.randrange(0,self.difficalty1,1)
                            if randomChance in range(0, self.difficalty2, 1):
                                self.Game.Orbs.New(self.FPS)
                            randomChance = random.randrange(0,self.difficalty1,1)
                            if randomChance in range(0, self.difficalty2, 1):
                                self.Game.Bullits.New(self.FPS)
    
                        self.Game.Blit()
                        self.Place[1] = self.Game.Player.DOA()
                        if self.Place[1] == "Dead":
                            self.Game.Death()
                            self.Game.DeadBlit()
                    pygame.display.flip()
                    self.seconds -= self.FPS
    
    
    Play = Main()
    Play.Main()
    pygame.quit()
    

    这里有两位已破坏的代码。 (我把课程放在了def的位置,所以你知道那里有什么课程)

    class UFO():
        def New(self):
            print "Starting"
            self.health = self.startinghealth
            self.x = (width-self.ix)/2
            self.y = (height-self.iy)/2
            self.DA = "Alive"
            print Alive
    class Game():
        def New(self):
            while True:
                self.Player.New()
                Place = self.Player.DOA()
                if Place != "New":
                    self.TotalTime = 0
                    self.Background.New()
                    self.Bullits.Restart()
                    self.Orbs.Restart()
    

    如果您使用IDLE中的代码,那么您将知道它甚至会调用self.Player.New(),因为Shell不会打印“Starting”或者给我一个错误,让print Alive,它只是连续循环while循环。

    对不起英里的代码,:(但希望它会有所帮助,主要是因为没有它的一部分你就会理解它。也谢谢你花时间阅读并尝试回答这个问题。并且抱歉所有的语法和剥落错误,我无法拼写。

1 个答案:

答案 0 :(得分:1)

你的问题是你的Game.New方法中的真实,我也发现了其他让游戏无法运行的问题。

下面是带有固定代码的差异:

--- ../A Problem-1/Game.pyw 2012-01-25 13:32:00.000000000 -0300
+++ Game.pyw    2012-01-25 11:55:56.000000000 -0300
@@ -11,6 +11,9 @@
 pygame.display.set_caption("MoeTM's UFO Game")

 class FlyingObject():
+    def __init__(self):
+        self.amount = 0
+        self.array = []
     def Restart(self):
         self.amount = 0
         self.array = []
@@ -233,6 +236,7 @@
     def __init__(self):
         self.sr = 5
         self.bg = [0,0,0]
+        self.amountOfStars = 0
     def New(self):
         self.amountOfStars = random.randrange(10,51,1)
         self.stars=[]
@@ -352,15 +356,15 @@
         self.Death = pygame.image.load("images\Death.png")
         self.Death = pygame.transform.scale(self.Death, (width2, height2))
         self.death = 0
+        self.TotalTime = 0
     def New(self):
-        while True:
-            self.Player.New()
-            Place = self.Player.DOA()
-            if Place != "New":
-                self.TotalTime = 0
-                self.Background.New()
-                self.Bullits.Restart()
-                self.Orbs.Restart()
+        self.Player.New()
+        Place = self.Player.DOA()
+        if Place != "New":
+            self.TotalTime = 0
+            self.Background.New()
+            self.Bullits.Restart()
+            self.Orbs.Restart()
     def Blit(self):
         self.Bullits.Convert()
         self.Orbs.Convert()