Hangman from Python 2 to Python 3 - python

sRealWord = input("Write the Hangman Word in Capital Letters: ")
lShownWord = ["_"] * len(sRealWord)
sInput = ""
iAllowedGuesses = 10
iLetterNumber = 0 #was []
iRightGuesses = 0 #was []
print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
print("Let the Game Begin!")
print("Type END to close game, or complete your 10 guesses")
while(sInput != "END" and iAllowedGuesses != 0):
print("The word you're looking for is: " + str(lShownWord)) ##FIXED
print("You have: " + str(iAllowedGuesses) + " guesses left") ##FIXED
sInput = input("Enter letter in Capital Letters: ")
iAllowedGuesses -= 1 ##VALUE 1 ##FIXED
while(iLetterNumber < len(sRealWord)) : **###THIS IS NOT WORKING**
if (sRealWord[iLetterNumber] == sInput) :
lShownWord[iLetterNumber] == sInput
iRightGuesses += 1
iLetterNumber += 1
iLetterNumber = 0
elif (iRightGuesses == len(sRealWord)): ###**THIS IS NOT WORKING**
print("Woho!, You've won!")
elif (iAllowedGuesses == 0):
print("You are out of guesses, Game Over!") ###fixed
break
I decided to take an old Hangman code from Python 2 and migrate into Python 3 for practice.
The lines that I think are preventing the code from working correctly are commented out and in bold.
What am I missing or doing wrong in the code or those lines that needs to be done differently or fixed in order for the game to work?
FYI
The output for running out of guesses is working. Although, the output of getting right guesses is not working, therefore, when you get the word right it just continues as if they are wrong.

There are multiple issues that I see. But none seem to have to do with python2 vs python3.
You probably want to assign the sInput to the lShownWord[iLetterNumber] if it is correct. For that, you need only a single =.
There is no point in incrementing iLetterNumber right before setting it to zero. I assume what you want to do is check every letter of the word, every time the user enters a word. You can do that with a while loop and resetting the variable manually, but it's more idiomatic and slightly leass error prone with a for loop. The for loop resets the counter variable automatically, and increments it every loop iteration.
Careful with the indentation. You don't want to first have the user try iAllowedGuesses times before showing the correct characters. Both the while loop and the ifs were in the wrong place. And once you put the if statements to the correct level of indentation, elif does not make sense there anymore.
You probably also want to break if the user has won.
This leaves us with this code.
sRealWord = input("Write the Hangman Word in Capital Letters: ")
lShownWord = ["_"] * len(sRealWord)
sInput = ""
iAllowedGuesses = 10
iRightGuesses = 0 #was []
print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
print("Let the Game Begin!")
print("Type END to close game, or complete your 10 guesses")
while(sInput != "END" and iAllowedGuesses != 0):
print("The word you're looking for is: " + str(lShownWord)) ##FIXED
print("You have: " + str(iAllowedGuesses) + " guesses left") ##FIXED
sInput = input("Enter letter in Capital Letters: ")
iAllowedGuesses -= 1 ##VALUE 1 ##FIXED
for iLetterNumber in range(len(sRealWord)) :
if (sRealWord[iLetterNumber] == sInput) :
lShownWord[iLetterNumber] = sInput
iRightGuesses += 1
if (iRightGuesses == len(sRealWord)):
print("Woho!, You've won!")
break
if (iAllowedGuesses == 0):
print("You are out of guesses, Game Over!")
break

Related

how to add if the statement is true

I have made a basic number guessing python game in which we have a number in mind and the ai will try to guess it but when I ran it , it just asks me the same number. What should I do? I have tried to use many things but it doesn't work.
import random
print("""
Hello there my friend
I am an AI
I have been made for a very Specific game
and i would like you to play
It is an number guesser
You will think of a number
and I will try to guess it
and you would say higher or lower
LEts Start
""")
print("Okk so what is the range?:")
rang = int(input())
print("Lets Start. Say (h) for higher and (l) for Lower and (c) for Correct!")
aig = random.randint(1, rang)
print("Is " + str(aig) + "the number?")
newag = 1
def newter():
newag - 1
def fewter():
newag + 1
while True:
letter = input()
if letter == "h":
fewter()
print("Is " + str(newag) + "the number?")
if letter == "l":
newter()
print("Is " + str(newag) + "the number?")
if letter == "c":
print("Finnally i got that Right")
else:
print("Sorry but i cant understand")
Try in newter and fewter put global newag in the beginning of the function, so it will permanently change the value of newag instead of discarding it after the function.
also you need to change newag - 1 and newag + 1 to newag -= 1 (newag = newag - 1) and newag += 1 (newag = newag + 1) to actually change the value, otherwise you are just saying what is newag minus one? and then it gets rid of the result.

Hangman Issue: How do I make my loop reset when the letter entered is not present and how do I make the letter appear more than once in the word?

The word_chosen is "apple". However, when I enter the letter p, it only appears once in the word. I would also like to make my loop reset when the letter entered is not correct.
def guesses():
guess = 0
hangman_word = "_____"
while guess < 5:
guess_player = input("What is your letter? ")
for i in range(len(word_chosen)):
if guess_player == word_chosen[i]:
guess_player = (hangman_word[:i]) + word_chosen[i] + hangman_word[i + 1:]
print(guess_player)
continue
elif guess_player != word_chosen[i]:
guess += 1
Some issues:
The following assignment is wrong:
guess_player = (hangman_word[:i]) + word_chosen[i] + hangman_word[i + 1:]
You should not update guess_player which is the input letter. Instead you should update hangman_word. So:
hangman_word = (hangman_word[:i]) + word_chosen[i] + hangman_word[i + 1:]
The following condition will always be true when the execution gets there:
elif guess_player != word_chosen[i]:
The opposite was already checked in the preceding if statement, so the only possibility left is that the guess was wrong. No need to test that again.
guess += 1 should not appear within the loop. If the guess does not match the first letter, that doesn't mean it cannot still match with the second letter. So it is wrong to increment this counter when the comparison has not yet been made with all remaining letters of the secret word.
You can make use of the in operator to check whether there is at least one occurrence of the guessed letter:
if guess_player in word_chosen:
# ... here comes your loop to update `hangman_word` ... (without `elif`)
else:
guess += 1
The while loop should exit not only when the player has made five wrong guesses, but also if the player has found the word! You can do that as follows:
while guess < 5 and "_" in hangman_word:
When the while loop exits, you should probably report on the outcome of the game. Was it a success or not? It could be:
if "_" in hangman_word:
print("You guessed 5 times wrong. Game over.")
else:
print("You guessed the word. Well done!")
There should probably be some message when the player repeats a good guess a second time (optional).
Here is your code with corrections for the above points:
def guesses():
guess = 0
hangman_word = "_____"
while guess < 5 and "_" in hangman_word:
guess_player = input("What is your letter? ")
if guess_player in hangman_word:
print("But...but... you already guessed that letter!?")
elif guess_player in word_chosen:
print("Good going!")
for i in range(len(word_chosen)):
if guess_player == word_chosen[i]:
hangman_word = (hangman_word[:i]) + word_chosen[i] + hangman_word[i + 1:]
else:
print("That letter does not occur in the word.")
guess += 1
print(hangman_word)
if "_" in hangman_word:
print("You guessed 5 times wrong. Game over.")
else:
print("Well done!")
A couple aspects of the code can be improved.
def guesses():
# PreEnter the word for referece
word_chosen = "hangman"
guess = 0
# Creating a list instead of a string, to be able to update it, rather than creating new ones.
hangman_word = ["_" for _ in range(len(word_chosen))]
# Storing entered letters in a list for fair play in case wrong letters are entered.
entered_letters = []
while guess < 5:
guess_player = input("Enter a Letter: ")
# Checking if enterd string contains a single letter
if len(guess_player) > 1:
print("You can only enter one letter at a time.")
continue
if guess_player in entered_letters:
print("You already guessed that letter")
continue
# Using for loop only after checking if the letter is in the word.
elif guess_player in word_chosen:
for i in range(len(word_chosen)):
if guess_player == word_chosen[i]:
hangman_word[i] = guess_player
else:
print("That was an incorrect choice!")
guess += 1
# appending the entered letter to the list of entered letters.
entered_letters.append(guess_player)
# Using "".join to print the string from the list.
word = "".join(hangman_word)
print(word)
# Checking if the word is complete.
if word == word_chosen:
return "You Win!"
# If the player runs out of guesses, the game is over.
return "You Lose!"
print(guesses())
Since you are a beginner, try understanding the code through comments and see if you can figure out which aspects of your code I altered. Feel free to point out anything you have doubts about.

How to store user inputted strings in a variable and then see if those inputs are contained in a word

I'm trying to make a hangman game. At the moment I'm still trying to figure out how to store users inputted strings in a variable.
I need this because if a user guesses the word before the ten guesses it keeps asking them for another letter.
I've tried creating a variable and then updating the variable as the user entered more letters. However that doesn't work in cases the user doesn't enter all the letters in the correct order the program is obviously not going to recognize this as the correct word.
Basically I need a way to store the inputted strings (one letter at a time) and to be able to check if all of those letters are contained in the five letter word.
import random
print("Welcome to hangman, guess the five letter word")
words =["china", "ducks", "glass"]
correct_word = (random.choice(words))
trials = 10
for trial in range(trials):
guess = input(str("Enter Character:"))
if (len(guess) > 1):
print("You are not allowed to enter more than one character at a time")
continue
if guess in correct_word:
print("Well done " + guess + " is in the list!")
else:
print("Sorry " + guess + " is not included")
It seems like a set is what you need.
You start with an empty set() and add the letter every time. To check if the letters are enough, use saved_set == set(correct_word).
With the help of an auxiliar list, this little guy will do the trick (I put some comments to better explain what I did):
import random
import sys
print("Welcome to hangman, guess the five letter word")
words =["china", "ducks", "glass"]
correct_word = (random.choice(words))
trials = 10
trial = 0
#the list starts empty, since the user didn't guessed any letter
guessed_letters = []
while(trial < trials):
guess = input(str("Enter Charcter:"))
if (len(guess) > 1):
print("You are not allowed to enter more than one charcter at a time")
continue
if (guess in correct_word) and (guess not in guessed_letters):
#once our user guesses a letter that he didn't guessed before, it will be added to our list of guessed letters
print("Well done " + guess + " is in the list!")
guessed_letters += guess
#in here we compare the size of the list with the size of the correct_word without duplicates
#if it's the same size, boom: the user won!
if (len(guessed_letters) == len(set(correct_word))):
print("Congratulations! You won!")
sys.exit()
else:
#just to avoid confusing the user with duplicate letters
if (guess in guessed_letters):
print("You already tried letter " + guess + "! Try another letter")
trial -= 1
else:
print("Sorry " + guess + " is not included")
print("Remaining chances: " + str(trials - trial))
trial += 1
print("\n\n\nGame over!!!!")
All you need is to replace:
guess = input(str("Enter Charcter:"))
by:
guess = str(sys.stdin.readline().rstrip('\n'))

While loop with inputs

I'm doing a simple game for a school project. It's simply a guess the word game, and I've gotten most of it down, except for when answer is wrong or completed. Here's my code so far.
guess = input('Guess a letter.')
blank_answer = list('_ _ _ _ _ _')
correct_answer ='banana'
correct_answer_final = 'b a n a n a'
guess_num = 4
index_num = 0
while guess_num > 0 and "".join(blank_answer) != correct_answer_final:
index_num = 0
for letter in correct_answer:
if letter == guess:
blank_answer[index_num] = letter
index_num += 2
if letter != guess:
guess_num -= 1
print('The Word so far is ' + "".join(blank_answer)
guess = input('Guess a letter. (You have ' + str(guess_num) + ' guesses remaining)')
if "".join(blank_answer) == correct_answer_final:
print('Good job ')
if guess_num == 0:
print('sorry you ran out of guesses')
The main problem I'm having is after the first guess it'll say '3' guesses remaining then it'll jump to 2 after a few more guesses even if they are correct. Also it doesn't jump out of the loop right away after guessing correctly. If it is correct you have to input a correct letter once again. This was done in a graphical window, so I've changed all imported commands to default python to make it easier to understand. Any help would be great!
Not sure if this will fix the issue you're having but the condition for your while loop seems incorrect. I think what you're looking for is
while guess_num > 0 and "".join(blank_answer) != correct_answer_final
(The difference here being the and vs. the or)
This way the loop will exit if either the guesses run out OR the correct answer is guessed.

Correcting user input to meet a specific requirement for Hangman

I need the user input to only equal 1 character but there is a bug in the code that lets me enter more than one character at a time. I need to be able to prompt the user to say you can only enter one character at a time and then go back to let them enter the character but without the character counting toward the game.
print ("lets play guess this word.") #time to play
secret_word = input("Enter a secret word to guess: ") # gather the secret word
secret_word = secret_word.lower() # convert to lower
guesses = "" # this is the string that will show what has been guessed later
turns = 6 # how many chances they get to enter a wrong character.
# a very very tricky while loop.
while turns > 0: # will be true until the turns counter makes turns = 0
count = 0 # this count determines wether to print _ or the character
for char in secret_word: # looking at characters in the secret word
if char in guesses: # this is used to display the correct letters and _'s
print (char, end="")
else:
print ("_ ",end="") # this print the _ for every char in secretword
count += 1 # ends the for loop continues to the next part
if count == 0: # you won the game end the loop.
print ()
print ("You win")
break
print ()
print ()
print ()
guess = input("guess a character:")
count2 = 0
if len(guess) > 1:
count2 += 1
while count2 > 0:
print ("you can only guess 1 character at a time")
count2 -= 1
guess = guess.lower() #lower # it is time to guess the letters.
guesses += guess
if guess not in secret_word: # if statement for if guess is not in word
turns -= 1 # subtract from turns
print ()
print ()
print ("Wrong")
print ("Letters guessed so far: ",guesses) # end of loop show guessed letters
print ("You have", + turns, 'more guesses') # show turns left
if turns == 0: # END GAME
print ("The word was",secret_word,"You Loose")
Screenshot showing the code does work in Python:
I also need help with making it only accept 1 character at a time and also no numbers. I also added this part of code while trying to accomplish this task but it does not stop the multiple characters being entered from counting toward the word.
count2 = 0
if len(guess) > 1:
count2 += 1
while count2 > 0:
print ("you can only guess 1 character at a time")
count2 -= 1
Here is my output:
lets play guess this word.
Enter a secret word to guess: computer
_ _ _ _ _ _ _ _
guess a character:abcdefghijklmnopqrstuvwxyz
you can only guess 1 character at a time
Wrong
Letters guessed so far: abcdefghijklmnopqrstuvwxyz
You have 5 more guesses
computer
You win
All you're missing is the statement to loop back around after warning if the user enters invalid input. With the structure you've got, the statement you want is continue, which jumps to the next iteration of a loop:
while turns > 0:
# Print current guesses; get input; etc...
# Check for invalid input
if len(guess) > 1:
print("you can only guess 1 character at a time")
continue # This makes us return to the top of the while loop.
# We definitely have valid input by the time we get here, so handle the new guess.
This is simplified a little from your version; I've taken out count2, for instance, because it wasn't doing anything important. But the premise is the same: after you warn the user about their invalid input, you need to ask for new input--jump to the top of the loop--instead of just moving ahead.

Categories