Eronan
Eronan

Reputation: 11

Python won't return number variable back

The integer variables aren't working, they don't come back even though I used global on them, I even tried return and it didn't work. After numerous tries of trying to bug test and solve the problem I found the source of the problem but I don't know how to fix it. Because this code is very long (714) I won't put up the whole thing. Instead I'll put up what is required.

def plrcheck():
    global pwr
    global typ
    if prsna in [sf1, sf2, sf3, sa1, sa2, sa3, sw1, sw2, sw3, se1, se2, se3]:
        pwr = 5
    elif prsna in [sf4, sf5, sa4, sa5, se4, se5, sw4, sw5]:
        pwr = 8
    elif prsna in [sf6, sa6, sw6, se6]:
        pwr = 11
    if prsna in [sf1, sf2, sf3, sf4, sf5, sf6]:
        typ = 'Fire'
    elif prsna in [sw1, sw2, sw3, sw4, sw5, sw6]:
        typ = 'Water'
    elif prsna in [sa1, sa2, sa3, sa4, sa5, sa6]:
        typ = 'Air'
    elif prsna in [se1, se2, se3, se4, se5, se6]:
        typ = 'Earth'
    pygame.display.flip()

def oppcheck():
    global optyp
    global oppwr
    if opp in [sf1, sf2, sf3, sa1, sa2, sa3, sw1, sw2, sw3, se1, se2, se3]:
        oppwr = 5
    elif opp in [sf4, sf5, sa4, sa5, se4, se5, sw4, sw5]:
        oppwr = 8
    elif opp in [sf6, sa6, sw6, se6]:
        oppwr = 11
    if opp in [sf1, sf2, sf3, sf4, sf5, sf6]:
        optyp = 'Fire'
    elif opp in [sw1, sw2, sw3, sw4, sw5, sw6]:
        optyp = 'Water'
    elif opp in [sa1, sa2, sa3, sa4, sa5, sa6]:
        optyp = 'Air'
    elif opp in [se1, se2, se3, se4, se5, se6]:
        optyp = 'Earth'
    pygame.display.flip()

def atkchk(x):
    plrcheck()
    oppcheck()
    if x == 'opponent':
        if optyp == 'Air':
            if typ == 'Earth':
                oppwr += 2
        elif optyp == 'Water':
            if typ == 'Fire':
                oppwr += 2
        elif optyp == 'Fire':
            if typ == 'Air':
                oppwr += 2
        elif optyp == 'Earth':
            if typ == 'Water':
                oppwr += 2
    elif x == 'player':
        if typ == 'Air':
            if optyp == 'Earth':
                pwr += 2
        elif typ == 'Water':
            if optyp == 'Fire':
                pwr += 2
        elif typ == 'Fire':
            if optyp == 'Air':
                pwr += 2
        elif typ == 'Earth':
            if optyp == 'Water':
                pwr += 2
    while pwr - oppwr < 0:
        discard = int(math.fabs(pwr-oppwr)/2)+1
        #Selection Process of Discarding for Player
    while pwr - oppwr > -1:
        discard = int(math.fabs(pwr-oppwr)/2)+1
        #Selection process of discarding for opponent
    win()

def game():
    while matchLoop:
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_x:
                    plrcheck()
                    oppcheck()
                    atkchk('player')

The problem appears at for [atkchk(x)], it forgets the [pwr and oppwr] variable even though outside that it's still working. By the way this shouldn't require pygame knowledge just simple python knowledge should be enough. I have assigned all the other variables but that's not part of the problem (it was working completely fine until I added in [atkchk(x)]), and I've narrowed it down to what I said before. So is there anyway you know of to solve this?

Upvotes: 0

Views: 418

Answers (1)

Brian
Brian

Reputation: 3131

Add a global reference to these variables at the top of the function like

def atkchk(x):
   global pwr
   global oppwr

Python will allow you to work with locally scoped variables with the same name as global variables. This can get a bit confusing. If you don't tell the function that you intend to work with the already defined globally scoped pwr and oppwr any assignment to these names will create a locally scoped variable of the same name, effectively hiding the global variables from your function.

Check out the answers to this post: Use of Global Keyword in Python

The second and third answers talk about the problem it appears you are running into.

Upvotes: 1

Related Questions