I'm a Python newbie and I'd like to know how I could clean this up/optimize it (but nothing too advanced please). As far as I know, it's working as it should, but if you see any errors then please point it out! This is a numerical guessing game with two symbols in front. You can pretty much see how it works by looking at the print messages. Thank you!
from random import randint, choice
import string
maxguesses = 11 # Default number of max guesses
wins = 0
losses = 0
points = 0 # Points accumulated
games = 0 # Games played
numguesses = 0 # Number of guesses
flag = True
allowed = list(string.digits + '+' + '*')
guesses = '' # Track wrong guesses, resets every game when formula is regenerated
letters = set()
partial = '' # Current progress of guesses
def genform(): # Generate secret formula
global secret, maxguesses
sym = choice(['++','**','+*','*+']) # Pick operation symbols
num = ''
max = randint(3,9) # Set max between 3 & 9
for i in range(max): # Range of max variable
num = num + str(randint(0,9))
secret = sym + num # Assign secret formula
maxguesses = len(secret)+2 # Max guesses based on length of formula
return secret
def evaluate(formula):
evaluated = ''
s1,s2 = secret[:2]
for i in range(2,len(secret)-1): # Loop after two symbols
evaluated = evaluated + secret[i]
evaluated = (evaluated + s1) if not (i%2) else (evaluated + s2) # Place symbols appropriately
evaluated = evaluated + secret[-1] # Put together
return evaluated
def takeguess(ch):
global numguesses, wins, points, games, partial, guesses
numguesses = numguesses + 1 # Add guess
print 'Remaining Guesses: ' + str(maxguesses-numguesses)
if (ch in partial) or (ch in guesses): # Check if already guessed
print "\nYou've already guessed '%s'. Try again: " % ch
elif ch not in secret:
guesses = guesses + ch
print 'Wrong, guess again.'
elif ch in secret: # If in formula
letters.add(ch) # Add guess to set
print "\nGood guess, it's in the secret formula!"
partial = ''.join([l if l in letters else '-' for l in secret])
print 'Formula so far: ' + partial
if partial == secret: # If guesses are complete
print 'You win!'
wins = wins + 1
points = points + 2
games = games + 1
bonus = raw_input("Evaluate the formula for 10 bonus points: ") # Ask bonus question
if bonus == str(eval(evaluate(secret))): # Calculate result
points = points + 10
print "That's correct! +10 points."
print eval(evaluate(secret)) #REMOVE AFTER
play_again()
else: # If bonus answer is wrong
print "That's incorrect. The right answer is", eval(evaluate(secret))
play_again()
def play_again():
global numguesses, guesses, partial, letters, flag
letters = set() # Clear set
if points < 2: # Check points
print "\nYou don't have enough points to play again.\nGames Played: " + str(games) + '\nPoints: ' + str(points)
else: # Good to go
ans = raw_input('Would you like to play again? [y/n] \n')
if ans in ('yY'):
numguesses = 0
guesses = ''
partial = ''
play()
elif ans in ('nN'):
flag = False
print '\nOkay, goodbye.\nWins: %s \nLosses: %s \nPoints: %s' % (wins, losses, points)
else:
print 'Invalid input.'
play_again()
def play():
global points, games, losses
genform() # Generate new formula
print 'Unsolved formula: ' + ('-'*len(secret))
print 'You have %s guesses.' % maxguesses
print secret #REMOVE AFTER
while (numguesses < maxguesses) and flag: # Enough guesses and run OK
guess = raw_input('\nEnter a guess: ') # Receive guess
if guess not in allowed: # Check if valid
print '\nInvalid guess, please enter a single digit, *, or +. Try again: '
elif partial != secret: # Process guess
takeguess(guess)
print guesses # REMOVE AFTER
if numguesses == maxguesses: # Guess limit reached
points = points - 2
games = games + 1
losses = losses + 1
print '\nSorry, you lose. The answer is: ' + secret
play_again() # Ask for replay
return
print 'Welcome to Numerical Hangman!\n'
play()