I got a UnbloundLocalError in my clicker game, I don't know why

Question:

I got a error for refrencing the variable increment before I declared it. When I open the store and buy more money per click, I get a flood of errors. I require help please.

here’s my code:

from time import sleep as wait
import os

coin = 0
autoclick = 0
incrementation = 25
uppergrades_bought = 1
increment = 1

clear = lambda: os.system('clear') 
def store():
  cmd = int(input("What do you want to do? 1 to buy autoclick and 2 to buy more money per click").strip())
  if cmd == 1:
    coin-incrementation*uppergrades_bought
    autoclick+=1
  elif cmd == 2:
    coin-incrementation*uppergrades_bought
    increment+=1

clear()

while 1 == 1:
  print("You have {} coins!".format(coin))
  coins = input("Press enter")
  clear()
  coin+=increment
  if coin>=incrementation*uppergrades_bought:
    storeyn = input("Hi, would you like to go into the store? you have enough to buy the next uppergrade")
    if storeyn.strip().lower() == "yes" or storeyn.strip().lower() == "y":
      store()
    elif storeyn.strip().lower() == "no" or storeyn.strip().lower() == "n" :
      pass
    else:
      pass
  else:
    pass
Asked By: Nanmuhong Ye

||

Answers:

Your store function doesn’t have access to the values that it’s trying to update. There are many ways to address this — global/nonlocal as suggested by another answer requires the smallest amount of code to change right now but it’s likely to cause you a lot of problems later as your program grows and it’s something you should completely avoid as a beginner IMO. My suggestion would be to restructure your program so that all this information is stored in a class:

from time import sleep as wait
import os


class ClickerGame:
    def __init__(self):
        self.coin = 0
        self.autoclick = 0
        self.incrementation = 25
        self.upgrades_bought = 1
        self.increment = 1

    def click(self) -> None:
        """Click once, gaining coins"""
        self.coin += self.increment

    def can_afford_upgrade(self) -> bool:
        """Check if there are enough coins to afford an upgrade"""
        return self.coin >= self.incrementation * self.upgrades_bought

    def buy(self, upgrade: int) -> None:
        """1 to buy autoclick and 2 to buy more money per click"""
        if upgrade == 1:
            self.autoclick += 1
        elif upgrade == 2:
            self.increment += 1
        else:
            raise ValueError(f"Invalid upgrade option {upgrade}")            
        self.coin -= self.incrementation * self.upgrades_bought
        self.upgrades_bought += 1

    def store(self) -> None:
        """Visit the store, prompting the user for a purchase."""
        try:
            cmd = int(input(
                f"What do you want to do? {self.buy.__doc__}"
            ).strip())
            self.buy(cmd)
        except ValueError as e:
            print(e)


def clear() -> None:
    os.system('clear')


clicker = ClickerGame()


while True:
    print(f"You have {clicker.coin} coins!")
    input("Press enter")
    clear()
    clicker.click()
    if clicker.can_afford_upgrade():
        storeyn = input(
            "Hi, would you like to go into the store? "
            "you have enough to buy the next upgrade"
        ).strip().lower()
        if storeyn in {"yes", "y"}:
            clicker.store()
        elif storeyn in {"no", "n"}:
            pass
        else:
            pass
    else:
        pass
Answered By: Samwise
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.