Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- import os
- import sys
- import string
- import zipfile
- import urllib.request
- from tkinter import *
- from tkinter import ttk
- class Hangman(object):
- def __init__(self):
- self.key = []
- self.playedLetters = []
- self.frameCount = 0
- def setSecret(self, path, filename, maxLength):
- if os.path.isfile(path + "/" + filename):
- self.secretWord = ["x"]*50
- while len(self.secretWord) > maxLength:
- wordFile = open(path + "/" + filename)
- self.secretWord = list(random.choice(wordFile.readlines()).strip("\n"))
- wordFile.close()
- self.key = ["_"] * len(self.secretWord)
- if "'" in self.secretWord:
- self.key[self.secretWord.index("'")] = "'"
- else:
- print("ERROR, file or path not found")
- sys.exit(0)
- def getSecretWord(self):
- return "".join(self.secretWord)
- def getPlayedLetters(self):
- return self.playedLetters
- def addPlayedLetter(self,letter):
- if letter not in self.playedLetters:
- self.playedLetters.append(letter)
- return True
- else:
- return False
- def checkWin(self):
- if (self.key == self.secretWord and self.frameCount < 7) or self.frameCount == 7:
- return ("win" if (self.key == self.secretWord and self.frameCount < 7) else "loose")
- else:
- return "play"
- def incrementFrames(self):
- self.frameCount += 1
- def getFrameCount(self):
- return self.frameCount
- def inWord(self,letter):
- if self.addPlayedLetter(letter):
- if letter in self.secretWord or letter.upper() in self.secretWord:
- for place in range(len(self.secretWord)):
- if letter == self.secretWord[place]:
- self.key[place] = letter
- if letter.upper() == self.secretWord[place]:
- self.key[place] = letter.upper()
- return True
- else:
- self.incrementFrames()
- return False
- class UIGUI(Hangman):
- def __init__(self, parent):
- self.frames = ['None','self.hmFrame.create_oval(160, 205, 190, 235, width=3, fill="white", tags="man")',\
- 'self.hmFrame.create_line(175, 235, 175, 250, width=3, tags="man")',\
- 'self.hmFrame.create_oval(160, 240, 190, 315, width=3, fill="white", tags="man")',\
- 'self.hmFrame.create_line(165, 250, 145, 280, width=3, tags="man")',\
- 'self.hmFrame.create_line(185, 250, 205, 280, width=3, tags="man")',\
- 'self.hmFrame.create_line(165, 305, 145, 350, width=3, tags="man")',\
- 'self.hmFrame.create_line(185, 305, 205, 350, width=3, tags="man")']
- parent.title("Hangman")
- self.plFrame = ttk.Frame(parent, padding="3 3 12 12")
- self.plFrame.grid(column=0, row=0, sticky=(N, W, E, S))
- self.plFrame.columnconfigure(0, weight=1)
- self.plFrame.rowconfigure(0, weight=1)
- self.hmFrame = Canvas(parent, width=400, height=650)
- self.hmFrame.grid(column=0, row=0, sticky=(N, W, E, S))
- self.blp = self.hmFrame.create_text(175,110,font=("Times",18))
- self.dkey = self.hmFrame.create_text(200,565,font=("Times",22))
- self.vi = self.hmFrame.create_text(200,525,font=("Times",16))
- self.entry = Entry(self.hmFrame ,font=("Times",20))
- self.reteriveDictionaries()
- def init2(self):
- super().__init__()
- self.setSecret("words", self.box.get(), int(self.mbox.get()))
- self.hmFrame.delete("man")
- self.inPlay = True
- self.entry.delete(0, END)
- self.vim = ""
- self.button["text"] = "ReStart"
- self.display()
- def reteriveDictionaries(self,):
- if not os.path.isfile("ispell-enwl-3.1.20.zip"):
- print("Downloading Dictionaries, Pleas Wait")
- try:
- urllib.request.urlretrieve("http://downloads.sourceforge.net/project/wordlist/Ispell-EnWL/3.1.20/ispell-enwl-3.1.20.zip?r=&ts=1379703666&use_mirror=hivelocit", "ispell-enwl-3.1.20.zip")#file_name)
- except:
- print("Please check that you are connected to the internet")
- print("or manually download the file from the provided url")
- print("and place it in the same directory as this script")
- print("http://downloads.sourceforge.net/project/wordlist/Ispell-EnWL/3.1.20/ispell-enwl-3.1.20.zip?r=&ts=1379703666&use_mirror=hivelocit")
- sys.exit(0)
- try:
- if not os.path.isdir("words"):
- with zipfile.ZipFile("ispell-enwl-3.1.20.zip") as zf:
- for member in zf.infolist():
- words = member.filename.split("/")
- path = "words"
- for word in words[:-1]:
- drive, word = os.path.splitdrive(word)
- head, word = os.path.split(word)
- if word in (os.curdir, os.pardir, ""):
- continue
- path = os.path.join(path, word)
- zf.extract(member, path)
- except:
- print("Something went wrong extracting the dictionary")
- sys.exit(0)
- self.selectDictionary()
- def selectDictionary(self):
- dfiles = []
- for a in range(10):
- dfiles += [each for each in os.listdir("words") if each.endswith("."+str(a))]
- maxbox = [a for a in range(3,21)]
- self.box = ttk.Combobox(self.hmFrame, state="readonly")
- self.box["values"] = dfiles
- self.box.current(0)
- self.mbox = ttk.Combobox(self.hmFrame, state="readonly")
- self.mbox["values"] = maxbox
- self.mbox.current(2)
- self.hmFrame.create_text(65, 20, text ="Select a dictionary", font=("Times",10))
- self.hmFrame.create_window(65, 50, window = self.box, width = 100, height = 30)
- self.hmFrame.create_text(210, 20, text ="Maximum length of words", font=("Times",10))
- self.hmFrame.create_window(210, 50, window = self.mbox, width = 75, height = 30)
- self.button = Button(self.hmFrame, text="Start", command=self.init2)
- self.hmFrame.create_window(350, 50, window = self.button, width = 75, height = 30)
- def drawGallows(self):
- self.hmFrame.create_line(50, 155, 50, 205, width=5)
- self.hmFrame.create_line(175,155, 175, 205, width=3)
- self.hmFrame.create_line(50, 155, 300, 155, width=5)
- self.hmFrame.create_line(300, 155, 300, 480, width=5)
- self.hmFrame.create_line(250, 155, 300, 205, width=5)
- self.hmFrame.create_line(0, 480, 400, 480, width=5, dash=(10, 5))
- def display(self):
- self.drawGallows()
- self.hmFrame.create_text(175, 85, text ="Played Letter Board", font=("Times",15))
- self.hmFrame.create_text(100, 625, text ="Guess a letter", font=("Times",20))
- self.hmFrame.create_window(200, 625, window = self.entry, width = 30, height = 30)
- self.entry.focus()
- self.entry.bind("<Return>", self.validateInput)
- self.updateDisplay()
- def updateDisplay(self):
- self.hmFrame.itemconfig(self.blp, text="{"+",".join(self.playedLetters)+"}")
- self.hmFrame.itemconfig(self.vi, text=self.vim)
- self.hmFrame.itemconfig(self.dkey, text=" ".join(self.key))
- def validateInput(self,x):
- if self.inPlay:
- letter = self.entry.get()
- if len(letter) != 1 or letter not in string.ascii_lowercase:
- self.vim = "Input must be a single lower case letters"
- self.updateDisplay()
- self.entry.delete(0, END)
- else:
- self.play(letter)
- def play(self, letter):
- if self.inPlay:
- if self.checkWin() not in "winloose":
- if self.inWord(letter):
- self.vim = letter + " is in the word"
- else:
- self.vim = letter + " is not in the word"
- eval(self.frames[self.getFrameCount()])
- if self.checkWin() == "win":
- self.vim = "You have won!"
- self.inPlay = False
- elif self.checkWin() == "loose":
- self.vim = "You have lost, the word was " + self.getSecretWord()
- self.inPlay = False
- self.updateDisplay()
- self.entry.delete(0, END)
- if __name__ == "__main__":
- root = Tk()
- game = UIGUI(root)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement