如何在一个函数中获取变量以交叉到另一个函数

时间:2015-04-07 01:21:51

标签: python python-2.7 pygame

def StartScreen():

    import pygame

    pygame.init()

    white = 230,230,230
    blue = 0,0,200
    water = 0,255,255
    red = 255,0,0

    WaterLevel = 400
    Depth = 150

    Move = True

    Location = 825

    TextTop = 350

    rise = True
    TextSink = False

    score = 0

    CLOCK = pygame.time.Clock()
    FPS = 60

    gameDisplay = pygame.display.set_mode((272,552))
    pygame.display.set_caption('Boat Game')

    BoatFloat = pygame.image.load("BoatFloatCut.png").convert_alpha()
    BoatFloat = pygame.transform.scale(BoatFloat, (220,50))

    boat = pygame.image.load("BoatLogoCut.png").convert_alpha()
    boat = pygame.transform.scale(boat, (140,100))

    stop = False

    while not stop:

###### Screen Setup ##############################################

        gameDisplay.fill(white)

###### Rising Water ##############################################

        pygame.draw.rect(gameDisplay,water,(0,WaterLevel,272,Depth))

###### Button ####################################################

        pygame.draw.rect(gameDisplay,water,(55,Location-10,160,120),2)

###### Score #####################################################

        ScoreFont = pygame.font.SysFont("monospace", 25)

        ScoreText = ScoreFont.render(str(score), 5, (red))
        gameDisplay.blit(ScoreText, (20, 30))

###### Text ######################################################

        gameDisplay.blit(BoatFloat, (35,TextTop))

###### Movement ##################################################
        if rise:
            TextTop -= 5

        WaterLevel -= 5
        Depth += 5

        if TextTop == 0:
            rise = False

        if rise == False:
            TextSink = True

        if TextSink == True:
            TextTop += 2            


###### Float Down ################################################

        gameDisplay.blit(boat,(60,Location))

        if Move: 
            Location -= 5

        if Location == 275:
            Move = False

###### Start Check 3##############################################

        for event in pygame.event.get():

            if event.type == pygame.MOUSEBUTTONDOWN:
                is_inside = pygame.Rect(55,Location-10,160,120).collidepoint(pygame.mouse.get_pos())

                if is_inside == 1:
                    MainGame()

            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        CLOCK.tick(FPS)

        pygame.display.update()


def MainGame():

    import pygame
    import random
    import time

    pygame.init()

    blue = 0,255,255
    red = 255,0,0
    white = 255,255,255

    Location = 136
    Level = 382

    gate = 100

    gate2 = 100

    space1 = -30
    space1 = -30

    space2 = space1 - 200
    space2 = space1 -200

    WaterLevel = 402

    score = 0

    space1speed = 1
    space2speed = 1

    Left_Rect = pygame.Rect(0,402,185,150)
    Right_Rect = pygame.Rect(137,402,185,150)

    CLOCK = pygame.time.Clock()
    FPS = 80

    gate = random.randrange(20,222)
    gate2 = random.randrange(20,222)

    gameDisplay = pygame.display.set_mode((272,552))
    pygame.display.set_caption('Boat Game')

    boat = pygame.image.load("FinalBoat.png").convert_alpha()
    boat = pygame.transform.scale(boat, (40,25))

    stop = False
    sink = False
    gameOver = False

    is_Left = False
    is_Right = False

    while not stop:

####### Background ###############################################

        gameDisplay.fill(white)

###### Score #####################################################

        ScoreFont = pygame.font.SysFont("monospace", 25)

        ScoreText = ScoreFont.render(str(score), 5, (blue))
        gameDisplay.blit(ScoreText, (20, 30))

        score += 1

####### Barriers One  ############################################

        pygame.draw.line(gameDisplay,white,(gate,space1),(gate + 60,space1),2)

        pygame.draw.rect(gameDisplay,red,(0,space1,gate,25))

        pygame.draw.rect(gameDisplay,red,(gate + 60,space1,272 - gate + 60,25))

        space1 += space1speed

        if space1 == 402:
            space1 = -30
            gate = random.randrange(20,222)

###### Barriers two ##############################################

        pygame.draw.line(gameDisplay,white,(gate2,space2),(gate2 + 60,space2),2)

        pygame.draw.rect(gameDisplay,red,(0,space2,gate2,25))

        pygame.draw.rect(gameDisplay,red,(gate2 + 60,space2,272 - gate2 + 60,25))

        space2 += space2speed

        if space2 == 402:
            space2 = space1 - 200
            gate2 = random.randrange(20,222)

####### Controles ################################################

        pygame.draw.rect(gameDisplay, red, Left_Rect)

        pygame.draw.rect(gameDisplay, red, Right_Rect)

####### Boat #####################################################

        gameDisplay.blit(boat, (Location, Level))
        ####### Barrier 1 Effects ################################

        if space1 == Level - 25 and gate >= Location:
            sink = True

        if space1 == Level - 25 and gate + 50 <= Location + 25:
            sink = True

        if sink == True:
            Level += 1

        if Level == 402:
            stop = True

        ####### Barrier 2 Effects ################################
        if space2 == Level - 25 and gate2 >= Location:
            sink = True

        if space2 == Level - 25 and gate2 + 50 <= Location + 25:
            sink = True

        if sink == True:
            Level += 1

        if Level == 402:
            stop = True


####### Water #####################################################

        pygame.draw.rect(gameDisplay,blue,(0,WaterLevel,272,150))

####### Movement ##################################################


        for event in pygame.event.get():

            if event.type == pygame.MOUSEBUTTONDOWN:
                is_Left = Left_Rect.collidepoint(pygame.mouse.get_pos())
                is_Right = Right_Rect.collidepoint(pygame.mouse.get_pos())

            if event.type == pygame.MOUSEBUTTONUP:
                is_Left = False
                is_Right = False

            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        if is_Left:
            Location -= 5

        elif is_Right:
            Location += 5

        CLOCK.tick(FPS)

        pygame.display.update()

StartScreen()

&#39;得分&#39;是我想要越过的变量。当MainGame()运行时,得分+ 1每秒发生80次。比赛结束后,我想将比分改为StartScreen()。基本上我希望看​​到球员在开场画面上得分。

4 个答案:

答案 0 :(得分:2)

您必须在任何方法定义之外初始化变量得分。要访问变量并对其进行编辑,请使用关键字global。这告诉python您要访问的变量不是函数的本地范围。请阅读此处以获取有关正确使用全局变量的更多信息。 Using global variables in a function other than the one that created them

以下是使用代码的示例

import pygame
import random
import time
score = 0
def StartScreen():
    global score

    pygame.init()

    white = 230,230,230
    blue = 0,0,200
    water = 0,255,255
    red = 255,0,0

    WaterLevel = 400
    Depth = 150

    Move = True

    Location = 825

    TextTop = 350

    rise = True
    TextSink = False

    CLOCK = pygame.time.Clock()
    FPS = 60

    gameDisplay = pygame.display.set_mode((272,552))
    pygame.display.set_caption('Boat Game')

    BoatFloat = pygame.image.load("BoatFloatCut.png").convert_alpha()
    BoatFloat = pygame.transform.scale(BoatFloat, (220,50))

    boat = pygame.image.load("BoatLogoCut.png").convert_alpha()
    boat = pygame.transform.scale(boat, (140,100))

    stop = False

    while not stop:

###### Screen Setup ##############################################

        gameDisplay.fill(white)

###### Rising Water ##############################################

        pygame.draw.rect(gameDisplay,water,(0,WaterLevel,272,Depth))

###### Button ####################################################

        pygame.draw.rect(gameDisplay,water,(55,Location-10,160,120),2)

###### Score #####################################################

        ScoreFont = pygame.font.SysFont("monospace", 25)

        ScoreText = ScoreFont.render(str(score), 5, (red))
        gameDisplay.blit(ScoreText, (20, 30))

###### Text ######################################################

        gameDisplay.blit(BoatFloat, (35,TextTop))

###### Movement ##################################################
        if rise:
            TextTop -= 5

        WaterLevel -= 5
        Depth += 5

        if TextTop == 0:
            rise = False

        if rise == False:
            TextSink = True

        if TextSink == True:
            TextTop += 2            


###### Float Down ################################################

        gameDisplay.blit(boat,(60,Location))

        if Move: 
            Location -= 5

        if Location == 275:
            Move = False

###### Start Check 3##############################################

        for event in pygame.event.get():

            if event.type == pygame.MOUSEBUTTONDOWN:
                is_inside = pygame.Rect(55,Location-10,160,120).collidepoint(pygame.mouse.get_pos())

                if is_inside == 1:
                    MainGame()

            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        CLOCK.tick(FPS)

        pygame.display.update()


def MainGame():
    global score

    pygame.init()

    blue = 0,255,255
    red = 255,0,0
    white = 255,255,255

    Location = 136
    Level = 382

    gate = 100

    gate2 = 100

    space1 = -30
    space1 = -30

    space2 = space1 - 200
    space2 = space1 -200

    WaterLevel = 402

    space1speed = 1
    space2speed = 1

    Left_Rect = pygame.Rect(0,402,185,150)
    Right_Rect = pygame.Rect(137,402,185,150)

    CLOCK = pygame.time.Clock()
    FPS = 80

    gate = random.randrange(20,222)
    gate2 = random.randrange(20,222)

    gameDisplay = pygame.display.set_mode((272,552))
    pygame.display.set_caption('Boat Game')

    boat = pygame.image.load("FinalBoat.png").convert_alpha()
    boat = pygame.transform.scale(boat, (40,25))

    stop = False
    sink = False
    gameOver = False

    is_Left = False
    is_Right = False

    while not stop:

####### Background ###############################################

        gameDisplay.fill(white)

###### Score #####################################################

        ScoreFont = pygame.font.SysFont("monospace", 25)

        ScoreText = ScoreFont.render(str(score), 5, (blue))
        gameDisplay.blit(ScoreText, (20, 30))

        score += 1

####### Barriers One  ############################################

        pygame.draw.line(gameDisplay,white,(gate,space1),(gate + 60,space1),2)

        pygame.draw.rect(gameDisplay,red,(0,space1,gate,25))

        pygame.draw.rect(gameDisplay,red,(gate + 60,space1,272 - gate + 60,25))

        space1 += space1speed

        if space1 == 402:
            space1 = -30
            gate = random.randrange(20,222)

###### Barriers two ##############################################

        pygame.draw.line(gameDisplay,white,(gate2,space2),(gate2 + 60,space2),2)

        pygame.draw.rect(gameDisplay,red,(0,space2,gate2,25))

        pygame.draw.rect(gameDisplay,red,(gate2 + 60,space2,272 - gate2 + 60,25))

        space2 += space2speed

        if space2 == 402:
            space2 = space1 - 200
            gate2 = random.randrange(20,222)

####### Controles ################################################

        pygame.draw.rect(gameDisplay, red, Left_Rect)

        pygame.draw.rect(gameDisplay, red, Right_Rect)

####### Boat #####################################################

        gameDisplay.blit(boat, (Location, Level))
        ####### Barrier 1 Effects ################################

        if space1 == Level - 25 and gate >= Location:
            sink = True

        if space1 == Level - 25 and gate + 50 <= Location + 25:
            sink = True

        if sink == True:
            Level += 1

        if Level == 402:
            stop = True

        ####### Barrier 2 Effects ################################
        if space2 == Level - 25 and gate2 >= Location:
            sink = True

        if space2 == Level - 25 and gate2 + 50 <= Location + 25:
            sink = True

        if sink == True:
            Level += 1

        if Level == 402:
            stop = True


####### Water #####################################################

        pygame.draw.rect(gameDisplay,blue,(0,WaterLevel,272,150))

####### Movement ##################################################


        for event in pygame.event.get():

            if event.type == pygame.MOUSEBUTTONDOWN:
                is_Left = Left_Rect.collidepoint(pygame.mouse.get_pos())
                is_Right = Right_Rect.collidepoint(pygame.mouse.get_pos())

            if event.type == pygame.MOUSEBUTTONUP:
                is_Left = False
                is_Right = False

            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        if is_Left:
            Location -= 5

        elif is_Right:
            Location += 5

        CLOCK.tick(FPS)

        pygame.display.update()

StartScreen()

我不确定我是否抓住了所有分数的实例,但是如果我这样做了,那应该可行。得分定义在代码的顶部。在你的两种方法中,我在顶部键入全局分数。这让函数知道在其范围之外寻找变量得分。此外,导入应放在文件的顶部。无需始终导入相同的模块。

答案 1 :(得分:1)

使用全局变量将起作用。另一种方法是将分数传递给所有改变分数的函数并返回(至少)分数。

def some_func (score, otherstuff):
    # do something with the inputs.
    score += 1
    return score, otherstuff.

答案 2 :(得分:0)

您可以做的是将变量完全放在函数之外,而不是将其保留在函数内部。这样,您拥有的所有功能都可以识别它。但是,如果您要从其他功能编辑score,只需将单词global score放在顶部,即表示您要编辑score的全球版本。< / p>

答案 3 :(得分:0)

管理分数的另一种方法是为您的游戏创建一个类,如果让所有改变分数的函数成为该类的成员是合理的。这可能是一个好的设计或一个糟糕的设计。如果采用这种方法,__init__函数应将self.score初始化为零。改变分数的函数应该只更新self-score的值。