Skip to main content
Removed python 2.7
Link
edited title
Link

Guessing NumbersNumber(s) Game in Python

Source Link

Guessing Numbers in Python

import random, os

HIGHSCORE_DATA = []
NUM_DIGITS = 1
MAX_GUESS = 10

    
if os.path.isfile('./highscore.txt'):
    f = open("highscore.txt", "r")
    highscore_data = f.readline().split(',')
    HIGHSCORE_DATA = highscore_data[0], highscore_data[1]
    
def increment_difficulty(difficulty = 1):
    global NUM_DIGITS
    NUM_DIGITS += difficulty
    
def get_secret_num():
    numbers = list(range(10))
    random.shuffle(numbers)
    secretNum = ''
    for i in range(NUM_DIGITS):
        secretNum += str(numbers[i])
    return secretNum

def get_clues(guess, secretNum):
    global NUM_DIGITS
    if len(guess) > NUM_DIGITS:
        return 'ERROR_LENGTH_TOO_LONG'
    
    if guess == secretNum:
        increment_difficulty()
        return 'You got it!'
    
    clues = []
    for i in range(len(guess)):
        if guess[i] == secretNum[i]:
            clues.append('Fermi')
        elif guess[i] in secretNum:
            clues.append('pico')
    if len(clues) == 0:
        return 'Bagels'

    clues.sort()
    return ' ' . join(clues)

def is_only_digits(num):
    # Returns True if num is a string of only digits. Otherwise, returns False
    if num == '':
        return False

        for i in num:
            if i not in '0 1 2 3 4 5 6 7 8 9'.split():
                return False

        return True

def disp_intro():
    global HIGHSCORE
    print('[Highscore] Name: {name} | Level: {level}\n'.format(name=HIGHSCORE_DATA[0], level=HIGHSCORE_DATA[1]));
    print('I am thinking of a of a %s-digit number. Try to guess what ' % (NUM_DIGITS))
    print('The clues I give are . . .')
    print('When I say:    That means: ')
    print('Bagels         None of the digits is correct.')
    print('Pico        One digit is correct but in the wrong position.')
    print('Fermi          One digit is correct and in the right position.')
    
while True:
    NUM_DIGITS = 1
    num_guesses = 1
    while num_guesses <= MAX_GUESS:
        secret_num = get_secret_num()

        # Debugging Purposes - print(secret_num)

        print('I have thought up a number. You have %s guesses to get it.' % (MAX_GUESS))
        guess = ''
        disp_intro()
        
        while len(guess) != NUM_DIGITS or not is_only_digits(guess):
            print("Guess #%s: " % (num_guesses))
            guess = input()
            
            clue = get_clues(guess, secret_num)
            print(clue)
            if clue == 'You got it!':
                num_guesses = 1;
                print("============================\n")
                break;
            elif clue == 'ERROR_LENGTH_TOO_LONG':
                num_guesses -= 1
            
            num_guesses += 1

            #if guess == secret_num:
            #    break;
            if num_guesses > MAX_GUESS:
                print('You ran out of guesses. The answer was %s.' % (secret_num))
                print("Please enter your name (FOR HIGHSCORE): ")
                highscore_name = input()
                
                f = open('./highscore.txt', 'w')
                f.write(highscore_name + "," + str(NUM_DIGITS))
                f.close()
                break;

    print('Do you want to play again? (yes or no)')
    if not input().lower().startswith('y'):
        break

As the disp_intro says. It will give clues depending on the input given.

Bagels - None of the digits is correct.
Pico - One digit is correct but in the wrong position.
Fermi - One digit is correct and in the right position.

So, basically I just want to see the most concise way this can be written as I'm pretty sure most of the code I wrote is redundant and can be improved by a lot.


Features

  • [X] Generates random SECRET_NUM to guess.
  • [X] Shows current High Score.
  • [X] Read/Writes the High Score file.
  • [X] If length is too long: Do not count tries, and ask again.
  • [X] If it's not a number: Do not count tries, and ask again.
  • [X] If guess >= MAX_GUESS: Ask for player's name, and then ask to terminate.

There might be more, but I think those are the most important ones.