IN_IDLE = 0 #################################################################### ## HIB Hangman game ver. 1.0 ## ## wordlist and pictures (size approx 200x300 works fine) ## ## ## ## MAXPICNUM = number of pictures indicating wrong guesses ## ## ## ## Wolfgang.Urban@schule.at 5/2004 ## #################################################################### ## ## pictures all in gif format, equal size preferred: ## 0 splashscreen, start of game ## 1..MAXPICNUM pics for increasing error number ## _lost the guy is dead ## _won the guy is saved #################################################################### #################################################################### MAXPICNUM = 10 # corresponds to last error-picture before death SOUND = 1 # play sound effects WORDFILE = "words.txt" # uppercase words (lowercase: change LETTERS below, too) BASEDIR = ".\\data\\" # directory of words and pics PICNAME = "pic" # basename of pictures LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ" # Chars assigned to buttons COUNT = "."*30 GAME_WON = "Bravo, geschafft!" # message if game won GAME_LOST = "Schade, nicht geschafft!" # message if game lost GAME_ADVICE = "Rate das Wort" # advice message during game NOOP,WON,LOST,START = -3,-2,-1,0 from Tkinter import * import random import winsound class HangManGUI(Frame): def __init__(self): self.STATE=NOOP self.root = Tk() self.root.title("HIB-Man") Frame.__init__(self,self.root) # actionframe: picture and letters actionFrame = Frame(self) picFrame = Frame(actionFrame,border=2,relief=FLAT,bg="#ffffff") self.picture = PhotoImage(file=BASEDIR+PICNAME+"0.gif") self.picLabel = Label(picFrame,image=self.picture,relief=FLAT,border=0) letterFrame = Frame(actionFrame,border=2,relief=SUNKEN) self.buttons = [0]*len(LETTERS) for x in range(len(LETTERS)): action = lambda c=LETTERS[x],xx=x: self.pressed(c,xx) self.buttons[x] = Button(letterFrame,text=LETTERS[x],font=("Arial",18), foreground="#333333",width=2,command=action) self.buttons[x].grid(row=x/5,column=x%5,padx=1,pady=1,sticky="NESW") self.picLabel.pack(anchor=S) picFrame.pack(side=LEFT,fill=BOTH,expand=1) letterFrame.pack(side=RIGHT) actionFrame.pack(side=TOP) # outputlabels self.output = Label(self,text="",font=("Arial",24,"bold"), fg="#2020f0",relief=RAISED) self.output2 = Label(self,text="",font=("Arial",16),relief=FLAT) self.output.pack(side=TOP,expand=1,fill=BOTH) self.output2.pack(side=TOP) # command buttons commandFrame = Frame(self) rb = Button(commandFrame,text="Reset",font=("Arial",10), command=self.reset) rb.pack(side=LEFT,fill=X,expand=1) qb = Button(commandFrame,text="Quit",font=("Arial",10), command=self.quit) qb.pack(side=RIGHT,fill=X,expand=0) commandFrame.pack(side=TOP,expand=1,fill=X) self.pack() self.root.update() # read words to guess self.words = [] for w in open(BASEDIR+WORDFILE,"r").readlines(): word = w.strip() if word: self.words.append(word) self.root.after(1000) self.reset() # start new game def reset(self): for b in self.buttons: b.config(state=ACTIVE) self.output2.config(text=GAME_ADVICE) self.target = random.choice(self.words) self.guessed = "" self.STATE = START self.putPic(self.STATE) self.putInfo() if not IN_IDLE: self.root.mainloop() # button x with char c was clicked def pressed(self,c,x): if self.STATE < START: return self.buttons[x].config(state=DISABLED) self.guessed += c if not c in self.target: if self.STATE<=MAXPICNUM: self.STATE += 1 # next state self.putInfo() if self.STATE > MAXPICNUM: self.STATE = LOST self.putPic("_lost") self.sound() else: self.putPic(self.STATE) self.sound("no") else: self.putInfo() self.sound("yes") # user quits game def quit(self): self.root.destroy() # update picture def putPic(self,n): self.picture.config(file=BASEDIR+PICNAME+str(n)+".gif") # update output lines def putInfo(self): if self.STATEMAXPICNUM: self.output.config(text=self.target) self.output2.config(text=GAME_LOST) return s = "" for c in self.target: if c in self.guessed: s+=c+" " else: s+='_ ' if '_' in s: self.output.config(text=s) self.output2.config(text=GAME_ADVICE+COUNT[:(MAXPICNUM-self.STATE)]) else: self.output.config(text=self.target) self.output2.config(text=GAME_WON) self.putPic("_won") self.STATE = WON self.sound() def sound(self,w=0): if not SOUND: return if self.STATE == WON: s = "won.wav" elif self.STATE == LOST: s = "lost.wav" elif w=="yes": s = "yes.wav" elif w=="no": s = "no.wav" winsound.PlaySound(BASEDIR+s,winsound.SND_ASYNC) hm = HangManGUI()