######################################################################
#
# Stars
#
# From: BASIC Computer Games (1978)
#       Edited by David H. Ahl
#
# "In this game, the computer selects a random number from 1 to 100
#  (or any value you set [for MAX_NUM]).  You try to guess the number
#  and the computer gives you clues to tell you how close you're
#  getting.  One star (*) means you're far away from the number; seven
#  stars (*******) means you're really close.  You get 7  guesses.
#
# "On the surface this game is very similar to GUESS; however, the
#  guessing strategy is quite different.  See if you can come up with
#  one or more approaches to finding the mystery number.
#
# "Bob Albrecht of People's Computer Company created this game."
#
#
# Python port by Jeff Jetton, 2019
#
######################################################################


import random

# Some contants
MAX_NUM = 100
MAX_GUESSES = 7


def print_instructions():
    # "*** Instructions on how to play"
    print("I am thinking of a whole number from 1 to %d" % MAX_NUM)
    print("Try to guess my number.  After you guess, I")
    print("will type one or more stars (*).  The more")
    print("stars I type, the closer you are to my number.")
    print("one star (*) means far away, seven stars (*******)")
    print("means really close!  You get %d guesses." % MAX_GUESSES)


def print_stars(secret_number, guess):
    diff = abs(guess - secret_number)
    stars = ""
    for i in range(8):
        if diff < 2**i:
            stars += "*"
    print(stars)


def get_guess():
    valid_response = False
    while not valid_response:
        guess = input("Your guess? ")
        if guess.isdigit():
            valid_response = True
            guess = int(guess)
    return(guess)
    


# Display intro text
print("\n                   Stars")
print("Creative Computing  Morristown, New Jersey")
print("\n\n")
# "*** Stars - People's Computer Center, MenloPark, CA"

response = input("Do you want instructions? ")
if response.upper()[0] == "Y":
    print_instructions()
          
still_playing = True
while still_playing:

    # "*** Computer thinks of a number"
    secret_number = random.randint(1, MAX_NUM)
    print("\n\nOK, I am thinking of a number, start guessing.")

    # Init/start guess loop
    guess_number = 0
    player_has_won = False
    while (guess_number < MAX_GUESSES) and not player_has_won:

         print("")
         guess = get_guess()
         guess_number += 1

         if guess == secret_number:
             # "*** We have a winner"
             player_has_won = True
             print("*************************" +
                   "*************************!!!")
             print("You got it in %d guesses!!!" % guess_number)

         else:
             print_stars(secret_number, guess)

         # End of guess loop

    # "*** Did not guess in [MAX_GUESS] guesses"
    if not player_has_won:
        print("\nSorry, that's %d guesses, number was %d" %
              (guess_number, secret_number))

    # Keep playing?
    response = input("\nPlay again? ")
    if response.upper()[0] != "Y":
        still_playing = False

    

######################################################################
#
# Porting Notes
#
#   The original program never exited--it just kept playing rounds
#   over and over.  This version asks to continue each time.
#
#
# Ideas for Modifications
#
#   Let the player know how many guesses they have remaining after
#   each incorrect guess.
#
#   Ask the player to select a skill level at the start of the game,
#   which will affect the values of MAX_NUM and MAX_GUESSES.
#   For example:
#
#       Easy   = 8 guesses, 1 to 50
#       Medium = 7 guesses, 1 to 100
#       Hard   = 6 guesses, 1 to 200
#
######################################################################


            
        
    

    
