WEEK07: top-down design
---------------------------------------------------------------
 M: start top-down design

ANNOUNCEMENTS:
 - Lab 6 (frog race) due this Saturday
 - Quiz 3 on FRIDAY


TOP-DOWN DESIGN:

  Top Down Design is a problem solving technique where you:

   1. Start with General Description of Problem
   2. Break it into several high-level steps
   3. Iteratively break the steps into smaller steps until you have 
      steps that are easy to solve 

 - just like writing a paper...start with an outline, then fill
   in the second-level details, and so on until you can start
   writing each section/function

 - for example, writing a wheel-of-fortune game might start
   with something like this:

        main:     read phrases from file
                  pick one phrase for the game
                  play the game, with the chosen phrase
                  output the results
   
   Each one of those could be a single function, or may need to
   be broken down into multiple functions. If you think one of
   the above should be a single function, sketch it out (what
   arguments would it need, what would it do and how, and what
   should it return). If you think one of the above (ex: play the
   game) will be more than one function, do another level of 
   top-down design on that.

 - GOALS: get main() written, decide on data structures, how data
   will go to/from each function, write function stubs so we can
   write and TEST EACH FUNCTION ONE AT-A-TIME!


YOUR TURN:

Let's demonstrate this idea with the dice game Craps.

- A player rolls a pair of six-sided dice.
- If the initial roll is 2, 3, or 12, the player loses.
- If the initial roll is 7 or 11, the player wins.
- Any other initial roll causes the player to "roll for point". 
  This means that the player keeps rolling either until she 
  re-rolls the initial value (a win) or rolls a 7 (a loss).

Let's write a program to simulate multiple games of craps and 
estimate the probability that the player wins. 


"""
 Craps simulator using top down design

 Input: Number of games to simulate
 Output: Probability of winning 

 A. Danner
 Fall 2013
"""

from random import randrange

####################################################

def main():

  """ brief outline/overview of program """
  ngames = getNumberOfGames()

  nwins = 0
  for game in range(ngames):
     result = playOneGame()
     if(result == True):
       nwins = nwins+1
 
  print "Winning percentage: %.2f%% " % (100.0*nwins/ngames)

# ----------------------------------------------- #

def getNumberOfGames():
  """prompt user to enter a number of games to simulate
     check if input is valid
     return positive integer
  """
  val = 10
  return val

# ----------------------------------------------- #

def rollTwoDice():
  """ roll two dice, return sum """
  roll1 = 5
  roll2 = 8
  return roll1 + roll2

# ----------------------------------------------- #

def playOneGame():
  """ Plays a single of craps
      Returns True if player wins, False otherwise
  """
  return False

####################################################

main()


 NOTE: it doesn't do everything yet, but the structure and design are
 all specified. The program runs, and I can start working on adding
 each function. I can also TEST each function as I write them. Once
 I know they are working, I can move on to the next function.

 TEST AS YOU GO!!!


 - Let's add more to the playOneGame() function:


def playOneGame():
  """ Plays a single of craps
      Returns True if player wins, False otherwise
  """
  print "Playing one game"
  roll = rollTwoDice()
  if roll == 2 or roll == 3 or roll == 12:
    return False
  elif roll == 7 or roll == 11:
    return True
  else:
    #play for point
    print "not implemented"
  return False

 - should still be able to run it!
 - maybe we need another function for "play for point"???