用于循环的Python,函数问题

时间:2013-08-09 01:23:39

标签: python function pygame

我正在尝试使用Pygame和Python创建一个小的Guess The Flag游戏,但是有些问题出现了循环和我创建的函数。我对Python比较陌生,有时候我很困惑。

无论如何,我正处于游戏的测试部分,我有四个国家:中国,加拿大,美国和法国。我已经将它们放入单独定义的函数中,将它们放在一个列表中并使用随机模块来重新排列列表。我把它放在for循环中,我试图让它得到理想的工作。

它正确地混洗列表并选择函数,但是有相同函数的重复并且它永远不会结束。

这是我的代码:

def pick_country():
    global list1
    main_font = "brain flower euro.ttf"
    font1 = pygame.font.Font((main_font), 50)
    font2 = pygame.font.Font((main_font), 40)
    list1 = [france1, canada1, china1, usa1]
    random.shuffle(list1)
    for cur_country in list1:
        cur_country()
    pygame.display.update()

def france1():
    screen.fill((255, 255, 255))
    country = 'FRANCE'
    flag = 'france_flag.jpeg'
    flag1 = pygame.image.load(flag).convert()
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                pick_country()
        screen.blit(flag1, (300, 350))
        pygame.display.update()
def canada1():
    name = ""
    main_font = "brain flower euro.ttf"
    font1 = pygame.font.Font((main_font), 50)
    country = 'CANADA'
    flag = 'canada_flag.jpeg'
    black = 0, 0, 0
    flag1 = pygame.image.load(flag).convert()
    while True:
        for evt in pygame.event.get():
            if evt.type == KEYDOWN:
                if evt.unicode.isalpha():
                    name += evt.unicode
                elif evt.key == K_SPACE:
                    name += " "
                elif evt.key == K_BACKSPACE:
                    name = name[:-1]
            elif evt.type == QUIT:
                pygame.quit()
                sys.exit()
        screen.fill((255, 255, 255))
        screen.blit(flag1, (200, 25))
        pygame.draw.line(screen, black, (200, 115), (0, 115), (6))
        pygame.draw.line(screen, black, (600, 115), (800, 115), (6))
        block = font1.render(name, True, black)
        rect = block.get_rect(center = (400, 600))
        screen.blit(block, rect)
        pygame.draw.rect(screen, black, (275, 550, 250, 100), (2))
        if name == "canada":
            pick_country()
        pygame.display.update()
def usa1():
    screen.fill((255, 255, 255))
    country =  'USA'
    flag = 'usa_flag.jpeg'
    flag1 = pygame.image.load(flag).convert()
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                pick_country()
        screen.blit(flag1, (225, 300))
        pygame.display.update()
def china1():
    screen.fill((255, 255, 255))
    country = 'CHINA'
    flag = 'china_flag.jpeg'
    flag1 = pygame.image.load(flag).convert()
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                pick_country()
        screen.blit(flag1, (300, 350))
        pygame.display.update()


pick_country()

不要问加拿大;这是我的主要国家测试区。

在开始“你尝试过什么”之前,我尝试了以下内容:

1:将脚本的'list and shuffle'部分放在屏幕顶部的函数外面。 1的错误:它不知道列表中的功能是什么。

2:在国家运行之后,在实际的pick_country()之前,将脚本的“列表和随机播放”部分放在函数之外。 2的错误:它首先选择了国家,但显然从未进入另一个国家。

有任何帮助吗?请!

2 个答案:

答案 0 :(得分:4)

这是发生了什么:

  • pick_country来电france1()
  • 当用户点击某个键时,会再次调用pick_country()。此新来电将在您的国家/地区列表的第一个条目开始,再次致电france1()
  • 当用户点击某个键时,再次拨打pick_country()
  • 无限重复广告

当按下某个键时,您可能需要来自每个国家/地区功能的return。这会将您带回原来的pick_country电话,允许它移至列表中的第二个国家/地区。

答案 1 :(得分:1)

在每个函数中,您再次调用pick_country()

if event.type == KEYDOWN:
    pick_country()

因此,当您再次运行此功能时,遍历各国的for循环将重新开始。