Python Forum

Full Version: variable isn't recognized by if structure
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hey there!

I don't get this:

I have a code that goes like this (simplified, but essentially that):

def q():
    loop = True
    CC = 0
    WC = 3
    while loop == True:
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONUP:
                mposx,mposy = pygame.mouse.get_pos()
                
                if 200 < mposx < 300 and 150 < mposy < 200:
                    print ('Correct')
                    CC = CC+1
                if 400 < mposx < 500 and 150 < mposy < 200:
                    print ('Wrong')
                    WC = WC-1

        print (CC)
        print (WC)
        if CC == 10:
            loop = False
            check = True
            return check
            print ('Win')
        if WC == 0:
            loop = False
            check = False
            return check
            print ('Fail')


    pygame.display.update()
    clock.tick(30)
But when I run that and I click on the wrong button in the game, it prints WC as running down to 0, but then restores it to 3 and drops out of the loop, the second time it hits 0, but without printing 'Fail'.

So it basically says in the print line "WC is O" and the next line "if WC == 0" doesnt get activated.

I am so confused and would be very thankful for any help!

----------------------------------------------------------------

Update: When I just run this:

q()
print ('End')
it works, but when I run this:

q()
check = q()
print (check)
print ('End')
the problem I described above occurs
Maybe that's helping? For me it's just confusing...
You need a better test code.

How I would test code.
import pygame
pygame.init()

class SimpleButton:
    def __init__(self, caption, font_color, button_color, rect):
        font = pygame.font.Font(None, 16)
        self.rect = rect
        self.color = button_color
        self.text = font.render(caption, 1, font_color)
        self.text_rect = self.text.get_rect()
        self.text_rect.center = rect.center

    def draw(self, surface):
        surface.fill(self.color, self.rect)
        surface.blit(self.text, self.text_rect)

class Scene:
    def __init__(self):
        self.rect = pygame.Rect(0, 0, 800, 600)
        pygame.display.set_caption('Example')
        self.surface = pygame.display.set_mode(self.rect.size)
        self.clock = pygame.time.Clock()

        correct_rect = pygame.Rect(200, 150, 100, 50)
        wrong_rect = correct_rect.move(200, 0)
        self.buttons = [
            SimpleButton('Correct', (255,255,255), (0,200,0), correct_rect),
            SimpleButton('Wrong', (255,255,255), (200,0,0), wrong_rect)
            ]

        self.correct_count = 0
        self.wrong_count = 3
        self.font = pygame.font.Font(None, 16)
        self.correct_text = self.font.render(str(self.correct_count), 1, (0, 255, 0))
        self.wrong_text = self.font.render(str(self.wrong_count), 1, (255, 0, 0))
        self.end_text = None

    def loop(self):
        self.running = True
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if self.buttons[0].rect.collidepoint(*event.pos):
                        self.correct_count += 1
                        if self.correct_count == 10:
                            self.end_text = self.font.render('Win', 1, (0, 255, 0))
                            self.correct_count = 0
                            self.wrong_count = 3
                            self.wrong_text = self.font.render(str(self.wrong_count), 1, (255, 0, 0))

                        self.correct_text = self.font.render(str(self.correct_count), 1, (0, 255, 0))
                    elif self.buttons[1].rect.collidepoint(*event.pos):
                        self.wrong_count -= 1
                        if self.wrong_count == 0:
                            self.end_text = self.font.render('Lost', 1, (255, 0, 0))
                            self.correct_count = 0
                            self.wrong_count = 3
                            self.correct_text = self.font.render(str(self.correct_count), 1, (0, 255, 0))

                        self.wrong_text = self.font.render(str(self.wrong_count), 1, (255, 0, 0))

            self.surface.fill((0,0,0))

            self.surface.blit(self.correct_text, (10, 10))
            self.surface.blit(self.wrong_text, (100, 10))
            if self.end_text:
                self.surface.blit(self.end_text, (200, 10))

            for button in self.buttons:
                button.draw(self.surface)

            pygame.display.flip()
            self.clock.tick(30)

        pygame.quit()

scene = Scene()
scene.loop()
As I said, I'm new to Python and thats beyond my current level. Thanks for trying to improve my code, but I don't understand that anymore. I am aware, that I am overcomplicating a lot of things, but I can better understand them if I do them very primitively.

Do you have any idea, how the "check = q()" command changes so much in "the q()-loop"?
You need to do a better test example.
Remove all pygame stuff from q.
All q does is run an infinite loop.
So it unclear where the error is.
It always prints zero then three. Never ending.