#!/usr/bin/python3 ''' This is a program to show random coin flips and other random things Authors: Jeff Kinne, jkinne@cs.indstate.edu Change log: Dec 3, 2019 - initial version Dec 4, 2019 - added something... Known bugs/issues: Starting point: https://docs.python.org/3/howto/curses.html Sources: link above, that's all Assistance from: nobody To use: just run it, either ./randomness.py or python3 randomness.py or run it in idle3 ''' import curses, random # Get a choice from the user from a set of options # The user is supposed to type the first letter of one of the choices # scr - a curses screen/window for drawing on # choices - list of strings for user to choose from def getChoice(scr, choices): scr.clear() # clear screen scr.border() # border # loop through choices and display each like: (c)hoice # and also add first letters to firstLetters list lineNo = 10 firstLetters = [] for s in choices: if len(s) < 2: continue # assume choice is at least 2 characters long scr.addstr(lineNo, 10, '('+s[0]+')'+s[1:]) firstLetters.append(s[0].lower()) lineNo += 1 scr.refresh() # screen isn't redrawn until this is called # get their choice and check if it was one of the options choice = scr.getkey() while choice.lower() not in firstLetters: choice = scr.getkey() return choice.lower() # Initialize some curses things # scr - a curses screen/window to initialize def init(scr): scr.keypad(True) # enable using arrow keys curses.noecho() # don't display keys types curses.cbreak() # get keys before they hit enter curses.curs_set(False) # don't display cursor # The coins part of this program - display coin flips # It keeps showing more coins as long as the user keeps pressing c # scr - a curses screen/window to use def coins(scr): scr.clear() # start with an empty screen scr.border() # instructions to the user scr.addstr(11, 10, 'Press c to flip another coin, any other key to quit') counts = {'H':0, 'T':0} xPos = 10 # position to put next coin flip at # as long as they keep typing c, flip another coin choice = 'c' while choice.lower() == 'c': xPos += 1 # move over one to put new coin coin = random.choice(['H','T']) # this is the coin flip scr.addstr(10, xPos, coin) # put it on the screen counts[coin] += 1 # add to our counts # display the counts scr.addstr(12, 10, 'Heads: ' + str(counts['H']) + ', Tails: ' + str(counts['T']) + ' ') scr.refresh() choice = scr.getkey() # Flipping dice and displaying results # Currently just flips one die # scr - a curses window/screen def dice(scr): scr.clear() scr.border() die = random.randint(1, 6) scr.addstr(10, 10, str(die)) scr.addstr(11, 10, 'press any key to continue') scr.refresh() scr.getkey() # Main curses program, this is the entry point into our program # scr - a curses window/screen to use def main(scr): init(scr) # initialize things # Get what they want to do, then do it, then ask again # what they want to do (if they didn't choose to quit) choice = '' while choice != 'q': choice = getChoice(scr, ['Coins', 'Dice', 'Quit']) if choice == 'c': coins(scr) elif choice == 'd': dice(scr) # Calling min like this does some initialization/cleanup for us # and make sure we don't mess up the terminal if the program crashes. curses.wrapper(main)