2

我正在尝试使用 Pygame 和 Python 创建一个 Guess The Flag 小游戏,但是我创建的一些 for 循环和函数存在问题。我对 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:将脚本的“列表和随机播放”部分放在函数之外,在屏幕顶部。1 的错误:它不知道列表中的函数是什么(还)。

2:将脚本的“list and shuffle”部分放在函数之外,在国家函数之后,但在实际之前pick_country()。2的错误:一开始它选择了国家,但它显然永远不会去另一个。

有什么帮助吗?请!

4

2 回答 2

4

这是发生了什么:

  • pick_country来电france1()
  • 当用户按下一个键时,pick_country()再次调用。这个新的呼叫将从您的国家列表的第一个条目开始,france1()再次呼叫。
  • 当用户按下一个键时,pick_country()再次调用。
  • 无限重复

您可能想要的是在return按下某个键时从每个国家/地区的功能中获取。这将使您回到原来的pick_country呼叫,使其可以移动到列表中的第二个国家。

于 2013-08-09T01:37:37.023 回答
1

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

if event.type == KEYDOWN:
    pick_country()

因此,当您再次运行此函数时,国家/地区的 for 循环将重新开始。

于 2013-08-09T01:39:02.753 回答