Problem with variables - JCB - Nov-13-2019
So yeah, I'm trying to make a simple randomized generator in Python for my own-design board game but I found a problem. To be more specific, I want to generate a list of items that the player will gain by a specific rule (i don't want to go deeper into the rules ). Now the problem is, that sometimes (depending on what generates), Python screams at my face that:
Error: Traceback (most recent call last):
File "main.py", line 358, in <module>
print(count, end=' ')
NameError: name 'count' is not defined
Now, when you'll browse the code i'm putting below, you'll notice that the variable 'count' IS defined. It's probably a "missclick" of mine or sth like that but I have no idea where and how does it look. Can you help me?
Code:
import random
#type of tool
tool = input("Please enter the type of tool you want to use (A=axe,S=shovel,H=hoe or shears,P=pickaxe,B=bucket): ")
#tool material
if (tool == "A") or (tool == "S") or (tool == "P"):
material = int(input("Please enter the numerical ID of the tool's material (0=no tool(hand),1=wood,2=stone,3=iron,4=diamond,5=gold): "))
elif tool == "H":
material = int(input("Please enter the numerical ID of the tool's material (0=no tool(hand),1=wood,2=stone,3=iron,4=diamond,5=gold,6=shears): "))
#silk touch
if (tool != "B") and (material != 0):
st = input("Is your tool enchanted with Silk Touch?(Y/N)")
#fortune
if (tool == "S" or (tool == "H" and material != 6) or tool == "P") and (material != 0):
ft = int(input("Please enter the level of Fortune enchantment on your tool: "))
print("", end='\n')
print("You've collected:", end='\n')
#axe
if tool == "A":
if material == 0:
r = 1
while r > 0:
count = 1
item = "oak log"
print(count, end=' ')
print(item)
r = r - 1
elif material == 5:
r = 1
while r > 0:
x = random.randint(1,100)
if x in range(1,50):
count = 1
item = "oak log"
elif x in range(51,100):
count = 1
item = "pumpkin"
print(count, end=' ')
print(item)
r = r - 1
else:
r = material
while r > 0:
x = random.randint(1,100)
if x in range(1,90):
count = 1
item = "oak log"
elif x in range(91,100):
count = 1
item = "pumpkin"
print(count, end=' ')
print(item)
r = r - 1
#shovel
elif tool == "S":
if material == 0:
r = 1
while r > 0:
count = ""
item = "nothing"
print(count, end=' ')
print(item)
r = r - 1
elif material == 5:
r = 1
while r > 0:
x = random.randint(1,3)
if x == 1:
count = 1
if st == "N":
item = "dirt"
elif st == "Y":
item = "grass block"
elif x == 2:
count = 1
item = "dirt"
else:
if st == "N":
count = 4
item = "clay"
elif st == "Y":
count = 1
item = "clay block"
print(count, end=' ')
print(item)
r = r - 1
else:
r = material
while r > 0:
x = random.randint(1,100)
if x in range(1,20):
count = 1
if st == "N":
item = "dirt"
elif st == "Y":
item = "grass block"
elif x in range(21,80):
count = 1
item = "dirt"
elif x in range(81,100):
if st == "N":
count = 4
item = "clay"
elif st == "Y":
count = 1
item = "clay block"
print(count, end=' ')
print(item)
r = r - 1
#hoe
elif tool == "H":
if material == 0:
r = 1
while r > 0:
count = ""
item = "nothing"
print(count, end=' ')
print(item)
r = r - 1
elif material == 5:
r = 1
while r > 0:
x = random.randint(1,11)
if x == 1:
if st == "N":
sapling = random.randint(1,10000)
stick = random.randint(1,10000)
apple = random.randint(1,100000)
if (ft == 0) or (ft > 3):
if sapling in range(1,500):
count = 1
item = "oak sapling"
elif stick in range(1,200):
count = 1
item = "stick"
elif ft == 1:
if sapling in range(1,625):
count = 1
item = "oak sapling"
elif stick in range(1,222):
count = 1
item = "stick"
elif ft == 2:
if sapling in range(1,833):
count = 1
item = "oak sapling"
elif stick in range(1,250):
count = 1
item = "stick"
else:
if sapling in range(1,1000):
count = 1
item = "oak sapling"
elif stick in range(1,333):
count = 1
item = "stick"
elif st == "Y":
count = 1
item = "oak leaves"
elif x == 2:
if st == "N":
if (ft == 0) or (ft > 3):
seeds = random.randint(0,1)
if seeds == 0:
count = ""
item = "nothing"
else:
count = 1
item = "wheat seeds"
else:
seeds = random.randint(0,1+ft)
if seeds == 0:
count = ""
item = "nothing"
else:
count = random.randint(1,1+(2*ft))
item = "wheat seeds"
elif st == "Y":
count = 1
item = "grass"
elif x == 3:
count = 1
item = "dandelion"
elif x == 4:
count = 1
item = "poppy"
elif x == 5:
count = 1
item = "azure bluet"
elif x == 6:
count = 1
item = "red tulip"
elif x == 7:
count = 1
item = "orange tulip"
elif x == 8:
count = 1
item = "white tulip"
elif x == 9:
count = 1
item = "pink tulip"
elif x == 10:
count = 1
item = "oxeye daisy"
else:
count = 1
item = "cornflower"
print(count, end=' ')
print(item)
if (ft == 0) or (ft > 3):
if apple in range(1,500):
print("1 apple")
elif ft == 1:
if apple in range(1,556):
print("1 apple")
elif ft == 2:
if apple in range(1,625):
print("1 apple")
else:
if apple in range(1,833):
print("1 apple")
r = r - 1
elif material == 6:
r = 1
while r > 0:
x = random.randint(1,100)
if x in range(1,60):
count = 1
item = "oak leaves"
elif x in range(61,91):
count = 1
item = "grass"
elif x == 92:
count = 1
item = "dandelion"
elif x == 93:
count = 1
item = "poppy"
elif x == 94:
count = 1
item = "azure bluet"
elif x == 95:
count = 1
item = "red tulip"
elif x == 96:
count = 1
item = "orange tulip"
elif x == 97:
count = 1
item = "white tulip"
elif x == 98:
count = 1
item = "pink tulip"
elif x == 99:
count = 1
item = "oxeye daisy"
else:
count = 1
item = "cornflower"
print(count, end=' ')
print(item)
r = r - 1
else:
r = material
while r > 0:
x = random.randint(1,100)
if x in range(1,60):
if st == "N":
sapling = random.randint(1,10000)
stick = random.randint(1,10000)
apple = random.randint(1,100000)
if (ft == 0) or (ft > 3):
if sapling in range(1,500):
count = 1
item = "oak sapling"
elif stick in range(1,200):
count = 1
item = "stick"
elif ft == 1:
if sapling in range(1,625):
count = 1
item = "oak sapling"
elif stick in range(1,222):
count = 1
item = "stick"
elif ft == 2:
if sapling in range(1,833):
count = 1
item = "oak sapling"
elif stick in range(1,250):
count = 1
item = "stick"
else:
if sapling in range(1,1000):
count = 1
item = "oak sapling"
elif stick in range(1,333):
count = 1
item = "stick"
elif st == "Y":
count = 1
item = "oak leaves"
elif x in range(61,91):
if st == "N":
if (ft == 0) or (ft > 3):
seeds = random.randint(0,1)
if seeds == 0:
count = ""
item = "nothing"
elif seeds == 1:
count = 1
item = "wheat seeds"
else:
seeds = random.randint(0,1+ft)
if seeds == 0:
count = ""
item = "nothing"
else:
count = random.randint(1,1+(2*ft))
item = "wheat seeds"
elif st == "Y":
count = 1
item = "grass"
elif x == 92:
count = 1
item = "dandelion"
elif x == 93:
count = 1
item = "poppy"
elif x == 94:
count = 1
item = "azure bluet"
elif x == 95:
count = 1
item = "red tulip"
elif x == 96:
count = 1
item = "orange tulip"
elif x == 97:
count = 1
item = "white tulip"
elif x == 98:
count = 1
item = "pink tulip"
elif x == 99:
count = 1
item = "oxeye daisy"
else:
count = 1
item = "cornflower"
print(count, end=' ')
print(item)
r = r - 1
RE: Problem with variables - ichabod801 - Nov-13-2019
650 lines of code with no functions, just a huge string of if/elif/else? No wonder you're having trouble finding the bugs. Please, learn functions, learn how to use data for conditional processing.
As to your error, count is not necessarily defined. If x is 91 or less, you go to an if/elif with no else. If neither of those conditions are true, count won't be defined.
RE: Problem with variables - JCB - Nov-13-2019
Thanks, I get it now.
BTW I tried functions and it looks like I need more time. Welp, at least this is fixed
RE: Problem with variables - the_ophidian_order - Nov-13-2019
First, I echo ichabod801's comments.
Second, here's my crack at debugging your code: I found that if I use a stone hoe without silk touch, and a fortune enhancement of 21711917, that puts me in the apparently offending section of the code. If we look at the last five lines (358 through 362), we have this:
else:
count = 1
item = "cornflower"
print(count, end=' ')
print(item)
r = r - 1 "count" is defined, but only under the "else" that's started on line 357. The two "print" commands are not on the same indentation, so they're actually in the "while" loop that starts on line 274 -- they'll get executed every time in that while loop regardless of any of the checks (and subsequent settings of "count") between line 276 and 359. This is what makes it possible to get to line 360 without defining "count". I suspect what you want is this:
else:
count = 1
item = "cornflower"
print(count, end=' ')
print(item)
r = r - 1 ... which puts those print statements under the "else" where they (apparently) belong. This seems to avoid generating the "count not defined" error under the same conditions (The stone hoe without silk touch, and a fortune enhancement of 21711917). However, I can't say that's a definitive test of all of the possibilities.
I'm assuming you're not done with the program yet, because when I go out with a bucket I always get nothing.
|