Python Says, Simon's Hipster Brother
Many of you may remember playing with a
Simon Electronic Memory Game
when you were younger, you know something that looks like this:
At it’s core the game is rather simple, the device lights up random colors, and you need to repeat the pattern. Of course it gets harder the longer you play.
I thought it would be fun to build a Simon game using Raspberry Pi and a few electronic components:
I used the following components to assemble the project:
- Raspberry Pi 3
- 3x 330 Ohm resistor
- 3x 1k Ohm resistor
- White LED
- Blue LED
- Red LED
- Breadboard
- Assortment of wires
Here is a close up of the bread board and components:
 The Raspberry Pi’s
GPIO
pins are then connected to the bread board,
and a small Python script powers the Simon game:
The Raspberry Pi’s
GPIO
pins are then connected to the bread board,
and a small Python script powers the Simon game:
from RPi import GPIO
from sys import exit
from random import choice
from time import sleep
# define our pins for leds
white = 14
blue = 15
red = 18
# define our pins for buttonss
white_button = 21
blue_button = 20
red_button = 16
# disable warnings
GPIO.setwarnings(False)
# set the board to use broadcom pin numbering
GPIO.setmode(GPIO.BCM)
# setup our LED pins as output
GPIO.setup(white, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)
GPIO.setup(red, GPIO.OUT)
# setup our buttons as input
GPIO.setup(white_button, GPIO.IN)
GPIO.setup(blue_button, GPIO.IN)
GPIO.setup(red_button, GPIO.IN)
# create empty pattern list for simon says game
pattern = []
# create a list of our choices for simon says game
choices = [white, blue, red]
# starting difficulty based on blink durations
duration = 0.75
def add_color():
 """
 Append a random color to our pattern list
 """
 color = choice(choices)
 pattern.append(color)
def get_button():
 """
 Gets the next button press and returns
 """
 while True:
 if GPIO.input(white_button):
 return white
 if GPIO.input(blue_button):
 return blue
 if GPIO.input(red_button):
 return red
def blink(led, duration):
 """
 Blink a led for duration
 """
 GPIO.output(led, GPIO.HIGH)
 sleep(duration)
 GPIO.output(led, GPIO.LOW)
def blink_pattern(duration):
 """
 Blinks our pattern using duration as waits
 """
 for led in pattern:
 sleep(duration)
 blink(led, duration)
def check_pattern():
 """
 Checks our button presses against pattern
 """
 for led in pattern:
 if led != get_button():
 return False
 sleep(0.3) # delay so button press doesn't overlap
 return True
def game_over():
 """
 Game over function
 """
 print 'Pattern Length: {}'.format(len(pattern))
 print '''
 _____ __ __ ______ ______ ________ _____
 / ____| /\ | \/ | ____| / __ \ \ / / ____| __ \
 | | __ / \ | \ / | |__ | | | \ \ / /| |__ | |__) |
 | | |_ | / /\ \ | |\/| | __| | | | |\ \/ / | __| | _ /
 | |__| |/ ____ \| | | | |____ | |__| | \ / | |____| | \ \
 \_____/_/ \_\_| |_|______| \____/ \/ |______|_| \_\
 '''
 # blink all leds to show game over
 for _ in range(3):
 for c in choices:
 blink(c, duration=0.1)
 exit()
if __name__ == '__main__':
 # populate initial pattern
 add_color()
 add_color()
 while True:
 # blink back pattern
 blink_pattern(duration)
 # check if our inputs were correct, else end game
 if not check_pattern():
 game_over()
 # add a new color to pattern
 add_color()
 # decrease our duration to increase difficulty
 if duration > 0.05:
 duration -= 0.07
Happy Hacking!