Python Hangman not working - python

So, I've finished my Hangman project for a coding class and it's stuck in a loop where it just keeps asking if you want to play, after that it defines the word to play but it also TELLS you which word to play you're going to play. I think the chained whiles and ifs have some wrong variables.
So, I beg for your help.
__author__ = 'Rodrigo Cano'
#Modulos
import random
import re
#Variables Globales
intentos = 0
incorrectos = 0
palabras = [(1,"disclosure"),(1,"thenational"),(1,"foals"),(1,"skepta"),(1,"shamir"),(1,"kanye"),
(1,"fidlar"),(1,"lcdsoundsystem"),(1,"lorde"),(1,"fkatwigs"),(1,"miguel"),(1,"rtj"),
(1,"boniver"),(1,"strokes"),(2,"vaporwave"),(2,"witchouse"),(2,"shoegaze"),(2,"memerap"),
(2,"paulblartisoursaviour"),(3,"glockenspiel"),(3,"aesthetic"),(3,"schadenfreude"),
(3,"bonvivant"),(3,"swag"),(3,"jue")]
Ascii_Art =[""]
Dibujo = ' '
palabra_a_jugar = ''
Array_Palabra = []
Nuevas_Letras = ''
letras = []
Vidas = 0
i = len(Array_Palabra)
#Funciones
def Definir_Palabra():
eleccion = int(input("Bienvenido, que categoria quiere usar:"
'\n'"1 - Musica que Escuche Mientras Lo Hacia"
'\n'"2 - Generos Musicales"
'\n'"3 - Palabras Pretenciosas"))
palabras_escogidas = [i for i in palabras if eleccion in i ]
palabra_a_jugar = str(palabras_escogidas[random.randint(0,len(palabras_escogidas))].__getitem__(1))
Array_Palabra = len(palabra_a_jugar) * ['*']
return palabra_a_jugar, Array_Palabra
def Letras_En_Palabra(letra):
letras = [i for i, x in enumerate(palabra_a_jugar) if x == letra]
for i in range (0, len(letras)):
Array_Palabra[letras] = letra
return letras,Array_Palabra
def Letras_Jugadas(letra):
for i in range(0,len(Nuevas_Letras)):
Nuevas_Letras = re.findall(letra,Nuevas_Letras[i])
if Nuevas_Letras != []:
return 1
return Nuevas_Letras
def Eleccion():
Choice = input("Quiere Jugar?")
if Choice == 'si':
Choice = 1
elif Choice == 'no':
Choice = 0
return Choice
# Juego
Choice = Eleccion()
def Juego(Choice):
i = len(Array_Palabra)
while Choice == 1:
print(Definir_Palabra())
while i != 0 :
tiro = str.lower(input("adivine una letra"))
if Letras_Jugadas(tiro) != 1:
Nuevas_Letras = Nuevas_Letras + tiro
letras = Letras_En_Palabra(tiro)
if Letras_Jugadas(tiro) != []:
i = len(letras) - 1
print("Letras Utilizadas",Nuevas_Letras)
print(Letras_En_Palabra(tiro))
else:
Vidas = Vidas + 1
Dibujo += Ascii_Art[Vidas]
print("WROOOONG")
print(Dibujo)
print("Letras Utilizadas",Nuevas_Letras)
if Vidas ==9:
i = 0
else:
print("Letra ya Juagada",Nuevas_Letras)
Eleccion()
Juego(Choice)

The last line in your Juego should be Choice = Eleccion(), otherwise, you're not actually changing the value of Choice, so the loop continues indefinitely.
def Juego(Choice):
i = len(Array_Palabra)
while Choice == 1:
print(Definir_Palabra())
while i != 0 :
tiro = str.lower(input("adivine una letra"))
if Letras_Jugadas(tiro) != 1:
Nuevas_Letras = Nuevas_Letras + tiro
letras = Letras_En_Palabra(tiro)
if Letras_Jugadas(tiro) != []:
i = len(letras) - 1
print("Letras Utilizadas",Nuevas_Letras)
print(Letras_En_Palabra(tiro))
else:
Vidas = Vidas + 1
Dibujo += Ascii_Art[Vidas]
print("WROOOONG")
print(Dibujo)
print("Letras Utilizadas",Nuevas_Letras)
if Vidas ==9:
i = 0
else:
print("Letra ya Juagada",Nuevas_Letras)
"""
>>>> CHANGED <<<<
"""
Choice = Eleccion()
Otherwise, the way you had it simply calls the function Eleccion but doesn't return the value to the Choice variable in scope of Juego function.

Just need to indent :)
import random
# defining the main method
def main():
print "Hello Welcome to Python Hangman!!!"
random_word()
user_input()
# defining the dictionary_list to be used as the guessing word
def random_word():
dictionary_list= ["ant", "bath", "car", "dog", "electric", "foil", "grape", "heat", "ice", "jolly",
"knight", "lemon", "money", "need", "open", "park", "quote", "rough", "salty",
"teach", "under", "village", "warmth", "xavier", "yelp", "zipper"]
# making rand global so it can be used within deifferent functions
global rand
# randomly choosing a word from the dictionary_list and assign to the variable rand
rand = random.choice(dictionary_list)
return rand
# user guessing
def user_input():
guesses = 0
wrong_guess = 0
guess_left = 10
correct_letters_list = ""
wrong_letters_list =""
print "You have \033[1;34;15m 10 \033[0;30;15m guesses"
#getting the length of the word
length = len(rand)
print "The word is: " + "\033[1;35;15m" + str(length) + "\033[0;30;15m" + " characters long"
# loops around until the user has used all their 6 guesses are used up
while guesses < 10 :
guess = raw_input("Guess a Letter [a-z]: ").lower()
# stop case sensitivity
# if the letter guessed by the user is in rand string print correct else print wrong
if guess in rand:
correct_letters_list += guess
print "\033[1;32;15mcorrect"
print "correct letters:"
print "\033[0;30;15m" + correct_letters_list
print "incorrect letters:"
print "\033[0;30;15m" + wrong_letters_list
# each time the user guesses + 1 to the guesses tally
guesses +=1
guess_cal = guess_left - guesses
print "You have: " + str(guess_cal) + " guesses left"
# if rand contains guess more than once tell user
if rand.count(guess) > 1 :
print "The word contains the letter " + str(guess) + " " + "\033[1;36;15m" + str(rand.count(guess)) + "\033[0;30;15m" + " times"
else:
wrong_letters_list += guess
print "\033[1;31;15mwrong"
print "incorrect letters:"
print "\033[0;30;15m" + wrong_letters_list
print "correct letters:"
print "\033[0;30;15m" + correct_letters_list
guesses += 1
guess_cal = guess_left - guesses
print "You have: " + str(guess_cal) + " guesses left"
wrong_guess += 1
if wrong_guess == 1:
print "________ "
print "| | "
print "| "
print "| "
print "| "
print "| "
if wrong_guess == 2:
print "________ "
print "| | "
print "| 0 "
print "| "
print "| "
print "| "
if wrong_guess == 3:
print "________ "
print "| | "
print "| 0 "
print "| / "
print "| "
print "| "
if wrong_guess == 4:
print "________ "
print "| | "
print "| 0 "
print "| /| "
print "| "
print "| "
if wrong_guess == 5:
print "________ "
print "| | "
print "| 0 "
print "| /|\ "
print "| "
print "| "
if wrong_guess == 6:
print "________ "
print "| | "
print "| 0 "
print "| /|\ "
print "| / "
print "| "
if wrong_guess >= 7:
print "________ "
print "| | "
print "| 0 "
print "| /|\ "
print "| / \ "
print "| "
choice = raw_input("Do you wish to guess the word? (Y/N): ").lower()
if choice == 'y':
word = raw_input("Please enter the word: ").lower()
if word == rand:
print "Well Done you Guessed Correctly, the word was: " + rand
# if the user has guessed correctly + 10 to the guesses tally to end the game
guesses += 10
else:
print "Incorrect, Game Over!! The word was: " + rand
guesses += 10
# if user chooses n continue with the game
if choice == 'n':
continue
# if the user has used up all their 10 guesses print Game Over!!
if guesses == 10:
print "End of Game you ran out of guesses!!!"
if __name__ == "__main__":
main()

Related

Why my winner check function does not work correctly?

I am working on connect4 game, now I am on winner checking part, but the winnercheck function does not work correctly. How to fix that?
In pycharm editor it says that the variable winner is not used even it is used. And after four same digits verticaly it is not printing who is the winner. I am not sure how to fix it.
Thank you!
from termcolor import colored
field = [[" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "]]
def drawField(field):
for row in range(11):
if row % 2 == 0:
rowIndex = int(row / 2)
for column in range(13):
if column % 2 == 0:
columnIndex = int(column / 2)
if column == 12:
print(field[rowIndex][columnIndex])
else:
print(field[rowIndex][columnIndex], end="")
else:
print("|", end="")
else:
print("-------------")
def reset():
for i in range(6):
for b in range(7):
field[i][b] = " "
drawField(field)
Player = 1
def winnerCheck(characters):
maxSQ = 0
char = False
sq = 0
for i in characters:
if i != char:
char = i
sq = 1
else:
sq += 1
if sq > maxSQ:
maxChar = char
maxSQ = sq
if maxChar == "X" or maxChar == "O":
if maxSQ == 4:
winner = 0
if maxChar == "X":
winner = "1"
else:
winner = "2"
print("--------------------------------------")
print("| The winner is player", winner, end="")
print(" |")
print("--------------------------------------")
while True:
rowIndex = False
currentChoice = False
print("Player turn:", Player)
column = int(input("Please enter a column: ")) - 1
if column <= 6:
print(True)
else:
print("You can choose numbers only between 1 and 7 included!")
continue
if Player == 1:
for i in range(5, -1, -1):
if field[0][column] != " ":
print("This column is already filled up! You can't put here anymore!")
full = 0
for b in range(7):
if field[0][b] != " ":
full += 1
if full == 7:
print("There is no winner!")
reset()
break
else:
if field[i][column] != " ":
continue
else:
field[i][column] = colored("X", "red")
drawField(field)
Player = 2
currentChoice = field[i][column]
rowIndex = i
break
else:
for i in range(5, -1, -1):
if field[0][column] != " ":
print("This column is already filled up! You can't put here anymore!")
full = 0
for b in range(7):
if field[0][b] != " ":
full += 1
if full == 7:
print("There is no winner!")
reset()
break
else:
if field[i][column] != " ":
continue
else:
field[i][column] = colored("O", "green")
drawField(field)
currentChoice = field[i][column]
Player = 1
rowIndex = i
break
characters = []
for i in range(6):
print(i)
characters.append(field[i][column])
print(characters)
winnerCheck(characters)
The main issue is in these lines of code:
if maxChar == "X" or maxChar == "O":
and a bit further down:
if maxChar == "X":
These conditions will never be true because your characters are never "X" or "O", but are ANSI escape codes generated by calls to colored, like '\x1b[31mX\x1b[0m'
This is a mixup between "model" and "view" aspects of your code.
The best fix is to not store the result of colored() in your field list. Instead just store plain "X" and "O" values. Then in your drawField function, do the necessary to bring color to your output.
So change:
field[i][column] = colored("X", "red")
To
field[i][column] = "X"
and make the same change for where you have colored("O", "green").
Then in drawField change:
if column == 12:
print(field[rowIndex][columnIndex])
else:
print(field[rowIndex][columnIndex], end="")
to:
ch = field[rowIndex][columnIndex]
output = colored(ch, "red" if ch == "X" else "green")
if column == 12:
print(output)
else:
print(output, end="")
Some other remarks:
Your code will only detect a vertical four in a row. Currently you only pass the information about one column to winnerCheck. You'll want to extend this function to detect also horizontal and diagonal wins...
There is unnecessary code repetition. Like the two blocks that are in the if Player == 1 .... else construct. You should try to make that just one block, as the only difference is what you assign to field[i][column].
As mentioned in comments you have a winner=0 that has no effect, since you immediately assign a different value to it. You can initialise winner in one go:
winner = "1" if maxChar == "X" else "2"
The check for a draw should not require that a user makes an invalid move. You should detect the draw when the last valid move has been made.

Connect4 in Python - Pieces doesn't drop into the board

I'm writing Connect4 in Python. My problem is the function of player_one and player_two don't seem to be working, so the no piece is drop onto the board after player was asked to give input. I also wonder if my code to return the board after player has dropped is correct; I suspect that my present code doesn't return the board updated with a player's piece but being new, I'm not sure what to do.
Please take a look!
def field(field):
for w in range(14):
if w % 2 == 0:
usable_w = int(w/2)
for h in range(15):
if h % 2 == 0:
usable_h = int(h/2)
if h != 14:
print(field[usable_h][usable_w], end="")
else:
print(" ")
else:
print("|", end="")
else:
print("_"*13)
PlayField = [[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "]]
field(PlayField)
def player_one(field):
MoveColumn = int(input("Enter the column 1 - 7\n"))
MoveRow = 6
for row in PlayField:
if MoveColumn >= 1 and MoveColumn <= 7:
if PlayField[MoveColumn-1][MoveRow] == " ":
PlayField[MoveColumn-1][MoveRow] = "X"
break
MoveRow -= 1
return field(PlayField)
else:
print("Column outside range, please enter valid move")
def player_two(field):
MoveColumn = int(input("Enter the column 1 - 7\n"))
MoveRow = 6
for row in PlayField:
if MoveColumn >= 1 and MoveColumn <= 7:
if PlayField[MoveColumn-1][MoveRow] == " ":
PlayField[MoveColumn-1][MoveRow] = "O"
break
MoveRow -= 1
return field(PlayField)
else:
print("Column outside range, please enter valid move")
def launch_play():
while True:
Player = 1
print("Player's turn", Player)
player_one(field)
player_two(field)
launch_play()
Well, your player_... functions contain suitable statements, but in an unsuitable order; and since they operate on the global PlayField, returning it is pointless. Besides that, it's ugly having two nearly identical functions. A rearranged variant where the only difference between player one and two is passed as an argument (instead of the useless field) works as you expect:
def player(xo):
while (MoveColumn := int(input("Enter the column 1 - 7\n"))) < 1 or \
MoveColumn > 7:
print("Column outside range, please enter valid move")
MoveRow = 6
for row in PlayField:
if PlayField[MoveColumn-1][MoveRow] == " ":
PlayField[MoveColumn-1][MoveRow] = xo
field(PlayField)
break
MoveRow -= 1
In your launch_play loop you can now call
player('X')
player('O')
Now it's up to you to complete the program by checking when the game is over.
I came up with two solutions (before you modified the codes) to prevent players' turn from changing, but which couldn't work:
def player(xo):
while MoveColumn := int(input("Enter the column 1 - 7\n")):
MoveRow = 6
for row in PlayField:
if PlayField[MoveColumn-1][MoveRow] == " ":
PlayField[MoveColumn-1][MoveRow] = xo
field(PlayField)
break
Return True
MoveRow -= 1
else:
print("Column outside range, please enter valid move")
Return False
def launch_play():
while True:
Player = 'X'
print("Player's turn", Player)
player('X')
Player = '0'
print("Player's turn", Player)
player('0')
launch_play()
The other solution is to introduce player variables in the player functions (also didn't work) :
def player(xo):
while MoveColumn := int(input("Enter the column 1 - 7\n")):
MoveRow = 6
Player = 'X'
for row in PlayField:
if PlayField[MoveColumn-1][MoveRow] == " ":
PlayField[MoveColumn-1][MoveRow] = xo
field(PlayField)
break
MoveRow -= 1
Player = '0'
else:
print("Column outside range, please enter valid move")

python name not defined

this is my hangman program. it returns a "NameError: name 'a' is not defined." please help me in fixing this. thank you very much.
import random
invalid= [" ","'",".",",","'", '"', "/", "\ ", '"',";","[","]", "=", "-", "~", "`", "§","±","!","#","#","$","%","^","&","*","(",")","_","+","{","}","|",":","?",">","<","0","1","2","3","4","5","6","7","8","9"]
choice = 0
print("Welcome to HANGMAN!")
def Menu():
print("[1] Play Hangman")
print("[2] Instructions ")
print("[3] Highscores")
print("[4] Exit")
choice = int(input("Please choose from the Menu: "))
if(not(choice <=4)):
print("Choose again.")
return Menu()
return choice
while True:
choice = Menu()
if choice == 1:
print("Categories: ")
print("[1] Movies")
print("[2] Animals")
print("[3] Something Blue")
choice_category = int(input("Please Choose a Category: "))
print("-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-")
print("Difficulties:")
print("[1] Easy")
print("[2] Average")
print("[3] Difficult")
choice_difficulty = int(input("Please Choose a Difficulty: "))
superword = a(choice_category, choice_difficulty)
legitgame(superword)
elif choice == 2:
print("Let yourself be hanged by mistaking the letters.")
elif choice == 3:
readHandle = open("Scores.txt","r")
names = []
for line in readHandle:
name = line[:-1]
names.append(name)
readHandle.close()
print()
Menu()
elif choice == 4:
print("Thank you for playing.")
Menu()
hangman =[" =========="
" | |"
" O |"
" |"
" |"
" | ",
" =========="
" | |"
" O |"
" | |"
" |"
" | ",
" ========== "
" | |"
" O |"
" /| |"
" |"
" | ",
" =========="
" | |"
" O |"
" /|\ |"
" |"
" | ",
" =========="
" | |"
" O |"
" /|\ |"
" / |"
" | ",
" =========="
" | |"
" O |"
" /|\ |"
" / \ |"
" | "]
#definition function for different options in a specific category and difficulty
def a(choice_category, choice_difficulties):
if choice_category == 1:
readHandle = open("movies.txt", 'r')
lines = readHandle.readlines()
elif choice_category == 2:
readHandle = open("animals.txt", 'r')
lines = readHandle.readlines()
elif choice_category == 3:
readHandle = open("something blue.txt", 'r')
lines = readHandle.readlines()
else:
print("Please choose again.")
if choice_difficulty == 1:
word = (lines[0])
elif choice_difficulty == 2:
word = (lines[1])
elif choice_difficulty == 3:
word = (lines[2])
else:
print("Please enter valid characters.")
legitword = word[:-1].split(".")
return (random.choice(legitword))
def legitgame (meh):
length = "__" * len(meh)
characters = []
mistake = 0
while mistake < 6 and length != meh:
print(hangman[mistake])
print(length)
print("Number of wrong guesses: ", mistake)
guess = (input("Guess:")).upper()
while len(guess) != 1:
print("You have inputted multiple letters. Please input a single letter.")
guess = input("Guess: ").upper()
while guess in invalid:
print("You have inputted an invalid character. Please try again.")
guess = input ("Guess: ").upper()
while guess in characters:
print("You have already inputted this letter. Please try again.")
guess= input("Guess: ").upper()
if guess in meh:
print()
print("Fantastic! You have entered a correct letter.")
characters.append(guess)
correct = ""
for x in range (0,len(meh)):
if guess == meh[x]:
correct += guess
else:
correct += length[x]
length = correct
else:
character.append(guess)
print("Sorry. You have inputted an incorrect letter. Please try again.")
mistake += 1
if mistake >= 6:
print(hangman[6])
print("The correct word is: ", meh)
print("Sorry. You killed the guy. Your conscience is chasing you.")
print("Game over")
elif correct == meh:
print("Congratulations! You saved the puny man.")
print("You have guessed ", word, "correctly!")
win()
Menu()
def win():
readHandle = open("Scores.txt", "a")
name = input("Enter your name: ")
readHandle.write(name + "\n")
readHandle.close
menu()
I can't tell for sure with the entire code, but from the given code I assume the error is that you call a(choice_category, choice_difficulty) before you have defined it. Put the def a(... before superword = a(choice_category, choice_difficulty), and you should be good to go (if this is indeed the problem)
"a" is apparently a function in your program as you have :
def a(choice_category, choice_difficulty)
This line defines 'a' as a function that requires 2 arguments (choice_category and choice_difficulty)
You need to define the function before you can use it
You program is calling/using the function with this line
superword = a(choice_category, choice_difficulty)

connect four: asking for inputs without printing

I am making a connect four type game. I am trying to set up the simple playability of the game. I don't get an error, but it does keep sending me into a input when I want it to print out the board. When I type in a number for the column, it doesn't print anything, it just gives me another input I should fill, this continues until i exit the program.. I am trying to stay away from classes, given that I am not very good at programming these yet. I would like to know why this is happening, and what to do to fix it, or if I just need to reprogram the whole thing.
a = [" ", " ", " ", " ", " ", " ", " "]
b = [" ", " ", " ", " ", " ", " ", " "]
c = [" ", " ", " ", " ", " ", " ", " "]
d = [" ", " ", " ", " ", " ", " ", " "]
e = [" ", " ", " ", " ", " ", " ", " "]
f = [" ", " ", " ", " ", " ", " ", " "]
board = [a, b, c, d, e, f] # sets up the board
print("What is player 1's name?")
player1 = input()
print("What is player 2's name?")
player2 = input()
plays = 0
def print_board(): # prints the board
p = 0
for x in board:
for i in x:
print(i, end=" | ")
print()
p += 1
if p != 6:
print("- "*15)
else:
print()
def win(): # defines a boolean if one player has won
i = 0
k = 0
while i != 5:
while k != 6:
if board[i][k] == "o" or board[i][k] == "x":
if board[i+1][k] == board[i][k] == board[i+2][k] == board[i+3][k]:
return False
elif board[i][k] == board[i][k+1] == board[i][k+2] == board[i][k+3]:
return False
elif board[i][k] == board[i+1][k+1] == board[i+2][k+2] == board[i+3][k+3]:
return False
elif board[i][k] == board[i-1][k-1] == board[i-2][k-2] == board[i-3][k-3]:
return False
else:
return True
def play(): # defines the part you play.
if plays % 2 == 0:
player = "o"
else:
player = "x"
print_board()
x = int(input("Where would you like to put your chip?"))
i = 0
while i < 5:
if board[i][x] == " ":
if board[i+1][x] == "x" or board[i+1][x] == "o":
board[i][x] = player
print_board()
if win():
print(player+" won!")
play()
play() # runs the script
try this for your play loop - hopefully it will help you fix the win check also:
def play(): # defines the part you play.
plays = 0
while True:
if plays % 2 == 0:
player = "o"
else:
player = "x"
x = int(input("Where would you like to put your chip?"))
i = 0
for i in range(5):
if board[i][x] == " ":
if board[i+1][x] == "x" or board[i+1][x] == "o":
board[i][x] = player
else:
board[5][x] = player
print_board()
#if win():
# print(player+" won!")
# break
plays += 1
print_board()
play() # runs the script
i commented out the win check because it doesn't work yet

Hangman game code

I would like to get some help regarding the hangman game. I've created this piece of code and have spent a lot of time trying to refine it but I still can't get the correct output. Would really appreciate your help!
word = choose_word(wordlist)
letters = 'abcdefghijklmnopqrstuvwxyz'
numLetters = len(word)
print numLetters
import re
def hangman(word, numLetters):
print 'Welcome to the game, Hangman!'
print 'I am thinking of a word that is', numLetters, 'letters long'
remainingGuesses = 8
print 'You have', remainingGuesses, 'guesses left.'
letters = 'abcdefghijklmnopqrstuvwxyz'
print 'Available letters:', letters
guess = raw_input("Please guess a letter:")
def filled_word(wordy, guessy):
emptyWord = ['_']*numLetters
if wordy.find(guessy) != -1:
position = [m.start() for m in re.finditer(guessy, wordy)]
for x in position:
emptyWord[x] = guessy
strWord = ''.join(emptyWord)
print 'Good guess =', strWord
else:
strWord = ''.join(emptyWord)
print 'Oops! That letter is not in my word:', strWord
filled_word(word, guess)
emptyWord = ['_']*numLetters
print 'emptyWord =', ['_']*numLetters
while '_' in emptyWord and remainingGuesses>0:
remainingGuesses -= 1
print 'You have', remainingGuesses, 'guesses left'
letters = 'abcdefghijklmnopqrstuvwxyz'
def unused_letters(letters):
letters = 'abcdefghijklmnopqrstuvwxyz'
unusedLetters = str(list(letters).remove(guess))
letters = unusedLetters
return unusedLetters
letters = unused_letters(letters)
print 'Available letters:', letters
guess = raw_input("Please guess a letter:")
if word.find(guess) != -1:
position = [m.start() for m in re.finditer(guess, word)]
for x in position:
emptyWord[x] = guess
strWord = ''.join(emptyWord)
print 'Good guess ='+strWord
emptyWord = list(strWord)
else:
strWord = ''.join(emptyWord)
print 'Oops! That letter is not in my word:', strWord
print hangman(word, numLetters)
print '___________'
print 'Congratulations, you won!'
So the problem is that when I run this, the code runs smoothly until from the second guess onwards, I get Available letters = None instead of the specific letters.
Also, the letter I guess which does appear in the word is not stored. i.e. in guess 1, the code returns the word (for example) 'd____', but in guess 2, upon guessing 'e', the code returns the word 'e_' instead of 'd_e__'. Is it because of the assignment of variables? Of local and global variables? Am quite confused about this.
Would really appreciate the help! Thanks a lot! :)
def choose_word():
word = 'alphabeth'
return {'word':word, 'length':len(word)}
def guess_letter(word_, hidden_word_, no_guesses_, letters_):
print '---------------------------------------'
print 'You have', no_guesses_, 'guesses left.'
print 'Available letters:', letters_
guess = raw_input("Please guess a letter:")
guess = guess.lower()
if guess in letters_:
letters_ = letters_.replace(guess, '')
if guess in word_:
progress = list(hidden_word_)
character_position = -1
for character in word_:
character_position += 1
if guess == character:
progress[character_position] = guess
hidden_word_ = ''.join(progress)
print 'Good guess =', hidden_word_
else:
print 'Oops! That letter is not in my word:', hidden_word_
no_guesses_ = no_guesses_ - 1
else:
print 'The letter "', guess, '" was already used!'
no_guesses_ = no_guesses_ - 1
if hidden_word_ == word_:
print 'Congratulations, you won!'
return True
if no_guesses_ == 0 and hidden_word_ != word_:
print 'Game over! Try again!'
return False
return guess_letter(word_, hidden_word_, no_guesses_, letters_)
def hangman():
hangman_word = choose_word()
print 'Welcome to the game, Hangman!'
print 'I am thinking of a word that is', hangman_word['length'], 'letters long.'
hidden_word = ''.join(['_'] * hangman_word['length'])
no_guesses = 8
letters = 'abcdefghijklmnopqrstuvwxyz'
guess_letter(hangman_word['word'], hidden_word, no_guesses, letters)
hangman()
There are multiple errors in the code. Here it is corrected:-
import re
def unused_letters( letters, guess ): # your main problem is corrected here.
unusedLetters = list( letters )
unusedLetters.remove( guess )
letters = ''.join( unusedLetters )
return letters
def filled_word( wordy, guessy ):
if wordy.find( guessy ) != -1:
position = [m.start() for m in re.finditer( guessy, wordy )]
for x in position:
filled_word.emptyWord[x] = guessy
strWord = ''.join( filled_word.emptyWord )
print 'Good guess.'
print 'Current word: %s' % ''.join( filled_word.emptyWord )
else:
strWord = ''.join( filled_word.emptyWord )
print 'Oops! That letter is not in my word:', strWord
def hangman( word, numLetters ): # you dont need the previous check. Let all be done in the main loop
print 'Welcome to the game, Hangman!'
print 'I am thinking of a word that is', numLetters, 'letters long'
remainingGuesses = 8
letters = 'abcdefghijklmnopqrstuvwxyz'
try:
# # memoizing the current word. for more info, try to understand that functions are
# # also objects and that we are assigning a new attribute the function object here.
filled_word.emptyWord
except:
filled_word.emptyWord = ['_'] * numLetters
while '_' in filled_word.emptyWord and remainingGuesses > 0:
print 'You have', remainingGuesses, 'guesses left'
print 'Available letters:', letters
guess = raw_input( "Please guess a letter:" )
# print 'guess: %s' % guess
if guess in letters:
filled_word( word, guess )
letters = unused_letters( letters, guess )
else:
print 'You guessed: %s, which is not in Available letters: %s' % ( guess, ''.join( letters ) )
print 'Current word: %s' % ''.join( filled_word.emptyWord )
remainingGuesses -= 1
word = "godman"
print hangman( word, numLetters = len( word ) )
if '_' in filled_word.emptyWord:
print 'Ahh ! you lost....The hangman is hung'
else:
print 'Congratulations, you won!'
You can still make it better by checking if the remaining number of guesses are less than the letters to be filled, and take a decision on whether to fail the player or allow it to continue playing.
class Hangman():
def init(self):
print "Welcome to 'Hangman', are you ready to die?"
print "(1)Yes, for I am already dead.\n(2)No, get me outta here!"
user_choice_1 = raw_input("->")
if user_choice_1 == '1':
print "Loading nooses, murderers, rapists, thiefs, lunatics..."
self.start_game()
elif user_choice_1 == '2':
print "Bye bye now..."
exit()
else:
print "I'm sorry, I'm hard of hearing, could you repeat that?"
self.__init__()
def start_game(self):
print "A crowd begins to gather, they can't wait to see some real"
print "justice. There's just one thing, you aren't a real criminal."
print "No, no. You're the wrong time, wrong place type. You may think"
print "you're dead, but it's not like that at all. Yes, yes. You've"
print "got a chance to live. All you've gotta do is guess the right"
print "words and you can live to see another day. But don't get so"
print "happy yet. If you make 6 wrong guess, YOU'RE TOAST! VAMANOS!"
self.core_game()
def core_game(self):
guesses = 0
letters_used = ""
the_word = "pizza"
progress = ["?", "?", "?", "?", "?"]
while guesses < 6:
guess = raw_input("Guess a letter ->")
if guess in the_word and not in letters_used:
print "As it turns out, your guess was RIGHT!"
letters_used += "," + guess
self.hangman_graphic(guesses)
print "Progress: " + self.progress_updater(guess, the_word, progress)
print "Letter used: " + letters_used
elif guess not in the_word and not(in letters_used):
guesses += 1
print "Things aren't looking so good, that guess was WRONG!"
print "Oh man, that crowd is getting happy, I thought you"
print "wanted to make them mad?"
letters_used += "," + guess
self.hangman_graphic(guesses)
print "Progress: " + "".join(progress)
print "Letter used: " + letters_used
else:
print "That's the wrong letter, you wanna be out here all day?"
print "Try again!"
def hangman_graphic(self, guesses):
if guesses == 0:
print "________ "
print "| | "
print "| "
print "| "
print "| "
print "| "
elif guesses == 1:
print "________ "
print "| | "
print "| 0 "
print "| "
print "| "
print "| "
elif guesses == 2:
print "________ "
print "| | "
print "| 0 "
print "| / "
print "| "
print "| "
elif guesses == 3:
print "________ "
print "| | "
print "| 0 "
print "| /| "
print "| "
print "| "
elif guesses == 4:
print "________ "
print "| | "
print "| 0 "
print "| /|\ "
print "| "
print "| "
elif guesses == 5:
print "________ "
print "| | "
print "| 0 "
print "| /|\ "
print "| / "
print "| "
else:
print "________ "
print "| | "
print "| 0 "
print "| /|\ "
print "| / \ "
print "| "
print "The noose tightens around your neck, and you feel the"
print "sudden urge to urinate."
print "GAME OVER!"
self.__init__()
def progress_updater(self, guess, the_word, progress):
i = 0
while i < len(the_word):
if guess == the_word[i]:
progress[i] = guess
i += 1
else:
i += 1
return "".join(progress)
game = Hangman()
You can take an idea from my my program. RUN IT FIRST.
import random
# Starter code start
# The variable word is a random word from the text file 'words.txt'
words = list()
with open("words.txt") as f:
for line in f:
words.append(line.lower())
word = random.choice(words).strip().upper()
# This is the starter code that chooses a word
# Starter code end
letter = ''
# This is the input of letters the user will type in over and over
word_index = 0
# This is the index for the input correct word to be checked against the correct letters
correct_letters = ''
# This is the variable for the correct letters as a list, once the user types them in and they are deemed correct
correct_letters_index = 0
# This is the index to print the correct letters from, in a while statement below. This gets reset to 0 after every time the letters are printed
incorrect_letters = ''
# This is the variable to hold the incorrect letters in.
lives = 6 # ♥
# is the variable to hold the 6 lives, printed as hearts in
win_user = 0
# This is the variable that determines if the user wins or not
guessed_letters = ''
# this variable checks for repeated letters (incorrect + correct ones)
while win_user != len(word) and lives != 0: # 1 mean yes the user have win
if lives == 6:
print(
'''
|--------------------|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|_________________________________________
'''
)
elif lives == 5:
print(
'''
|--------------------|
| |
| **|**
| * ()() *
| ** ▼ **
| ** (---) **
| *****
|
|
|
|
|
|
|
|
|_________________________________________
'''
)
elif lives == 4:
print(
'''
|--------------------|
| |
| **|**
| * ()() *
| ** ▼ **
| ** (---) **
| *****
| |
| |
| |
|
|
|
|
|
|_________________________________________
'''
)
elif lives == 3:
print(
'''
|--------------------|
| |
| **|**
| * ()() *
| ** ▼ **
| ** (---) **
| *****
| \ |
| \ |
| \|
|
|
|
|
|
|_________________________________________
'''
)
elif lives == 2:
print(
'''
|--------------------|
| |
| **|**
| * ()() *
| ** ▼ **
| ** (---) **
| *****
| \ | /
| \ | /
| \|/
|
|
|
|
|
|_________________________________________
'''
)
elif lives == 1:
print(
'''
|--------------------|
| |
| **|**
| * ()() *
| ** ▼ **
| ** (---) **
| *****
| \ | /
| \ | /
| \|/
| |
| |
| /
| /
| /
|_________________________________________
'''
)
# This is the while loop that prints only if the player has remaining lives and has not won yet; It prints the ascii drawing for the hangman with the body parts
print("Remaining lives:", end=' ')
for left_lives in range(lives):
print("♥", end=' ') # This prints the remaining lives as hearts
print()
# labels all correct letters like: cake into _ _ _ _
while word_index != (len(word)) and word_index <= (len(word) - 1):
while correct_letters_index != (len(correct_letters)) and word_index <= (len(word) - 1):
if word[word_index] != correct_letters[correct_letters_index]:
correct_letters_index += 1
elif word[word_index] == correct_letters[correct_letters_index]:
print(word[word_index], end=' ')
word_index += 1
correct_letters_index = 0
if word_index <= (len(word) - 1):
print("__", end=' ')
correct_letters_index = 0
word_index += 1
print()
# This goes through the correct word, and prints out the correct letters that have been typed in, in order
# It also types out the blank spaces for letters
if win_user != len(word):
# This asks the user for another letter, and sets the checking value on the correct word back to 0 for the next run through
letter = str(input("Enter a letter: ")).upper()
if letter in guessed_letters:
print("The letter had already been guessed: " + str(letter))
if letter not in guessed_letters:
if letter not in word:
incorrect_letters += letter
guessed_letters += incorrect_letters
lives -= 1
elif letter in word:
correct_letters += letter
guessed_letters += correct_letters
for user_word in word:
if letter in user_word:
win_user += 1
# This takes in the letter if it has not previously been deemed in a variable, either correct or not.
# It also checks if the letter is correct, or not, and adds it to the variable
# If the letter has already been typed, it will also let the user know that
word_index = 0
if lives == 0:
print(
'''
|--------------------|
| |
| **|**
| * ()() *
| ** ▼ **
| ** (---) **
| *****
| \ | /
| \ | /
| \|/
| |
| |
| / \\
| / \\
| / \\
|_________________________________________
'''
)
# This prints the full hangman, and that the user loses if their lives reach 0
print("User Looses !!")
print("Incorrect letters typed: " + str(incorrect_letters))
print("The word is: " + str(word))
elif win_user == len(word):
print("The word is: " + str(word))
# This prints the user wins if all characters are printed out for the correct word
print("Incorrect letters typed: " + str(incorrect_letters))
print("User Wins !")
print(
'''
☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺
☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺☻☺
'''
)

Categories

Resources