2012-01-25 32 views
2

当我在python 2.7和pygame中编写一个基本的UFO游戏时,我遇到了一个错误,但它没有出现在CONSOL中。发生了什么是:在Python中损坏的调用函数

  1. 我编程
  2. 再一看代码
  3. 菜单屏幕工作正常了一点变化,我去玩游戏
  4. 然后不断重新启动。
  5. 我编辑了几个比特的代码,所以它会在while循环中,直到它会正确调用一个命令。
  6. 而且它仍然会称呼命令。

如果你想有,你可以下载他们的形象,这里的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() 

这里是有破产的代码的两位。 (我把类abouve的高清的,所以你知道有什么类)

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的代码,那么你会知道它dousent甚至称self.Player.New(),因为壳牌dousn打印“开始”或给我一个错误让我打印活着,它只是连续循环while循环。

对不起,万里无云的代码,:(但希望它有帮助,主要是因为没有一些它你明白它,也谢谢你花时间阅读并尝试回答这个问题,对不起,所有的语法和剥落的错误,我不会拼写。

回答

1

你的问题是当你Game.New方法不错,我也有发现,使游戏无法运行等问题。

下面是用的DIFF固定代码:

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

你好Lucaus S,谢谢你的回复对我的问题。它已经修复了它(部分地)通过让我能够玩游戏,但是命令self.Player.New()仍然被破坏,while循环会告诉你,即使你(尝试)称它为数千次它不会工作。由于它不会改变“DA”(self.DA(如果你在类UFO中调用它)或self.Player.DA(在类Game中))游戏仍然被破坏,因为它不再显示你的健康。它也使它不会死亡。另外你不得不在其他事情中添加如果self.Player.New() 工作。谢谢。 –

+0

对不起所有人,当我在卢卡斯S.给了我一些错误后的文件。我注意到我有两个New()函数,一个带有信息,另一个带有通过。抱歉给你带来不便。 –