1

In my previous post I stated that my variable would not change whenever I added something to it. Here is my current code and my problem will be below it.

    #creates random monsters with xp points, leveling up player, and adding upgrades

#imports
from clint.textui import colored, puts
import random

sticks = 2
stumps = 2
stone = 0
iron_in = 0
gold_in = 0
diamond = 0
platinum = 0
w_sword = 1
w_shield = 1
items = ('sticks:' + str(sticks) + ' stumps:' + str(stumps) + ' stone:' + str(stone) + ' iron ingot:' + str(iron_in) + ' gold ingot:' + str(gold_in) + ' diamond:' + str(diamond) + ' platinum:' + str(platinum) + ' Wooden sword(s):' + str(w_sword) +
' wooden shield(s):' + str(w_shield))  

def game():    

    #start of the game    
    def start_game():
        print('           Hello player! Welome to a text based game involving killing monsters, leveling up, crafting weapons, and upgrading weapons!!!')
        print(' To get started enter in (i)inventory (c)craft items (d)description of items (m)types of monsters or (f)fight monsters.')
        print('                  ENTER (help) FOR HOW THE GAME WORKS')
        print('                              ENTER(?) FOR TO PRINT THIS AGAIN')
        print(' WHILE YOU ARE IN A CATEGORY SUCH AS (i)inventory PRESS (?) CAN BE USED TO GO BACK AND GO TO ANOTHER CATEGORY')
    start_game()

    main_In = input()

    level = 0
    Pxp = 0
    gold = 5

    monster_lvl = random.randint(1,10)

    if main_In == ('c'):
        ws_sticks = 2
        ws_stumps = 1

        def craft():
            print('Would you like to craft an item??')
            print('( Red = uncraftable )')
            print('( Green = craftable )')
            print('( Type items in lowercase )')

            if sticks < ws_sticks:
                puts(colored.red('Wooden sword'))
            else:
                puts(colored.green('Wooden sword'))
            if stumps < ws_stumps:
                puts(colored.red('Wooden shield'))
            else:
                puts(colored.green('Wooden shield'))

        craft()
        C_item = input()

        def re_craft():
            print('press ENTER to go back to the start screen, or enter c to craft an(other) item.')
            cor_go = input()
            if cor_go == ('c'):
                craft()
                C_item = input()
            else:
                game()

        if C_item == ('no'):
            print('press ENTER to go back to the start screen')
            input()
            game()

        if C_item == ('wooden sword') and sticks >= ws_sticks:
            print('Wooden sword added to your inventory')
            re_craft()

        if C_item == ('wooden sword') and sticks < ws_sticks:
            print('You need ' + str(ws_sticks - sticks) + ' stick(s) to craft a wooden sword')
            re_craft()

        if C_item == ('wooden shield') and stumps >= ws_stumps:
            print('Wooden shield added to your inventory')
            re_craft()

        if C_item == ('wooden shield') and stumps < ws_stumps:
            print('You need' + str(ws_stump - stumps) + ' stumps to craft a wooden shield.')
            re_craft()
        while ('Wooden shield added to your inventory'):
            w_shield += 1
        while ('Wooden sword added to your inventory'):
            w_sword = +1

    if main_In == ('i'):
        puts(colored.yellow('Level: ' + str(level)))
        puts(colored.yellow('xp: '  + str(Pxp)))
        puts(colored.yellow('gold:' + str(gold)))
        puts(colored.yellow('Items: ' + str(items)))
        puts(colored.yellow('press ENTER to return to the start screen'))
        input()
        game()

    if main_In == ('?'):
        game()

game()

Now one of the answers in my last question said that my variable for w_sword and w_shield should start as 1 and that my variable assignments should be outside the function: game(), so I did as said and whenever I "crafted" a wooden sword or wooden shield it showed up as 1 for it. But what I didn't realize was that no matter which I crafted (wooden sword or wooden shield) both w_sword and w_shield showed up as 1 when I went back to (i)inventory. For instance If I was to type wooden sword in the input known as c_item and then go back to (i)inventory, both w_sword and w_shield would show up as 1 even though I only crafted a wooden sword.

  • 5
    `while ('Wooden shield added to your inventory'):` doesn't look right to me. `while "some_string_constant":` will loop forever. Also note the difference between += and =+. – Kevin Jun 29 '15 at 16:16
  • You also have many redundant parenthesis - although they won't actually cause issues. – Red Shift Jun 29 '15 at 16:20
  • @Kevin do you recommend me using `if`? – Antonio Anselmo Jun 29 '15 at 16:32
  • Whether you use `if` or `while`, you shouldn't just give it a string constant. You need some kind of actual logic that compares variables to other values in some way. – Kevin Jun 29 '15 at 16:44
  • You will get an UnboundLocalError on `w_shield += 1`. You need to initialise it to zero. Same with `w_sword` except you are resetting it to `+1` each time instead of adding 1 to it. – cdarke Jun 29 '15 at 16:45

0 Answers0