pythang
Hangman game in python using Tkinter
import random
import linecache
from Tkinter import *
from functools import partial
word = ''
guessed_word = ''
guessed_letters = ''
total_letters = 0
num_guessed_letters = 0
lives = 0
wins = 0
loses = 0
batman = False
class GUI():
def __init__(self, master):
grid = Grid()
self._master = master
self._canvas = Canvas(self._master, height=250, width=250)
self._canvas.grid(row=1, column=1, columnspan=7)
global word
self._label = Label(self._master, text=' ')
self._label.grid(row=2, column=1, columnspan=7)
self._alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
self._buttons = {}
self._rgrid = 3
self._cgrid = 1
for self._letter in self._alphabet:
self._command = partial(self.guess, self._letter)
self._buttons[self._letter] = Button(self._master, text=self._letter.upper(), command=self._command)
if self._rgrid == 3 or self._rgrid == 4:
self._buttons[self._letter].grid(row=self._rgrid, column=self._cgrid)
if self._cgrid == 7:
if self._rgrid == 4:
self._rgrid = 5
else:
self._rgrid = 4
self._cgrid = 0
elif self._rgrid == 5 or self._rgrid == 6:
self._buttons[self._letter].grid(row=self._rgrid, column=self._cgrid, columnspan=2)
if self._cgrid == 6:
self._cgrid = 0
if self._rgrid == 5:
self._rgrid = 6
self._cgrid = self._cgrid + 1
self._guessedWord = ''
self._guessEntry = Entry(self._master, textvariable=self._guessedWord)
self._guessEntry.grid(row=9, column=1, columnspan=5)
self._reset_b = Button(self._master, text='Reset Game', command=self.reset)
self._reset_b.grid(row=10, column=3, columnspan=3)
self._wLabel = Label(self._master, text="Wins: 0")
self._wLabel.grid(row=10, column=1, columnspan=2)
self._lLabel = Label(self._master, text="Loses: 0")
self._lLabel.grid(row=10, column=6, columnspan=2)
def guess(self, letter):
global guessed_letters
Guess(letter)
self._buttons[letter].config(state=DISABLED)
#guessed_letters = guessed_letters + letter
#print guessed_letters
def reset(self):
start_game()
for self._letter in self._alphabet:
self._buttons[self._letter].config(state=NORMAL)
self._canvas.delete("all")
self._canvas.config(bg='white')
def draw_post(self):
line1 = self._canvas.create_line(25, 200, 25, 25)
def draw_beam(self):
line2 = self._canvas.create_line(25, 25, 125, 25)
line3 = self._canvas.create_line(125, 25, 125, 30)
def draw_head(self):
head = self._canvas.create_oval(100, 30, 150, 80)
def draw_batman(self):
mask = self._canvas.create_oval(100, 30, 150, 80, fill="black")
rect = self._canvas.create_rectangle(110, 65, 140, 80, fill="white", outline="white")
outline = self._canvas.create_oval(100, 30, 150, 80)
ear1 = self._canvas.create_polygon(105, 40, 115, 15, 120, 40, fill="black")
ear2 = self._canvas.create_polygon(130, 40, 135, 15, 145, 40, fill="black")
def draw_body(self):
body = self._canvas.create_line(125, 80, 125, 160)
def draw_rightArm(self):
rightArm = self._canvas.create_line(125, 100, 150, 120)
def draw_leftArm(self):
leftArm = self._canvas.create_line(125, 100, 100, 120)
def draw_rightLeg(self):
rightLeg = self._canvas.create_line(125, 160, 150, 185)
def draw_leftLeg(self):
leftLeg = self._canvas.create_line(125, 160, 100, 185)
def set_label(self, text):
self._label.config(text=text)
def set_canvas_color(self, color):
self._canvas.config(bg=color)
def set_Wins(self, lives):
self._text = "Wins: " + str(lives)
self._wLabel.config(text=self._text)
def set_Loses(self, lives):
self._text = "Loses: " + str(lives)
self._lLabel.config(text=self._text)
def find(s, ch):
return [i for i, ltr in enumerate(s) if ltr == ch]
def get_Word():
wordlist = "words.txt"
line_numba = random.randint(1, 5)
global word
word = linecache.getline(wordlist, line_numba)
def deduct_life():
global lives
global word
global loses
global batman
if lives == 8:
gui.draw_post()
elif lives == 7:
gui.draw_beam()
elif lives == 6:
if batman == True:
gui.draw_batman()
else:
gui.draw_head()
elif lives == 5:
gui.draw_body()
elif lives == 4:
gui.draw_leftLeg()
elif lives == 3:
gui.draw_rightLeg()
elif lives == 2:
gui.draw_leftArm()
elif lives == 1:
gui.draw_rightArm()
elif lives == 0:
gui.set_label(word)
gui.set_canvas_color("red") # loss
loses = loses + 1
gui.set_Loses(loses)
lives = lives - 1
def Guess(letter):
global guessed_word
global word
global num_guessed_letters
global total_letters
global wins
if letter not in word: # Guessed incorrectly
deduct_life()
else: # Guessed correctly
indexes = find(word, letter)
gwList = guessed_word.split()
for index in indexes:
ri = (index - 2) + index
gwList[index] = letter
num_guessed_letters = num_guessed_letters + 1
guessed_word = ' '.join(gwList)
gui.set_label(guessed_word)
if num_guessed_letters == total_letters: # Win
wins = wins + 1
gui.set_canvas_color("green")
gui.set_Wins(wins)
def start_game():
global total_letters
global num_guessed_letters
global guessed_word
global lives
get_Word()
total_letters = len(word) - 1
guessed_word = '_ ' * total_letters
gui.set_label(guessed_word)
num_guessed_letters = 0
lives = 8
root = Tk()
root.title("Hangman")
gui = GUI(root)
start_game()
root.mainloop()