0

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
  • Does this answer your question? [Unbound Local Error](https://stackoverflow.com/questions/15094719/unbound-local-error) and [Why does assigning to my global variables not work in Python?](https://stackoverflow.com/questions/929777/why-does-assigning-to-my-global-variables-not-work-in-python) – Brian61354270 Jul 11 '20 at 17:47

1 Answers1

1

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
codewelldev
  • 246
  • 1
  • 6
Samwise
  • 68,105
  • 3
  • 30
  • 44