0

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?

2
  • You should name your variables a bit clearer - what is se1, 2 ,3 ? You can also combine your if condition with and like this: if typ=='Air' and optyp == 'Earth' Commented Jun 18, 2013 at 20:47
  • In general I think you should read up on what function parameters are and how to use them. Been there done this type of programming you are doing now. Not a good idea. :-) Commented Jun 18, 2013 at 20:57

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.