Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I changed hangman.py into a class, instead of using globals! #6

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
341 changes: 167 additions & 174 deletions hangman.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,181 +6,174 @@
import random

pygame.init()
winHeight = 480
winWidth = 700
win=pygame.display.set_mode((winWidth,winHeight))
#---------------------------------------#
# initialize global variables/constants #
#---------------------------------------#
BLACK = (0,0, 0)
WHITE = (255,255,255)
RED = (255,0, 0)
GREEN = (0,255,0)
BLUE = (0,0,255)
LIGHT_BLUE = (102,255,255)

btn_font = pygame.font.SysFont("arial", 20)
guess_font = pygame.font.SysFont("monospace", 24)
lost_font = pygame.font.SysFont('arial', 45)
word = ''
buttons = []
guessed = []
hangmanPics = [pygame.image.load('hangman0.png'), pygame.image.load('hangman1.png'), pygame.image.load('hangman2.png'), pygame.image.load('hangman3.png'), pygame.image.load('hangman4.png'), pygame.image.load('hangman5.png'), pygame.image.load('hangman6.png')]

limbs = 0


def redraw_game_window():
global guessed
global hangmanPics
global limbs
win.fill(GREEN)
# Buttons
for i in range(len(buttons)):
if buttons[i][4]:
pygame.draw.circle(win, BLACK, (buttons[i][1], buttons[i][2]), buttons[i][3])
pygame.draw.circle(win, buttons[i][0], (buttons[i][1], buttons[i][2]), buttons[i][3] - 2
)
label = btn_font.render(chr(buttons[i][5]), 1, BLACK)
win.blit(label, (buttons[i][1] - (label.get_width() / 2), buttons[i][2] - (label.get_height() / 2)))

spaced = spacedOut(word, guessed)
label1 = guess_font.render(spaced, 1, BLACK)
rect = label1.get_rect()
length = rect[2]

win.blit(label1,(winWidth/2 - length/2, 400))

pic = hangmanPics[limbs]
win.blit(pic, (winWidth/2 - pic.get_width()/2 + 20, 150))
pygame.display.update()


def randomWord():
file = open('words.txt')
f = file.readlines()
i = random.randrange(0, len(f) - 1)

return f[i][:-1]


def hang(guess):
global word
if guess.lower() not in word.lower():
return True
else:
return False


def spacedOut(word, guessed=[]):
spacedWord = ''
guessedLetters = guessed
for x in range(len(word)):
if word[x] != ' ':
spacedWord += '_ '
for i in range(len(guessedLetters)):
if word[x].upper() == guessedLetters[i]:
spacedWord = spacedWord[:-2]
spacedWord += word[x].upper() + ' '
elif word[x] == ' ':
spacedWord += ' '
return spacedWord


def buttonHit(x, y):
for i in range(len(buttons)):
if x < buttons[i][1] + 20 and x > buttons[i][1] - 20:
if y < buttons[i][2] + 20 and y > buttons[i][2] - 20:
return buttons[i][5]
return None


def end(winner=False):
global limbs
lostTxt = 'You Lost, press any key to play again...'
winTxt = 'WINNER!, press any key to play again...'
redraw_game_window()
pygame.time.delay(1000)
win.fill(GREEN)

if winner == True:
label = lost_font.render(winTxt, 1, BLACK)
else:
label = lost_font.render(lostTxt, 1, BLACK)

wordTxt = lost_font.render(word.upper(), 1, BLACK)
wordWas = lost_font.render('The phrase was: ', 1, BLACK)

win.blit(wordTxt, (winWidth/2 - wordTxt.get_width()/2, 295))
win.blit(wordWas, (winWidth/2 - wordWas.get_width()/2, 245))
win.blit(label, (winWidth / 2 - label.get_width() / 2, 140))
pygame.display.update()
again = True
while again:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYDOWN:
again = False
reset()


def reset():
global limbs
global guessed
global buttons
global word
for i in range(len(buttons)):
buttons[i][4] = True

limbs = 0
guessed = []
word = randomWord()

#MAINLINE


# Setup buttons
increase = round(winWidth / 13)
for i in range(26):
if i < 13:
y = 40
x = 25 + (increase * i)
else:
x = 25 + (increase * (i - 13))
y = 85
buttons.append([LIGHT_BLUE, x, y, 20, True, 65 + i])
# buttons.append([color, x_pos, y_pos, radius, visible, char])

word = randomWord()
inPlay = True

while inPlay:
redraw_game_window()
pygame.time.delay(10)

for event in pygame.event.get():
if event.type == pygame.QUIT:
inPlay = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
inPlay = False
if event.type == pygame.MOUSEBUTTONDOWN:
clickPos = pygame.mouse.get_pos()
letter = buttonHit(clickPos[0], clickPos[1])
if letter != None:
guessed.append(chr(letter))
buttons[letter - 65][4] = False
if hang(chr(letter)):
if limbs != 5:
limbs += 1
else:
end()
else:
print(spacedOut(word, guessed))
if spacedOut(word, guessed).count('_') == 0:
end(True)

class Hangman():
def __init__(self):
self.winHeight = 480
self.winWidth = 700
self.win=pygame.display.set_mode((self.winWidth,self.winHeight))
self.BLACK = (0,0, 0)
self.WHITE = (255,255,255)
self.RED = (255,0, 0)
self.GREEN = (0,255,0)
self.BLUE = (0,0,255)
self.LIGHT_BLUE = (102,255,255)

self.btn_font = pygame.font.SysFont("arial", 20)
self.guess_font = pygame.font.SysFont("monospace", 24)
self.lost_font = pygame.font.SysFont('arial', 45)
self.word = ''
self.buttons = []
self.guessed = []
self.hangmanPics = [pygame.image.load('hangman0.png'), pygame.image.load('hangman1.png'), pygame.image.load('hangman2.png'), pygame.image.load('hangman3.png'), pygame.image.load('hangman4.png'), pygame.image.load('hangman5.png'), pygame.image.load('hangman6.png')]

self.limbs = 0


def redraw_game_window(self):
self.win.fill(self.GREEN)
# Buttons
for i in range(len(self.buttons)):
if self.buttons[i][4]:
pygame.draw.circle(self.win, self.BLACK, (self.buttons[i][1], self.buttons[i][2]), self.buttons[i][3])
pygame.draw.circle(self.win, self.buttons[i][0], (self.buttons[i][1], self.buttons[i][2]), self.buttons[i][3] - 2
)
label = self.btn_font.render(chr(self.buttons[i][5]), 1, self.BLACK)
self.win.blit(label, (self.buttons[i][1] - (label.get_width() / 2), self.buttons[i][2] - (label.get_height() / 2)))

spaced = self.spacedOut(self.word, self.guessed)
label1 = self.guess_font.render(spaced, 1, self.BLACK)
rect = label1.get_rect()
length = rect[2]

self.win.blit(label1,(self.winWidth/2 - length/2, 400))

pic = self.hangmanPics[self.limbs]
self.win.blit(pic, (self.winWidth/2 - pic.get_width()/2 + 20, 150))
pygame.display.update()


def randomWord(self):
file = open('words.txt')
f = file.readlines()
i = random.randrange(0, len(f) - 1)

return f[i][:-1]


def hang(self, guess):
if guess.lower() not in self.word.lower():
return True
else:
return False


def spacedOut(self, word, guessed=[]):
spacedWord = ''
guessedLetters = guessed
for x in range(len(word)):
if word[x] != ' ':
spacedWord += '_ '
for i in range(len(guessedLetters)):
if word[x].upper() == guessedLetters[i]:
spacedWord = spacedWord[:-2]
spacedWord += word[x].upper() + ' '
elif word[x] == ' ':
spacedWord += ' '
return spacedWord


def buttonHit(self, x, y):
for i in range(len(self.buttons)):
if x < self.buttons[i][1] + 20 and x > self.buttons[i][1] - 20:
if y < self.buttons[i][2] + 20 and y > self.buttons[i][2] - 20:
return self.buttons[i][5]
return None


def end(self, winner=False):
lostTxt = 'You Lost, press any key to play again...'
winTxt = 'WINNER!, press any key to play again...'
self.redraw_game_window()
pygame.time.delay(1000)
self.win.fill(self.GREEN)

if winner == True:
label = self.lost_font.render(winTxt, 1, self.BLACK)
else:
label = self.lost_font.render(lostTxt, 1, self.BLACK)

wordTxt = self.lost_font.render(self.word.upper(), 1, self.BLACK)
wordWas = self.lost_font.render('The phrase was: ', 1, self.BLACK)

self.win.blit(wordTxt, (self.winWidth/2 - wordTxt.get_width()/2, 295))
self.win.blit(wordWas, (self.winWidth/2 - wordWas.get_width()/2, 245))
self.win.blit(label, (self.winWidth / 2 - label.get_width() / 2, 140))
pygame.display.update()
again = True
while again:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYDOWN:
again = False
self.reset()


def reset(self):
for i in range(len(self.buttons)):
self.buttons[i][4] = True

self.limbs = 0
self.guessed = []
self.word = self.randomWord()

#MAINLINE


# Setup buttons
def run(self):
increase = round(self.winWidth / 13)
for i in range(26):
if i < 13:
y = 40
x = 25 + (increase * i)
else:
x = 25 + (increase * (i - 13))
y = 85
self.buttons.append([self.LIGHT_BLUE, x, y, 20, True, 65 + i])
# buttons.append([color, x_pos, y_pos, radius, visible, char])

self.word = self.randomWord()
inPlay = True

while inPlay:
self.redraw_game_window()
pygame.time.delay(10)

for event in pygame.event.get():
if event.type == pygame.QUIT:
inPlay = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
inPlay = False
if event.type == pygame.MOUSEBUTTONDOWN:
clickPos = pygame.mouse.get_pos()
letter = self.buttonHit(clickPos[0], clickPos[1])
if letter != None:
self.guessed.append(chr(letter))
self.buttons[letter - 65][4] = False
if self.hang(chr(letter)):
if self.limbs != 5:
self.limbs += 1
else:
self.end()
else:
print(self.spacedOut(self.word, self.guessed))
if self.spacedOut(self.word, self.guessed).count('_') == 0:
self.end(True)
hangman = Hangman()
hangman.run()
pygame.quit()

# always quit pygame when done!