Python Forum
variable isn't recognized by if structure - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Game Development (https://python-forum.io/forum-11.html)
+--- Thread: variable isn't recognized by if structure (/thread-14903.html)



variable isn't recognized by if structure - Prof_Jar_Jar - Dec-23-2018

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...


RE: variable isn't recognized by if structure - Windspar - Dec-23-2018

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()



RE: variable isn't recognized by if structure - Prof_Jar_Jar - Dec-23-2018

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"?


RE: variable isn't recognized by if structure - Windspar - Dec-23-2018

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.