mcOutput

LLEYTON AND LUKE MADE THIS

Yep. They sure did. In our 2022-23 Python class featuring 'Tracy the Turtle' at CodeHS, students were taught how to get Tracy to do Morse Code. However, the message was 'hard-wired' and had to be reconfigured for other messages.

Partners Lleyton and Luke wondered how we could get Tracy to adapt to any message. Brilliant question!

Their loving 'Tech Tools Guru' referred them to a p5JS project already featured here at TNT: Morse Code and they were challenged to convert the source code to Python!

Well, they did it, and here's how it was done. Watch the movie to see Tracy in action and then check out the source code! Their genius was to utilize a 'dictionary' to look up the necessary graphics sequence for each letter, converted to uppercase.

Well done, gentlemen!

Morse Code Translator Source Code
#----- Functions ----------
def hide_tracy():
    penup()
    setposition(250, 250)
#end hide_tracy

def intro():
    stage_str = "Final"
    print("=== Morse Tracy - Stage: " + stage_str + " ===")
#end intro

def initialize():
    penup()
    setposition(-200, 180)
#end initialize

#info fed to a function can be called: parameters or arguments
def draw_dash(d_len, colr, sz):
    pensize(sz)
    color(colr)
    pendown()
    forward(d_len)
    draw_gap(.4*d_len)
    
    #reset dash to basics
    penup()
    color("black")
    pensize(1)
#end draw_dash

def draw_dit(r, colr):
    penup()
    color(colr)
    
    #move from baseline to bottom of circle
    forward(r)
    right(90)
    forward(r)
    left(90) #now, facing east
    
    #draws the circle with a fill
    begin_fill()
    circle(r)
    end_fill()
    draw_gap(.4*r)
    
    penup()
    color("black")
    pensize(1)
    left(90)
    forward(r)
    right(90)
    forward(r)
#end draw_dit

def draw_bar(b_len, colr, sz):
    #a bar is a vertical segment
    #to separate the various letters
    #there are MANY ways to pull this off: draw a picture on scratch paper
    
    pensize(sz)
    color(colr)
    
    #from baseline move up half
    penup()
    left(90)
    forward(b_len/2.0)
    
    #draw bar
    pendown()
    backward(b_len)
    
    #move back to baseline
    penup()
    forward(b_len/2.0)
    right(90)
#end draw_bar

def draw_gap(g_len):
    penup()
    forward(g_len)
#end draw_gap

#--- alphabet into morse code ---

def a():
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def b():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def c():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def d():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def e():
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def f():
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def g():
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def h():
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def i():
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def j():
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def k():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def l():
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def m():
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def n():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def o():
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def p():
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def q():
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def r():
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def s():
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def t():
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def u():
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def v():
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def w():
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def x():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def y():
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_bar(1.2*d_len, "black", 2)

def z():
    draw_dash(d_len, "purple", 4)
    draw_dash(d_len, "purple", 4)
    draw_dit(d_len/2.0, "green")
    draw_dit(d_len/2.0, "green")
    draw_bar(1.2*d_len, "black", 2)

def _():
    penup()
    setx(-200)
    right(90)
    forward(25)
    left(90)
    pendown()
#end alphabet into morse code

#create a dictionary
    
my_dict = {
    'A':'.-', 'B':'-...',
'C':'-.-.', 'D':'-..', 'E':'.',
'F':'..-.', 'G':'--.', 'H':'....',
'I':'..', 'J':'.---', 'K':'-.-',
'L':'.-..', 'M':'--', 'N':'-.',
'O':'---', 'P':'.--.', 'Q':'--.-',
'R':'.-.', 'S':'...', 'T':'-',
'U':'..-', 'V':'...-', 'W':'.--',
'X':'-..-', 'Y':'-.--', 'Z':'--..',
'1':'.----', '2':'..---', '3':'...--',
'4':'....-', '5':'.....', '6':'-....',
'7':'--...', '8':'---..', '9':'----.',
'0':'-----', ', ':'--..--', '.':'.-.-.-',
'?':'..--..', '/':'-..-.', '-':'-....-',
'(':'-.--.', ')':'-.--.-'}

#Luke F did this
#slight adjustments by TTG for readability purposes
def gotletter(word):
    for w in range(len(word)):
        letter = word[w].upper()
        print(letter),
        if(letter == "A"):
            a()
        elif(letter == "B"):
            b()
        elif(letter == "C"):
            c()
        elif(letter == "D"):
            d()
        elif(letter == "E"):
            e()
        elif(letter == "F"):
            f()
        elif(letter == "G"):
            g()
        elif(letter == "H"):
            h()
        elif(letter == "I"):
            i()
        elif(letter == "J"):
            j()
        elif(letter == "K"):
            k()
        elif(letter == "L"):
            l()
        elif(letter == "M"):
            m()
        elif(letter == "N"):
            n()
        elif(letter == "O"):
            o()
        elif(letter == "P"):
            p()
        elif(letter == "Q"):
            q()
        elif(letter == "R"):
            r()
        elif(letter == "S"):
            s()
        elif(letter == "T"):
            t()
        elif(letter == "U"):
            u()
        elif(letter == "V"):
            v()
        elif(letter == "W"):
            w()
        elif(letter == "X"):
            x()
        elif(letter == "Y"):
            y()
        elif(letter == "Z"):
            z()
        elif(letter == " "):
            _()
            print("")
      
#gotletter

#----- Setup --------
rate = 0
speed(rate)
d_len = 10

#----- Main Event ---------
intro()
initialize()

gotletter("LLEYTON AND LUKE MADE THIS")
hide_tracy()                                
                                

Lleyton & Luke's MC Masterpiece

Be sure to look at the source code, especially how this 'dynamic duo' used a dictionary to lookup instructions for Tracy to make each letter. Notice how the letters are being shown in the output window underneath the graphic.