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