Python 为什么我的代码不能在列表之间来回切换?

Python 为什么我的代码不能在列表之间来回切换?,python,list,if-statement,methods,pygame,Python,List,If Statement,Methods,Pygame,我在游戏中有两个列表,我想在我的方法中切换 我正在做一个游戏,在某一点上,如果一个盒子坏了,屏幕上会打印出一种颜色——这些颜色以特定的顺序显示,并且在列表中。有3个级别:A、B和C。我设置了这个级别,以便在玩家的健康达到某一点时,级别切换为1。我希望列表在每次新关卡开始时切换。所以如果A层从A层开始,我希望B层切换到B层,C层切换回A层 我不知道为什么我的代码不起作用。我有if语句,这取决于玩家的健康状况,但切换没有发生 在这种情况下,代码框被“碎片”打破。BoxA和BoxB是列表。我认为会发生

我在游戏中有两个列表,我想在我的方法中切换

我正在做一个游戏,在某一点上,如果一个盒子坏了,屏幕上会打印出一种颜色——这些颜色以特定的顺序显示,并且在列表中。有3个级别:A、B和C。我设置了这个级别,以便在玩家的健康达到某一点时,级别切换为1。我希望列表在每次新关卡开始时切换。所以如果A层从A层开始,我希望B层切换到B层,C层切换回A层

我不知道为什么我的代码不起作用。我有if语句,这取决于玩家的健康状况,但切换没有发生

在这种情况下,代码框被“碎片”打破。BoxA和BoxB是列表。我认为会发生的是,当球员的健康低于20时,将使用BoxA。当玩家的健康状况高于20时,应使用方框B。当健康度超过40时,应再次使用BoxA

    hits = pg.sprite.groupcollide(self.boxs, self.shards, False, True)
    hit_count = 0

    for hit in hits:
        font1 = pg.font.SysFont('comicsans', 100)
        if BOXA[hit_count] == GRE:
            text = font1.render('green', 1, (GREEN))
            #self.effects_sounds['lose_sound'].play()
        elif BOXA[hit_count] == BLU:
            text = font1.render('blue', 1, (CYAN))
        elif BOXB[hit_count] == YEL:
            text = font1.render('yellow', 1, (YELLOW))
        elif BOXB[hit_count] == RE:
            text = font1.render('red', 1, (RED))
            #self.effects_sounds['jackpot_sound'].play()

        self.screen.blit(text, (250 -(text.get_width()/2),200))
        pg.display.update()
        i = 0
        while i < 100:
            pg.time.delay(10)
            i += 1
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    i = 301
                    pg.quit()
        hit.health -= SHARD_DAMAGE
        if self.player.health < 20:
            self.player.health += 0
            hit.health += BOXA.popleft()
            hit_count += 1
            print('lvl_A')

        if self.player.health > 20 and self.player.health < 40:
            hit.health += BOXB.popleft()
            self.player.health += 0
            print('lvl_B')

        elif self.player.health > 40:
            self.player.health += 0
            hit.health += BOXA.popleft()
            print('lvl_C')

我真的不知道为什么它没有切换,所以任何洞察都将不胜感激

我不知道是否理解您的问题,但我在代码中看到了一个问题

您应该设置变量

level = "A"
并改变它

    if self.player.health < 20:
        level = "A"

    if self.player.health > 20 and self.player.health < 40:
        level = "B"

    elif self.player.health > 40:
        level = "C"
if self.player.health < 20:
    box = BOXA

if self.player.health > 20 and self.player.health < 40:
    box = BOXB

elif self.player.health > 40:
    box = BOXA
如果没有这个选项,它总是选中第一个列表BOXA,它总是找到它用来显示文本的颜色,它从不选中BOXB

或者你应该使用

box = BOXA
并改变它

    if self.player.health < 20:
        level = "A"

    if self.player.health > 20 and self.player.health < 40:
        level = "B"

    elif self.player.health > 40:
        level = "C"
if self.player.health < 20:
    box = BOXA

if self.player.health > 20 and self.player.health < 40:
    box = BOXB

elif self.player.health > 40:
    box = BOXA
顺便说一句:你可以用颜色创建列表或字典

all_colors = {
     GRE: (GREEN, "green")
     BLU: (CYAN, "blue")
     ...
}
并使用此字典而不是if/elif选择颜色


使用printmessage查看使用了代码的哪一部分,并在变量中显示值。也许有不同的值,然后你期望或你有错误的缩进和一些代码从来没有使用。诡辩:当self.player.health等于20时会发生什么?当它达到B级时会发生什么?它应该以不同的颜色显示文本吗?当您显示文本时,您不检查级别,因此它总是从第一个在if/elif-if-BoxA[hit_count]==GRE:。也许最好使用变量level='B',并在显示文本时检查它。或者使用变量box=BOXA,当您更改级别时,设置box=BOXB,然后使用if-box[hit_count]==GRE:@Kingsley我尝试了一下-它只是忽略了其他级别-当它大于或等于20时,没有任何更改;使它只等于20,就不会切换级别。是的,这是我的观点-代码只检查>20和<20。其中一个检查可能在某个地方有a=。
all_colors = {
     GRE: (GREEN, "green")
     BLU: (CYAN, "blue")
     ...
}
color, name = all_colors[ box[hit_count] ]
text = font1.render(name, 1, color)