__init __()需要3个参数(给定1个)?

时间:2014-05-29 20:24:55

标签: python arguments init

它要求3个参数,我已经给了它一个。我如何再给它2个,你能解释一下如何做到这一点吗?感谢

import pygame, random, collisionObjects
pygame.init()

screen = pygame.display.set_mode((640,480))

class Pirate(pygame.sprite.Sprite):

    EAST = 0

    def __init__(self, screen, dx):
        self.screen = screen
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("king_pirate/running e0000.bmp")
        self.image = self.image.convert()
        tranColor = self.image.get_at((1, 1))
        self.image.set_colorkey(tranColor)
        self.rect = self.image.get_rect()
        self.rect.inflate_ip(-50, -30)
        self.rect.center = (0, random.randrange(30,450))
        self.img = []

        self.loadPics()
        self.frame = 0
        self.delay = 4
        self.pause = self.delay
        self.dx = dx


    def update(self):
        #set delay
        self.pause -= 1
        if self.pause <= 0:
            self.pause = self.delay

            self.frame += 1
            if self.frame > 7:
                self.frame = 0

            self.image = self.img[self.frame]

            self.rect.centerx += self.dx
            if self.rect.centerx > self.screen.get_width():
                self.rect.centerx = 0
                self.rect.centery = random.randrange(30,450)

    #load pictures
    def loadPics(self):
        for i in range(8):
            imgName = "king_pirate/running e000%d.bmp" % i
            tmpImg = pygame.image.load(imgName)
            tmpImg.convert()
            tranColor = tmpImg.get_at((0, 0))
            tmpImg.set_colorkey(tranColor)
            self.img.append(tmpImg)

class Pirate2(pygame.sprite.Sprite):

    WEST = 0

    def __init__(self, screen, dx):
        self.screen = screen
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("pirate/running w0000.bmp")
        self.image = self.image.convert()
        tranColor = self.image.get_at((1, 1))
        self.image.set_colorkey(tranColor)
        self.rect = self.image.get_rect()
        self.rect.inflate_ip(-50, -30)
        self.rect.center = (640, random.randrange(20,460))
        self.img = []

        self.loadPics()
        self.frame = 0
        self.delay = 4
        self.pause = self.delay
        self.dx = dx       


    def update(self):
        #set delay
        self.pause -= 1
        if self.pause <= 0:
            self.pause = self.delay

            self.frame += 1
            if self.frame > 7:
                self.frame = 0

            self.image = self.img[self.frame]

            self.rect.centerx -= self.dx
            if self.rect.centerx < 0:
                self.rect.centerx = self.screen.get_width()
                self.rect.centery = random.randrange(20,460)

    #load pictures
    def loadPics(self):
        for i in range(8):
            imgName = "pirate/running w000%d.bmp" % i
            tmpImg = pygame.image.load(imgName)
            tmpImg.convert()
            tranColor = tmpImg.get_at((0, 0))
            tmpImg.set_colorkey(tranColor)
            self.img.append(tmpImg)

#set up class for gold object,
class Gold(pygame.sprite.Sprite):          
    def __init__(self, screen, imageFile):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(imageFile)
        self.image = self.image.convert()
        self.rect = self.image.get_rect()
        self.rect.centerx = random.randrange(0, screen.get_width())
        self.rect.centery = random.randrange(0, screen.get_height())

#main character class
class Thief(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("thief2.gif")
        self.image = self.image.convert()
        tranColor = self.image.get_at((1, 1))
        self.image.set_colorkey(tranColor)
        self.rect = self.image.get_rect()
        self.rect.inflate_ip(-15, -10)
        self.rect.center = (30, (screen.get_height()-40))
        self.dx = 30
        self.dy = 30

        if not pygame.mixer:
            print("problem with sound")
        else:
            pygame.mixer.init()
            self.collectcoin = pygame.mixer.Sound("collectcoin.wav")
            self.hit = pygame.mixer.Sound("hit.ogg")


    def update(self):
        if self.rect.bottom > screen.get_height():
            self.rect.centery = (screen.get_height()-40)         
        elif self.rect.top < 0:
            self.rect.centery = 40
        elif self.rect.right > screen.get_width():
            self.rect.centerx = (screen.get_width()-30)         
        elif self.rect.left < 0:
            self.rect.centerx = 30

    #define movements
    def moveUp(self):
        self.rect.centery -= self.dy

    def moveDown(self):
        self.rect.centery += self.dy

    def moveLeft(self):
        self.rect.centerx -= self.dx

    def moveRight(self):
        self.rect.centerx += self.dx

    def reset(self):
        self.rect.center = (30, (screen.get_height()-40))

#set up a scoreboard        
class Scoreboard(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.lives = 0
        self.score = 0
        self.font = pygame.font.SysFont("None", 40)
        self.number = 0

    #with a self updating label
    def update(self):
        self.text = "Damage: %d %%  Gold Taken: %d" % (self.lives, self.score)
        self.image = self.font.render(self.text, 1, (199,237,241))
        self.rect = self.image.get_rect()

#define the game function
def game():
    #set up background
    background = pygame.Surface(screen.get_size())
    background = pygame.image.load("sand.jpg")
    background = pygame.transform.scale(background, screen.get_size())
    screen.blit(background, (0, 0))

    #initialize pirates & scoreboard sprites
    pirate = Pirate()
    scoreboard = Scoreboard()

    #create two arrays for multiple gold object occurances
    #two arrays are used for better distribution on screen
    gold1 = []
    numberofGold = 16
    for i in range(numberofgolds):
        oneGold = golds(screen,"gold1.png")
        golds1.append(onegold)
    for gold in golds1:
        gold.rect.centerx = random.randrange(20,620)
        gold.rect.centery = random.randrange(20,240)
        gold.rect.inflate_ip(-5, -5)
    gold2 = []
    for i in range(numberofgolds):
        onegold = golds(screen,"gold1.png")
        golds2.append(onegold)
    for gold in golds2:
        gold.rect.centerx = random.randrange(20,620)
        gold.rect.centery = random.randrange(250,460)
        gold.rect.inflate_ip(-5, -5)
    totalgolds = ((len(golds1)-1)+(len(golds2)-1))
    #initialize gold sprites
    goldSprites = pygame.sprite.Group(golds1, 
    #initialize pirate sprites & instances
    pirate1 = pirate1(screen,13)
    pirate2 = pirate2(screen,13)
    pirate3 = pirate1(screen,11)
    pirate4 = pirate2(screen,11)
    pirate5 = pirate1(screen,13)
    pirateSprites = pygame.sprite.Group(pirate1, pirate2, pirate3, pirate4, pirate5)

    #use ordered updates to keep clean appearance
    allSprites =  pygame.sprite.OrderedUpdates(goldSprites, thief, pirateSprites, scoreboard)

    #set up clock & loop
    clock = pygame.time.Clock()
    keepGoing = True
    while keepGoing:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepGoing = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    thief.moveUp()
                elif event.key == pygame.K_DOWN:
                    thief.moveDown()
                elif event.key == pygame.K_LEFT:
                    thief.moveLeft()
                elif event.key == pygame.K_RIGHT:
                    thief.moveRight()
                elif event.key == pygame.K_ESCAPE:
                    keepGoing = False

        #check collisions here
        hitpirates = pygame.sprite.spritecollide(thief, pirateSprites, False)
        hitgold = pygame.sprite.spritecollide(thief, goldSprites, True)

        if hitpirates:
            thief.hit.play()
            scoreboard.lives += 1
            if scoreboard.lives >= 100:
                keepGoing = False
                number = 0


        if hitgolds:
            thief.collectcoin.play()
            scoreboard.score += 1
            totalgolds -= 1
            if totalgolds <= 0:
                keepGoing = False
                number = 1


        #draw sprites
        allSprites.clear(screen, background)
        allSprites.update()
        allSprites.draw(screen)

        pygame.display.flip()

    return scoreboard.score
    return scoreboard.number

def instructions(score, number):
    pygame.display.set_caption("Hunt for Gold!")

    background = pygame.Surface(screen.get_size())
    background = pygame.image.load("sand.jpg")
    background = pygame.transform.scale(background, screen.get_size())
    screen.blit(background, (0, 0))
    if number == 0:
        message = "Sorry try again..."
    elif number == 1:
        message = "The theif escapes!"
    else:
        message = "Onto the hunt for gold!"

    insFont = pygame.font.SysFont("Calibri", 25)
    insLabels = []
    instructions = (
        "Last score: %d" % score ,
        "%s" % message,
        "",
        "GOLD!",
        "Get all the gold before you are "
        "obliterated!",
        "Use arrow keys to move the thief.",
        "Space to start, Esc to quit."
        )

    for line in instructions:
        tempLabel = insFont.render(line, 1 , (0,0,0))
        insLabels.append(tempLabel)

    #set up homescreen loop
    keepGoing = True
    clock = pygame.time.Clock()
    while keepGoing:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepGoing = False
                donePlaying = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    keepGoing = False
                    donePlaying = False
                if event.key == pygame.K_ESCAPE:
                    keepGoing = False
                    donePlaying = True

        for i in range(len(insLabels)):
            screen.blit(insLabels[i], (50, 30*i))

        pygame.display.flip()

    return donePlaying

#define main function
def main():
    donePlaying = False
    score = 0
    message = ""
    while not donePlaying:
        donePlaying = instructions(score, message)
        if not donePlaying:
            score = game()
        else:
            pygame.quit()


if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:1)

看一下你的代码,这一行:

pirate = Pirate()

您的Pirate课程需要selfscreendx。您只能隐式提供self

我只能猜测你想要什么,特别是因为我不知道dx对于你的游戏应该是什么意思,但这可能至少可以避免错误:

pirate = Pirate(pygame.display.get_surface(), 60)