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
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
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
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