Python For Looping and Function Problems in a Guess The Flag Game

81 阅读2分钟

1.一位游戏开发爱好者在使用 Python 和 Pygame 制作一个简单的“猜国旗”游戏时遇到了问题。他希望在游戏中使用四种不同的国旗,分别代表中国、加拿大、美国和法国。为此,他定义了四个独立的函数来显示每种国旗及其相关信息,并将这些函数放在一个列表中。然后,他使用 random 模块对列表进行随机排序,并使用 for 循环来依次显示国旗。

但是,当他运行游戏时,他发现国旗的显示存在重复,而且游戏似乎永远不会结束。经过一些调试,他发现问题在于他使用了不恰当的循环和函数调用方式。

2、解决方案

问题原因:

在 for 循环中,当键盘按下时,调用 pick_country() 函数。这导致游戏重复显示第一种国旗,因为在每次循环中,循环都会从列表的第一个元素开始,这意味着它总是会调用 france1() 函数。

解决方案:

为了解决这个问题,需要修改每个函数中的代码,使其在键盘按下时返回,而不是调用 pick_country() 函数。这样,当键盘按下时,游戏将回到 pick_country() 函数,并继续显示列表中的下一种国旗。

修改后的代码如下:

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:
                return
        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":
            return
        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:
                return
        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:
                return
        screen.blit(flag1, (300, 350))
        pygame.display.update()


pick_country()

修改后,游戏将在键盘按下时正确地显示下一种国旗,并且不会出现重复显示的情况。