Advertisement
tom_enos

Hangman

Sep 21st, 2013
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.86 KB | None | 0 0
  1. import random
  2. import os
  3. import sys
  4. import string
  5. import zipfile
  6. import urllib.request
  7. from tkinter import *
  8. from tkinter import ttk
  9.  
  10. class Hangman(object):
  11.    
  12.     def __init__(self):
  13.         self.key = []
  14.         self.playedLetters = []
  15.         self.frameCount = 0
  16.        
  17.     def setSecret(self, path, filename, maxLength):
  18.         if os.path.isfile(path + "/" + filename):
  19.             self.secretWord = ["x"]*50
  20.             while len(self.secretWord) > maxLength:
  21.                 wordFile = open(path + "/" + filename)
  22.                 self.secretWord = list(random.choice(wordFile.readlines()).strip("\n"))
  23.                 wordFile.close()
  24.             self.key = ["_"] * len(self.secretWord)
  25.             if "'" in self.secretWord:
  26.                 self.key[self.secretWord.index("'")] = "'"
  27.         else:
  28.             print("ERROR, file or path not found")
  29.             sys.exit(0)
  30.            
  31.     def getSecretWord(self):
  32.         return "".join(self.secretWord)
  33.    
  34.     def getPlayedLetters(self):
  35.         return self.playedLetters
  36.    
  37.     def addPlayedLetter(self,letter):
  38.         if letter not in self.playedLetters:
  39.             self.playedLetters.append(letter)
  40.             return True
  41.         else:
  42.             return False
  43.        
  44.     def checkWin(self):
  45.         if (self.key == self.secretWord and self.frameCount < 7) or self.frameCount == 7:
  46.             return ("win" if (self.key == self.secretWord and self.frameCount < 7) else "loose")
  47.         else:
  48.             return "play"
  49.  
  50.     def incrementFrames(self):
  51.         self.frameCount += 1
  52.    
  53.     def getFrameCount(self):
  54.         return self.frameCount
  55.    
  56.     def inWord(self,letter):
  57.        
  58.         if self.addPlayedLetter(letter):
  59.             if letter in self.secretWord or letter.upper() in self.secretWord:
  60.                 for place in range(len(self.secretWord)):
  61.                     if letter == self.secretWord[place]:
  62.                         self.key[place] = letter
  63.                     if letter.upper() == self.secretWord[place]:
  64.                         self.key[place] = letter.upper()
  65.                 return True
  66.             else:
  67.                 self.incrementFrames()
  68.                 return False
  69.  
  70. class UIGUI(Hangman):
  71.  
  72.     def __init__(self, parent):
  73.         self.frames = ['None','self.hmFrame.create_oval(160, 205, 190, 235, width=3, fill="white", tags="man")',\
  74.                        'self.hmFrame.create_line(175, 235, 175, 250, width=3, tags="man")',\
  75.                        'self.hmFrame.create_oval(160, 240, 190, 315, width=3, fill="white", tags="man")',\
  76.                        'self.hmFrame.create_line(165, 250, 145, 280, width=3, tags="man")',\
  77.                        'self.hmFrame.create_line(185, 250, 205, 280, width=3, tags="man")',\
  78.                        'self.hmFrame.create_line(165, 305, 145, 350, width=3, tags="man")',\
  79.                        'self.hmFrame.create_line(185, 305, 205, 350, width=3, tags="man")']
  80.  
  81.         parent.title("Hangman")
  82.         self.plFrame = ttk.Frame(parent, padding="3 3 12 12")
  83.         self.plFrame.grid(column=0, row=0, sticky=(N, W, E, S))
  84.         self.plFrame.columnconfigure(0, weight=1)
  85.         self.plFrame.rowconfigure(0, weight=1)
  86.         self.hmFrame = Canvas(parent, width=400, height=650)
  87.         self.hmFrame.grid(column=0, row=0, sticky=(N, W, E, S))
  88.         self.blp = self.hmFrame.create_text(175,110,font=("Times",18))
  89.         self.dkey = self.hmFrame.create_text(200,565,font=("Times",22))
  90.         self.vi = self.hmFrame.create_text(200,525,font=("Times",16))
  91.         self.entry = Entry(self.hmFrame ,font=("Times",20))
  92.         self.reteriveDictionaries()
  93.  
  94.     def init2(self):
  95.         super().__init__()
  96.         self.setSecret("words", self.box.get(), int(self.mbox.get()))
  97.         self.hmFrame.delete("man")
  98.         self.inPlay = True
  99.         self.entry.delete(0, END)
  100.         self.vim = ""
  101.         self.button["text"] = "ReStart"
  102.         self.display()
  103.  
  104.     def reteriveDictionaries(self,):
  105.         if not os.path.isfile("ispell-enwl-3.1.20.zip"):
  106.             print("Downloading Dictionaries, Pleas Wait")
  107.             try:
  108.                 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)
  109.             except:
  110.                 print("Please check that you are connected to the internet")
  111.                 print("or manually download the file from the provided url")
  112.                 print("and place it in the same directory as this script")
  113.                 print("http://downloads.sourceforge.net/project/wordlist/Ispell-EnWL/3.1.20/ispell-enwl-3.1.20.zip?r=&ts=1379703666&use_mirror=hivelocit")
  114.                 sys.exit(0)
  115.             try:
  116.                 if not os.path.isdir("words"):
  117.                     with zipfile.ZipFile("ispell-enwl-3.1.20.zip") as zf:
  118.                         for member in zf.infolist():
  119.                             words = member.filename.split("/")
  120.                             path = "words"
  121.                             for word in words[:-1]:
  122.                                 drive, word = os.path.splitdrive(word)
  123.                                 head, word = os.path.split(word)
  124.                                 if word in (os.curdir, os.pardir, ""):
  125.                                     continue
  126.                                 path = os.path.join(path, word)
  127.                             zf.extract(member, path)
  128.             except:
  129.                 print("Something went wrong extracting the dictionary")
  130.                 sys.exit(0)
  131.         self.selectDictionary()
  132.  
  133.     def selectDictionary(self):
  134.         dfiles = []
  135.         for a in range(10):
  136.             dfiles += [each for each in os.listdir("words") if each.endswith("."+str(a))]
  137.         maxbox = [a for a in range(3,21)]
  138.         self.box = ttk.Combobox(self.hmFrame, state="readonly")
  139.         self.box["values"] = dfiles
  140.         self.box.current(0)
  141.         self.mbox = ttk.Combobox(self.hmFrame, state="readonly")
  142.         self.mbox["values"] = maxbox
  143.         self.mbox.current(2)
  144.         self.hmFrame.create_text(65, 20, text ="Select a dictionary", font=("Times",10))
  145.         self.hmFrame.create_window(65, 50, window = self.box, width = 100, height = 30)
  146.         self.hmFrame.create_text(210, 20, text ="Maximum length of words", font=("Times",10))
  147.         self.hmFrame.create_window(210, 50, window = self.mbox, width = 75, height = 30)
  148.         self.button = Button(self.hmFrame, text="Start", command=self.init2)
  149.         self.hmFrame.create_window(350, 50, window = self.button, width = 75, height = 30)
  150.  
  151.     def drawGallows(self):
  152.         self.hmFrame.create_line(50, 155, 50, 205, width=5)
  153.         self.hmFrame.create_line(175,155, 175, 205, width=3)
  154.         self.hmFrame.create_line(50, 155, 300, 155, width=5)
  155.         self.hmFrame.create_line(300, 155, 300, 480, width=5)
  156.         self.hmFrame.create_line(250, 155, 300, 205, width=5)
  157.         self.hmFrame.create_line(0, 480, 400, 480, width=5, dash=(10, 5))
  158.  
  159.     def display(self):
  160.         self.drawGallows()
  161.         self.hmFrame.create_text(175, 85, text ="Played Letter Board", font=("Times",15))
  162.         self.hmFrame.create_text(100, 625, text ="Guess a letter", font=("Times",20))
  163.         self.hmFrame.create_window(200, 625, window = self.entry, width = 30, height = 30)
  164.         self.entry.focus()
  165.         self.entry.bind("<Return>", self.validateInput)
  166.         self.updateDisplay()
  167.        
  168.     def updateDisplay(self):
  169.         self.hmFrame.itemconfig(self.blp, text="{"+",".join(self.playedLetters)+"}")
  170.         self.hmFrame.itemconfig(self.vi, text=self.vim)
  171.         self.hmFrame.itemconfig(self.dkey, text=" ".join(self.key))
  172.        
  173.     def validateInput(self,x):
  174.         if self.inPlay:
  175.             letter = self.entry.get()
  176.             if len(letter) != 1 or letter not in string.ascii_lowercase:
  177.                 self.vim = "Input must be a single lower case letters"
  178.                 self.updateDisplay()
  179.                 self.entry.delete(0, END)
  180.             else:
  181.                 self.play(letter)
  182.            
  183.     def play(self, letter):
  184.         if self.inPlay:
  185.             if self.checkWin() not in "winloose":
  186.                 if self.inWord(letter):
  187.                     self.vim = letter + " is in the word"
  188.                 else:
  189.                     self.vim = letter + " is not in the word"
  190.                     eval(self.frames[self.getFrameCount()])
  191.             if self.checkWin() == "win":
  192.                 self.vim = "You have won!"
  193.                 self.inPlay = False
  194.             elif self.checkWin() == "loose":
  195.                 self.vim = "You have lost, the word was " + self.getSecretWord()
  196.                 self.inPlay = False
  197.         self.updateDisplay()
  198.         self.entry.delete(0, END)
  199.            
  200. if __name__ == "__main__":
  201.     root = Tk()
  202.     game = UIGUI(root)
  203.     root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement