Posts: 8
Threads: 4
Joined: Dec 2018
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import random
question = random.randint( 1 , 1001 )
def get_user_input():
try :
guess = int ( input ( "Please enter a guess: " ))
return guess
except ValueError:
print ( "Invalid guess! Please enter 3 digits between 0 - 9" )
def get_hint(guess, question):
if guess[i] ! = question[i]:
print ( "W" )
if guess[i] = = guess[ 1 ]:
if guess[ 1 ] = = question[i - 1 ]:
def play_game():
print ( "Welcome to the RWX Game!" )
print ( "Your aim is to guess the target, consisting of 3 digits between 0 - 9" )
counts = 0
remaining_score = 10000
while remaining_score > 9000 :
x = get_user_input()
if x ! = question:
print ( "Your guess, %s, is incorrect!" % (x))
get_hint(x, question)
remaining_score = float (remaining_score - (remaining_score * 0.1 ))
counts + = 1
else :
if x = = question:
print ( "Congratulations!" )
print ( "%s was the correct answer" % (x))
print ( "You guessed the correct answer in %d tries! Your score is %g!" % (counts, remaining_score))
else :
print ( "You Loose!" )
print ( "The correct answer was %s ! But you didn't guess it in 23 attempts!" % (question))
again = str ( input ( "Would you like to pay again? Y / N ?" ))
if again = = 'y' or 'Y' :
play_game()
else :
print ( "Thank you for playing! Goodbye!" )
play_game()
|
Hello! I have made a 'Guess the number game'. I am trying to write a get-hint(x,y): function that takes the users guess and the correct answers and compares them to each other, printing a specific letter if the numbers match, are wrong or match but are in the wrong position.
First issue: I'm not sure how to run through and match the numbers that are correct but in the wrong spot. Would it just be something like ? :
1 2 |
for i in guess:
if i = question[i]
|
Second issue:
I'm not sure how to get them to come together as one 3 digit hint.
I want them to print them like 'WXR' horizontally, not vertically. Should I using the results of the get_hint function by setting a variable or something ? and formatting them into a string with %?
If anyone could point me to the way I need to do this! I'm just stumped on how to make it work from here!
Thank you in advance !
Posts: 12,038
Threads: 487
Joined: Sep 2016
This can be greatly simplified, example:
1 2 3 4 5 6 7 8 9 |
>>> list1 = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ]
>>> list2 = [ 4 , 8 , 2 , 0 , 5 ]
>>>
... [b for a, b in zip (list1, list2) if b ! = a]
[ 4 , 8 , 2 , 0 ]
>>>
... [b for a, b in zip (list1, list2) if b = = a]
[ 5 ]
>>>
|
Posts: 1,950
Threads: 8
Joined: Jun 2018
Observations:
- random.randint(1, 1001) can return values like 1, 10, 100 or 1000. If you ask user to enter 3 digits then it's quite hard to win if random returns 1, 10 or 1000.
- you should be aware that function get_user_input() returns any value what can be converted to int. It will note enforce three digits rule. It can be a problem if you want give hints (user enters 123456 and correct number is 7, what hints there should be?)
Regarding your question - keep in mind that int object is not subscriptable.
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy
Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Posts: 8
Threads: 4
Joined: Dec 2018
(Jan-10-2019, 12:25 PM)Larz60+ Wrote: This can be greatly simplified, example:
1 |
>>> list1 = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ] >>> list2 = [ 4 , 8 , 2 , 0 , 5 ] >>>
|
Im Sorry, this is a little advanced for me. I understand that what you have included is running through and matching what I needed but I'm still not sure on how to make it work. Would I be setting list1 as my 'guess' variable and list2 as 'question' ?
I've put it in like this:
1 2 3 4 5 6 7 8 9 10 |
def get_hint(guess, question):
list1 = str (guess)
list2 = str (question)
for a, b in zip (list1, list2):
if b ! = a :
print ( "X" )
else :
for a, b in zip (list1, list2):
if b = = a:
print ( "R" )
|
But all it is doing is printing off :
X
X
X
no what I enter, whether I put in a matching number, an incorrect number or a wrong position number.
Is it not working because I've done with the 'for' and 'if' statement.
Thank you for you help. I am still a baby at this and want to make sure I understand what I am doing, not just coping stuff!
Posts: 1,950
Threads: 8
Joined: Jun 2018
Jan-11-2019, 12:35 PM
(This post was last modified: Jan-11-2019, 12:35 PM by perfringo.)
Before adding new features to your code you should check whether existing code delivers expected results.
It's unclear what are the rules of the game.
I reiterate my observations:
- 'question' value can be 1...1001 but you ask user to enter 3 digits. If random value is 1..99 or 1000-1001 it is not possible to win (FYI: random.randint: Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).)
- your wording of message to user: "Your aim is to guess the target, consisting of 3 digits between 0 - 9" is misleading. You generate int with value in range 1...1001 as value of 'question' but then ask enter three digits in peculiar way. Why don't just say: please enter number in range 1...1001 (or maybe 100...999). In current wording 010 seems legit input.
- you create 'question' value outside the game function. This means that if player chooses to continue playing the question value remains the same.
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy
Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Posts: 12,038
Threads: 487
Joined: Sep 2016
Quote:Albry wrote:
Im Sorry, this is a little advanced for me. I understand that what you have included is running through and matching what I needed but I'm still not sure on how to make it work. Would I be setting list1 as my 'guess' variable and list2 as 'question' ?
I misunderstood the original question.
I thought you were trying to show number of correct items in (guess history) list, as well as those in correct positions.
the example I showed (although not relevant now that I understand the question) was if you had a random list and a guess history list
as in a mastermind type of game, so example was:
Output: random_list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
guesses: [4, 8, 2, 0, 5, ...]
|____________ Correct Number, exact position
so all guesses are correct, but only one (5) is in the correct position, so
1 2 3 4 5 |
def show_correct_guess(random_list, guesses, exact = True ):
if exact:
return [b for a, b in zip (random_list, guesses) if b = = a]
else :
return [b for a, b in zip (random_list, guesses) if b ! = a]
|
would return [4, 8, 2, 0] if exact is False
and [5] if exact is True
|