from turtle import * ## whoever made the original was nice enough to make the mouth nowhere ## near semi-circular, hence this function will make the mouth. ## thanks mate. ## the three functions below are executed a fair bit further down def drawmouth_outer(): counter = 0 setheading(270) while (counter < 182): forward(2.2) left(1) counter = counter + 1 setheading(180) forward(235) ## go back where we started so the fill() function does its thing def drawmouth_inner(): counter = 0 setheading(270) while (counter < 181): forward(1.9) ## this one is slightly narrower than the outer mouth left(1) counter = counter + 1 setheading(180) forward(219) ## go back where we started so the fill() function does its thing def drawtongue(): counter = 0 setheading(85) while (counter < 120): ## these counter errors are, of course, trial and error determined forward(1) ## first part is the part of the tongue that seems circular right(1) counter = counter + 1 while (counter == 120): right(90) ## have the turtle change direction at an exact point counter = counter + 1 while (counter > 120 and counter < 220): forward(1) ## return to starting point on a silghtly curved path right(0.6) counter = counter + 1 def masterpiece(): reset() # source code title("Happy faces in Turtle!") ## it says this in the titlebar of the turtle application speed('fastest') ## because otherwise it really does take forever up() goto(0, -200) ## start a bit further down so the image is centred down() fill(True) circle(200) ## large outside circle first fill(False) up() goto(0, -180) ## we want the next shape inside the first one down() fill(True) color('#fede58') ## and the next circle in is (a shade of) yellow, creating the thick out layer effect circle(180) fill(False) up() goto(-40, 10) ## move left for the first eye down() fill(True) color('black') left(70) ## black outer layer of eye circle(62, 220) fill(False) up() goto(-42, 10) down() fill(True) color('white') ## this creates another semi-circle inside the first - the white inner part of the eye left(150) circle(56, 200) ## this isn't perfect, but neither is turtle's support of ovals... fill(False) up() goto(124, 10) ## and now for the second eye, on the other side down() fill(True) color('black') left(150) ## like at the first, this angulation is so the turtle faces in the correct direction before starting the eye. it was determined scientifically using trial and error. circle(62, 220) fill(False) up() goto(122, 10) ## second inner eye down() fill(True) color('white') left(150) ## the fact that the angle is the same each time came as a surprise to the programmer (he passed maths C, so the shame is even greater) circle(56, 200) fill(False) up() goto(-50, 45) ## finally, for the pupils looking way up into the stars down() fill(True) color('black') right(200) circle(20) fill(False) up() goto(114,45) ## one down... down() fill(True) circle(20) ## no need to change angle since we're making full circles here fill(False) ## (once again discovered scientifically) up() goto(-158, 20) down() setheading(270) fill(True) ## add a bottom part to the eye a la original forward(10) left(90) forward(117) left(90) forward(10) left(90) forward(117) fill(False) up() goto(10, 20) ## second eye down() setheading(270) fill(True) forward(10) left(90) forward(117) left(90) forward(10) left(90) forward(117) fill(False) up() goto(-154, -35) down() setheading(0) fill(True) ## top part of the mouth forward(276) ## i contemplated changing the turtle's width() right(90) ## but drawing and filling this rectangle doesn't result forward(10) ## in rounded corners (so is more accurate) right(90) forward(276) right(90) forward(10) fill(False) up() goto(-130, -45) ## outer part of mouth down() fill(True) drawmouth_outer() ## i think the output here is pretty good, considering i'm using turtle fill(False) up() goto(-115, -45) ## inner part of mouth down() fill(True) color('#871945') drawmouth_inner() ## that looks awesome :D fill(False) up() goto(-10, -155) down() fill(True) ## draw the pink tongue color('#fbc0df') drawtongue() fill(False) up() goto(0, 250) down() color('white') ## moves the turtle out of the way so we can see the face forward(1) ## without a little arrow in the way up() ## and thus, we're done! :)