Skip to main content
 首页 » 编程设计

python之Python 中损坏的调用函数

2025年05月04日7kenshinobiy

当我在 python 2.7 和 pygame 中编写一个基本的 UFO 游戏时,我遇到了一个错误,但是它没有出现在控制台中。发生的事情是:

  1. 我在编程
  2. 对代码做了一点改动
  3. 菜单屏幕运行良好,我去玩游戏了
  4. 然后它会不断重启。
  5. 我编辑了更多的代码,使其处于 while 循环中,直到它正确调用命令。
  6. 它仍然不会调用命令。

如果你想要图片,你可以在这里下载它们和源代码: 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 循环。

对于代码的英里,:( 但希望它有所帮助,主要是因为如果没有其中的一些你将无法理解它。也感谢您花时间阅读并尝试回答这个问题。对于所有的语法和剥落,我们深表歉意错误,我不会拼写。

请您参考如下方法:

您的问题是您的 Game.New 方法中的 While True,我还发现了导致游戏无法运行的其他问题。

下面是固定代码的差异:

--- ../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()