#!/usr/bin/python ### Python fuer Kids - Kapitel 12 ### # Autor: Gregor Lingl # Datum: 13. 10. 2002 # # hangman.py : Das fertige Programm # # 20. 10. 2003 : Durch ein X in der 3. Zeile von hier # in ein Xturtle-Programm konvertiert # Testenevents: # Return --> reset # Escape --> exit from Tkinter import * from xturtle import RawPen from math import sqrt import sys usingIDLE = False def hopp(strecke, winkel=0): t.left(winkel) t.up() t.forward(strecke) t.down() t.right(winkel) def quadrat(laenge, strich = 2, rand='black', fuell = None, schiefe = 0): t.left(schiefe) hopp(laenge/sqrt(2),225) t.width(strich) t.color(rand) if fuell != None: t.fill(1) for i in range(4): t.forward(laenge) t.left(90) if fuell != None: t.color(fuell) t.fill(0) hopp(laenge/sqrt(2),45) t.right(schiefe) def auge(groesse, strich=2, farbe="blue", schiefe=0): quadrat(groesse, strich, schiefe=schiefe) quadrat(groesse/sqrt(2), strich=1, rand=farbe, fuell=farbe,schiefe=schiefe+45) def nase(groesse, farbe = "red", schiefe = 0): quadrat(groesse, rand = farbe, fuell=farbe, schiefe = schiefe+45) def squiley(groesse, strich=2): e = groesse/6.0 l = 1.5*e*sqrt(2) nase(e*sqrt(2)) hopp(l,135) auge(e) hopp(-l,135) hopp(l,45) auge(e) hopp(-l,45) hopp(-l,45) t.width(3) t.color("black") t.forward(3*e) hopp(l,135) quadrat(6*e, strich=strich) def mann(): global fehltipps if fehltipps == 0: t.width(5) t.up() t.forward(25) t.left(90) squiley(50, strich=5) t.right(90) t.up() t.forward(25) t.down() t.forward(20) elif fehltipps == 1: t.width(20) t.forward(80) t.up() t.backward(80) t.width(20) t.down() elif fehltipps == 2: t.down() t.right(85) t.forward(12) t.left(85) t.color("blue") t.width(8) t.right(30) t.forward(75) t.up() t.backward(75) t.down() t.left(30) t.up() t.right(85) t.backward(12) t.left(85) t.color("black") t.width(20) t.down() elif fehltipps == 3: t.down() t.right(-85) t.forward(12) t.left(-85) t.color("blue") t.width(8) t.right(-30) t.forward(75) t.up() t.backward(75) t.down() t.left(-30) t.up() t.right(-85) t.backward(12) t.left(-85) t.color("black") t.width(20) t.forward(80) t.down() elif fehltipps == 4: t.color("blue") t.left(20) t.forward(80) t.up() t.backward(80) t.down() t.right(20) elif fehltipps == 5: t.color("blue") t.left(-20) t.forward(80) t.up() t.backward(80) t.down() t.right(-20) else: pass def galgen(): global fehltipps t.reset() ## t.rt(90) ## <=== obligatorisch t.tracer(0) t.up() t.goto(-100,-160) t.down() t.color("black") t.width(10) t.forward(200) t.up() t.backward(200) t.left(90) t.color("brown") t.down() t.forward(300) t.right(85) t.forward(120) t.backward(10) t.right(95) t.width(3) t.color("black") t.forward(35) wort_vorrat = """Python statement expression operator name object function branching parameter argument method syntax error loop module turtle graphics program reserved word class canvas button Label Guido van Rossum script free software Tkinter event event driven pseudocode runtime error None nirwana internet hangman interpreter """ def ersatz(wort, vorrat): alphabet = "abcdefghijklmnopqrstuvwxyz" ergebnis = "" for zeichen in wort: z = zeichen.lower() if z in vorrat or z not in alphabet: ergebnis = ergebnis + zeichen else: ergebnis = ergebnis + "." return ergebnis def zufallszeile(zeilen): from random import choice return choice(zeilen.splitlines()) def tasten_leser(event): if event.keysym == "Return": reset() return if event.keysym == "Escape": sys.exit() if fehltipps < 6: rateschritt(event.keysym) def reset(): global zielwort, fehltipps, erraten global falsche_zeichen, richtige_zeichen zielwort = zufallszeile(wort_vorrat) # print zielwort fehltipps = 0 falsche_zeichen = "" richtige_zeichen = "" erraten = 0 galgen() wort_anzeige.configure(text=ersatz(zielwort,"")) fehltipp_anzeige.configure(text="") def rateschritt(zeichen): global erraten if erraten or len(zeichen)>1: return if zeichen in zielwort.lower(): guter_schritt(zeichen) else: schlechter_schritt(zeichen) def guter_schritt(zeichen): global richtige_zeichen, erraten if zeichen not in richtige_zeichen: richtige_zeichen = richtige_zeichen + zeichen muster = ersatz(zielwort, richtige_zeichen) wort_anzeige.configure(text=muster) if muster == zielwort: erraten = 1 fehltipp_anzeige.configure(text="YOU GOT IT!") def schlechter_schritt(zeichen): global falsche_zeichen, fehltipps if zeichen not in falsche_zeichen: falsche_zeichen = falsche_zeichen + zeichen fehltipp_anzeige.configure(text = falsche_zeichen) mann() fehltipps = fehltipps + 1 if fehltipps == 6: wort_anzeige.configure(text=zielwort) fehltipp_anzeige.configure(text="DEAD!") root = Tk() cv = Canvas(root,width=300,height=400,bg = "white") cv.pack() wort_anzeige = Label(root,width=26,fg='red', text="-----", font = ("Courier",14,"bold") ) fehltipp_anzeige = Label(root, width=26, text="-", font = ("Courier",14,"bold") ) wort_anzeige.pack() fehltipp_anzeige.pack() knopf = Button(root, text="New Game", command=reset, font = ("Arial",12,"bold")) knopf.pack(side="left", expand=1, fill = "x") root.bind("", tasten_leser) root.focus_force() t = RawPen(cv) t.tracer(0) reset() if not usingIDLE: root.mainloop()