Is it possible to store inputted values in a while loop? - python

I'm trying to store the guesses so that I can make code for if you have already guessed that letter and also to make code for when they get all of the letters correct. I may be stuck on that part, too, since I don't know how to check if the letters correspond to the letters in the wordname list, especially when it isn't even ordered.
So, I am looking for some code that would store the guesses and also something that can check if all of the correct letters have been guessed. I am thinking it may have something to do with the enumerate() function, but I am not sure since I have never used it before and have only just heard about it.
Also, for your information, the game is hangman if that helps.
wordname = word_choosing()
wordnamelength = len(wordname)
wordnamelist = list(wordname)
def letter_guess1():
sleep(1)
tries = 5
print(f"{oppositeplayer}, the word is {wordnamelength} letters long")
while tries > 0:
guess1 = input("Make your guess: ")
if guess1 in wordnamelist:
print("Congrats, that is correct")
letternum = wordnamelist.index(guess1)
letternum += 1
print(f"This letter is number {letternum}")
elif guess1 not in wordnamelist:
tries -= 1
print(f"You have {tries} left")
if guess1 == "quit".lower():
exit()
return tries
tries = letter_guess1()

I think set is very suitable in this situation. Keep the letters of the word being guessed as a set and add the guess to another set. Then, you can check if the word was guessed correctly by using the intersection of both sets.
Something like that:
wordname = word_choosing()
wordnamelength = len(wordname)
wordnamelist = list(wordname)
def letter_guess1():
sleep(1)
tries = 5
print(f"{oppositeplayer}, the word is {wordnamelength} letters long")
word_set = set(wordname)
guessed_letters = set()
while tries > 0:
guess = input("Make your guess: ")
if guess in guessed_letters:
print("You already guessed this letter")
continue
guessed_letters.add(guess)
if guess in word_set:
print("Congrats, that is correct")
letternum = wordnamelist.index(guess)
letternum += 1
print(f"This letter is number {letternum}")
elif guess not in word_set:
tries -= 1
print(f"You have {tries} left")
if word_set.intersection(guessed_letters) == word_set:
print("You have won!")
if guess == "quit".lower():
exit()
return tries
tries = letter_guess1()

Related

I am trying to make a guess the word game but I get a logical error when it picks a random word that has two or more of the same letter

I have made a word guessing game but when it picks a random word with repeating letters in it, it works fine and puts the correctly guessed letters into a list. But how do I make it so it acknowledge that the random word has repeating letters so accepts repeating letters? For example, if the chosen word is ball and you entered s it would display that s is not in the word. If I entered l, it would say l is in the word and add it to a list called correct. If I then entered l again as ball has two l's, it will display that I have already entered that letter and will not let me continue any further. I don't know how I can make it acknowledge that the word has repeating letters. Here is the code:
words = ["burger","chips","ketchup","cake","crisp","coke","fruit"]
correct = []
guessed = []
print("Weclome to guess the word. Aim of the game is to guess all the letters in the word and then type what word you think the word is. The subject is food. You have 15 guesses")
j = random.choice(words)
x = len(j)
count = x
guesses = 15
print("The word is:", x , "letters long.")
while guesses > 0:
guess1 = input("Enter a letter: ").lower()
k = len(guess1)
if k != 1:
print("Not a valid guess!")
if guess1 in j and guess1 in correct:
print("You have already guessed this letter! Your number of guesses left is:", guesses)
if guess1 in j and guess1 not in correct:
print(guess1,"is in the word. You have:", guesses , "guesses left.")
correct.append(guess1)
guesses = guesses-1
count = count-1
print("You have", count ,"of", x , "letters left to guess and you correctly given these letters:", *correct)
if guess1 not in j and guess1 not in guessed:
guessed.append(guess1)
print(guess1, "is not in the word. You have:", guesses , "guesses left and have given the following incorrect letters:", *guessed)
guesses = guesses-1
if guesses == 0:
print("You have ran out of guesses!")
break
if count == 0:
print("Well done! You have guessed all the letters. Now time to de-scramble them! You have unlimited guesses for the word.")
print("These are the following letters you need to de-scramble")
print(*correct)
descramble = input("Enter what you think the word is: ").lower()
if descramble == j:
print("You guessed the word! Well done!")
break
if descramble != j:
print(descramble,"is not the word.")```
You can try this,
import random
words = ["burger","chips","ketchup","cake","crisp","coke","fruit"]
correct = []
guessed = []
print("Weclome to guess the word. Aim of the game is to guess all the letters in the word and then type what word you think the word is. The subject is food. You have 15 guesses")
j = random.choice(words)
x = len(j)
count = x
guesses = 15
already_used_letters = list()
print("The word is:", x , "letters long.")
while guesses > 0:
guess1 = input("Enter a letter: ").lower()
k = len(guess1)
if guess1 in already_used_letters:
print("You already used this letter")
guesses = guesses - 1
already_used_letters.append(guess1)
if k != 1:
print("Not a valid guess!")
if guess1 in j and guess1 in correct:
print("You have already guessed this letter! Your number of guesses left is:", guesses)
if guess1 in j and guess1 not in correct:
print(guess1,"is in the word. You have:", guesses , "guesses left.")
correct.append(guess1)
guesses = guesses-1
count = count-1
print("You have", count ,"of", x , "letters left to guess and you correctly given these letters:", *correct)
if guess1 not in j and guess1 not in guessed:
guessed.append(guess1)
print(guess1, "is not in the word. You have:", guesses , "guesses left and have given the following incorrect letters:", *guessed)
guesses = guesses-1
if guesses == 0:
print("You have ran out of guesses!")
break
if count == 0:
print("Well done! You have guessed all the letters. Now time to de-scramble them! You have unlimited guesses for the word.")
print("These are the following letters you need to de-scramble")
print(*correct)
descramble = input("Enter what you think the word is: ").lower()
if descramble == j:
print("You guessed the word! Well done!")
break
if descramble != j:
print(descramble,"is not the word.")
Try this:
import random
words = ["burger", "chips", "ketchup", "cake", "crisp", "coke", "fruit"]
correctLetters = []
wronglyGuessed = []
print(
"Weclome to guess the word. Aim of the game is to guess all the letters in the word and then type what word you think the word is. The subject is food. You have 15 guesses")
word = random.choice(words)
# word = "aapplle"
lives = 15
while lives > 0:
if len(word) == len(correctLetters):
print(
"Well done! You have guessed all the letters. Now time to de-scramble them! You have unlimited guesses for the word.")
print("These are the following letters you need to de-scramble")
print(*correctLetters)
descramble = input("Enter what you think the word is: ").lower()
if descramble == word:
print("You guessed the word! Well done!")
break
else:
print(descramble, "is not the word.")
guess1 = input("Enter a letter: ").lower()
if len(guess1) > 1 or not guess1.isalpha():
print("Not a valid guess!")
lives -= 1
continue
if guess1 in word:
if word.count(guess1) > correctLetters.count(guess1):
correctLetters.append(guess1)
print("you found a letter")
else:
lives -= 1
print('You guessed all the occurances')
continue
if guess1 not in word:
lives -= 1
print(f'Wrong guess. You have {lives} tries left')
continue
if lives == 0:
print("You ran out of guesses")
Your problem comes from here:
if guess1 in j and guess1 in correct:
print("You have already guessed this letter! Your number of guesses left is:", guesses)
When you use in it will only find the first occurrence of said item and return true. In this case you are interested in also finding the case for duplicates and also keeping track of them. Thus, you need to take another approach: that of finding said duplicates and their number. I used a pre-built method count().
I'd say there are a few more issues with your code:
Use descriptive names for your variables. x, j, k, n can mean a lot of things whereas guestNames is pretty self explanatory
When a case inside one of your ifs was met and all following tests cannot evaluate true, just use a continue statement
Also, on a different note, i'd say that when a letter is guessed you assume all its occurances, but that's not programming related.

My iteration doesn't work when it runs after the first time

When I enter the correct word, it prints out congratulations, but when I enter it for the second or third try, it doesn't work
secret_word = "hello"
tries = 1
guess_word = input("Guess a word: ")
while tries < 3:
if secret_word != guess_word:
tries += 1
print("Sorry, word not found, you have", 4 - tries, "tries left")
guess_word = input("Guess a word")
if tries == 3:
print("Sorry, you are out of tries, better luck next time !!!")
break
else:
print("Congratulations! You've done it!")
break
In this section of code:
print("Sorry, word not found, you have", 4 - tries, "tries left")
guess_word = input("Guess a word")
if tries == 3:
print("Sorry, you are out of tries, better luck next time !!!")
you don't check to see whether the guess was right before telling the user they've lost. It might be easier if you base the loop on whether the guess was right, and use the tries counter to decide whether to break or continue:
secret_word = "hello"
tries = 0
while input("Guess a word: ") != secret_word:
tries += 1
if tries < 3:
print(f"Sorry, word not found, you have {3 - tries} tries left")
else:
print("Sorry, you are out of tries, better luck next time !!!")
break
else:
print("Congratulations! You've done it!")
It's better if you could put this line,
guess_word = input("Guess a word: ")
... in the while loop, so you wouldn't have 2 of the same lines.
You can also state the number of tries to 3 instead of 1. Set the number you want, and decrement downwards. To avoid code like, "4 - tries"
print("Sorry, word not found, you have", 4 - tries, "tries left")
secret_word = "hello"
tries = 3
while tries > 0:
guess_word = input("Guess a word: ")
if secret_word != guess_word:
tries -= 1
print("Sorry, word not found, you have", tries, "tries left")
if tries == 0:
print("Ran out of tries!")
break
else:
print("Congratulations! You've done it!")
break
Your current code only allows 2 tries to be made. The 3rd try even if you get it right, it will be thrown out. Let me know if there's anything wrong with my solution!
When you say while tries < 3 you only go up to 2 because thats the last whole number that's smaller than 3. If you want to include 3 you can change it to while tries <= 3
tries can never reach 3 as you have put while tries < 3
change it to tries<=3

Hangman game. How to slice strings to change original value

I am very new to python and I am attempting to make a hangman game.
I would like to change a string to show the number of guessed letters but for some reason I keep on getting weird results. Here is my code:
import random
guesses_left = 9
def show_guesses_left():
print("You have", guesses_left, "guesses left")
wordlist = ['nerd', 'python', 'great', 'happy', 'programmer', 'long', 'short', 'stupid']
word = random.choice(wordlist)
wordwin = word
hidden_word = ["?" for q in word]
letters_guessed = ''.join(hidden_word)
print("Welcome to Hangman!!")
print("My word is", len(word), "letters long")
print(wordwin)
print(letters_guessed)
def request_guess():
global guesses_left
global word
global letters_guessed
x = input(f"What is your guess? \n{letters_guessed}")
if x in word:
print("Great you guessed a letter")
t = word.find(x)
word = word.replace(x, "")
print(t)
letters_guessed = letters_guessed[:t] + letters_guessed[t:t+1].replace('?', x) + letters_guessed[t+1:]
elif type(x) is not str or len(x) > 1:
print("Invalid guess, Your guess must be 1 letter long")
else:
print("Wrong!")
guesses_left -= 1
show_guesses_left()
def start_game():
global letters_guessed
global word
global guesses_left
letters_guessed = ''.join(hidden_word)
while True:
if guesses_left > 0 and len(word) != 0:
request_guess()
elif len(word) == 0:
print(f"YOU WIN!!!, the word was {wordwin}")
break
else:
print("You lose! Better luck next time!")
break
start_game()
I keep on getting this result where it only works for the for some letters and the placing is wrong. Here is my result:
Welcome to Hangman!!
My word is 4 letters long
long
????
What is your guess?
????l
Great you guessed a letter
0
What is your guess?
l???n
Great you guessed a letter
1
What is your guess?
ln??o
Great you guessed a letter
0
What is your guess?
ln??g
Great you guessed a letter
0
YOU WIN!!!, the word was long
Why cant i just slice the string change one character and slice the rest?
Why does it work the first time and not the second?
If anybody can explain to me what is going on it would be appreciated
Solution
import random
guesses_left = 9
def show_guesses_left():
print("You have", guesses_left, "guesses left")
wordlist = ['nerd', 'python', 'great', 'long', 'short', 'stupid', 'happy', 'programmer']
word = random.choice(wordlist)
wordwin = list(word)
hidden_word = list('?' * len(word))
letters_guessed = ''.join(hidden_word)
print("Welcome to Hangman!!")
print("My word is", len(word), "letters long")
print(letters_guessed)
def request_guess():
global guesses_left
global word
global letters_guessed
x = input("\nWhat is your guess?\n" + letters_guessed + "\n")
if x in word:
print("\nGreat you guessed a letter")
for i, j in enumerate(word):
if j == x:
hidden_word[i] = j
letters_guessed = ''.join(hidden_word)
print(letters_guessed + "\n")
elif type(x) is not str or len(x) > 1:
print("Invalid guess, Your guess must be 1 letter long")
else:
print("\nWrong!")
guesses_left -= 1
show_guesses_left()
def start_game():
global letters_guessed
global word
global guesses_left
letters_guessed = ''.join(hidden_word)
while True:
if guesses_left > 0 and letters_guessed != word:
request_guess()
elif letters_guessed == word:
print("YOU WIN!!!, the word was " + word)
break
else:
print("\nYou lose! Better luck next time!")
break
start_game()
Notes
Got it to work!
Sorry short on time will be back to help more, but take a look around. I used some different methods than you originally had, seems like there was a issue with your letters_guessed not revealing letters past a letter already guessed. This will work for double letters as well, which also seemed to be an issued with your original code.
Again sorry, will be back to explain more!
The main problem is the code you use to get the index of the guessed letter:
t = word.find(x)
word = word.replace(x, "")
This shortens word after each correct guess, so t will not be the desired value after the first correct guess.
However, even if you fix this, you will still not properly handle the case that the guessed letter occurs multiple times.
Here is a short example that shows how to solve both problems:
answer = 'long'
hidden = '?' * len(answer)
print("Welcome to hangman!")
while True:
guess = input("Guess a letter: ")
result = ''
if guess in answer:
for answer_letter, hidden_letter in zip(answer, hidden):
if guess == answer_letter:
result += guess
else:
result += hidden_letter
hidden = result
print(hidden)
if hidden == answer:
print("You guessed it!")
break
The main problem is that you are basing that splicing on a variable that you modify on the go. In particular, the variable word, where you look for the position of x, the guessed letter. The position is correct until word gets modified in length, as you replace the letter with an empty string.
An easy fix for that is to simply change the replace statement, and put either an empty space, or another character, that the user would not normally put. In my example, I would replace:
word = word.replace(x, "")
with
word = word.replace(x, " ")
That of course breaks the program exit logic: you can never win.
There is still another issue, that is multiple occurrences of the same letter are not accounted properly. In fact, the program loops until exhaustion, when multiple instances of the same letter are in word.
That is due to the fact that find will only reveal the position of the first instance of a given letter, and you don't account for possible duplicates.
There are several ways to fix that, but I think the main issue is identified.
For an alternate implementation, check https://eval.in/1051220

Python - Guess a word game

Here is my code:
import random
guesses = 0 #Number of tries to guess.
print ("Welcome to Guess Me!")
print ("\nYou have five guesses, choose letter and guess a word.")
print("\nAll of luck!")
def rand_word():
f = open('sowpods.txt', 'r').readlines() #Sowpods is library with some random words
return random.choice(f).strip()
word = rand_word()
print word #I printed a word just so i can test if is working.
correct = word
lenght = len(word) #I want to tell them how many letters a word contain
new_length = str(lenght)
guess = raw_input("The word is " + new_length + " letters long. Guess a letter: ")
while guesses < 5:
if guess not in word:
print("Sorry, this letter is not in word.")
else:
print("Correct, word contain this letter!")
guesses =+ 1
if guesses > 5:
final_answer = raw_input("You ran out of guesses, what is your answer?")
if final_answer == correct:
print("That's correct, congratulations you won!")
else:
print("Sorry, correct word is" + " " + word + " ,you can try again!")
Problem is when i run my code, and let's say i type letter "s", my sublime freeze and i get message "Sublime 3 is not responding.." and i have to turn it off. Maybe it's while loop? Infinite?
There are a few things.
guesses =+ 1 should be guesses += 1 and at the top of the while loop before any if statements
I think your guess = raw_input should be within the while loop before any of the if statements. So it will keep asking and counting for each guess until it reaches 5. The last if statement within the loop should be if guesses == 5 or guesses >= 5 instead of guesses > 5.
Mostly just reordering things all within the while loop. Everything under the code within the while loop will be ran for every guess.
I changed it according to the above and it works great for me:
while guesses < 5:
guesses += 1
guess = raw_input("The word is " + new_length + " letters long. Guess a letter: ")
if guess not in word:
print("Sorry, this letter is not in word.")
else:
print("Correct, word contain this letter!")
if guesses == 5:
final_answer = raw_input("You ran out of guesses, what is your answer?")
if final_answer == correct:
print("That's correct, congratulations you won!")
else:
print("Sorry, correct word is" + " " + word + " ,you can try again!")
Welcome to Guess Me!
You have five guesses, choose letter and guess a word.
All of luck!
word
The word is 4 letters long. Guess a letter: 1
Sorry, this letter is not in word.
The word is 4 letters long. Guess a letter: 2
Sorry, this letter is not in word.
The word is 4 letters long. Guess a letter: 3
Sorry, this letter is not in word.
The word is 4 letters long. Guess a letter: 4
Sorry, this letter is not in word.
The word is 4 letters long. Guess a letter: 5
Sorry, this letter is not in word.
You ran out of guesses, what is your answer?numbers
Sorry, correct word is word ,you can try again!
You have an infinite loop because your 'guesses' variable is not being inceremented in the while loop; move the 'guesses += 1' into the loop itself e.g.
while guesses < 5:
if guess not in word:
print("Sorry, this letter is not in word.")
else:
print("Correct, word contain this letter!")
guesses += 1

Loop values in a list in an elif

I am trying to get the elif to work, I have tried allsorts and going a bit mad now.
Basically if guessed is not equal to an entry from randomwordslist then it should state it and not reduce guesses and not go to else statement.
error is "NameError: name 'word' is not defined"
Am I going about this all wrong?
while guess > 0:
guessed = input("Guess ({} attempts left):".format(guess))
guess = guess -1
if guessed == answer:
print("+++++ You have won ++++++")
break
elif guessed != word in randomwordslist:
print("Only words from above count as valid entries")
continue
else:
match = 0
for i in range(len(guessed)):
if guessed[i].lower() == answer[i].lower():
match += 1
You are asking Python to test two things:
guessed != word and word in randomwordslist
because Python comparisons are chained. But you don't have word defined which is why you get the exception.
Just test if guessed is not in randomwordslist:
if guessed not in randomwordslist:
if you wanted to verify that the string is not part of the list. not in is the opposite of in, the latter tests if a value is a member of the second operand.
If you don't want the number of guesses affected, move the test up so that you check it first:
while guess > 0:
guessed = input("Guess ({} attempts left):".format(guess))
if guessed not in randomwordslist:
print("Only words from above count as valid entries")
continue
# valid guess, so it counts.
guess = guess - 1
if guessed == answer:
print("+++++ You have won ++++++")
break
Replace your elif block by this one:
elif guessed not in randomwordslist:
print("Only words from above count as valid entries")
continue

Categories

Resources