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