Roman’s Coding Adventures

My PythonPython Projects

Games

guessNumberGame.py

import random
import argparse
import json

def new_state():
    return {
        "secret_number": random.randint(1, 100),
        "remaining_guesses": 6,
        "awaiting": "guess",
        "finished": False,
    }


def start_game():
    state = new_state()
    output = [
        "Guess the Number Game!",
        f"Generating number (1-100)\nYou have {state['remaining_guesses']} guesses.",
        "Enter your guess:",
    ]
    return state, output


def handle_guess(state, guess_text):
    output = []

    try:
        guess = int(guess_text)
    except (TypeError, ValueError):
        output.append("Uh oh! That wasn't a number! Please try again")
        output.append("Enter your guess:")
        return state, output

    if guess == state["secret_number"]:
        output.append("Well done! You guessed correctly. 😄👍")
        output.append("Do you want to try again? (yes/no)")
        state["awaiting"] = "retry"
        return state, output

    if guess > state["secret_number"]:
        output.append("The secret number is smaller.")
    else:
        output.append("The secret number is bigger.")

    state["remaining_guesses"] -= 1

    if state["remaining_guesses"] > 0:
        output.append(f"You have {state['remaining_guesses']} guesses left.")
        output.append("Enter your guess:")
        return state, output

    output.append("Oh dear! You ran out of guesses!")
    output.append(f"The number was: {state['secret_number']}")
    output.append("Do you want to try again? (yes/no)")
    state["awaiting"] = "retry"
    return state, output


def handle_retry(answer):
    if isinstance(answer, str) and answer.lower().startswith("y"):
        return start_game()

    state = {
        "secret_number": None,
        "remaining_guesses": 0,
        "awaiting": None,
        "finished": True,
    }
    output = ["OK. Bye for now. 👋😄"]
    return state, output


def run_turn(state, action, guess=None, play_again=None):
    if action == "start" or state.get("secret_number") is None:
        return start_game()

    if state.get("finished"):
        return state, ["The game has finished. Start a new game to play again."]

    if state.get("awaiting") == "retry":
        return handle_retry(play_again)

    return handle_guess(state, guess)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--state", default="{}")
    parser.add_argument("--action", default="start")
    parser.add_argument("--guess")
    parser.add_argument("--play-again")
    args = parser.parse_args()

    state = json.loads(args.state)
    new_game_state, output = run_turn(
        state,
        args.action,
        guess=args.guess,
        play_again=args.play_again,
    )

    print(
        json.dumps(
            {
                "state": new_game_state,
                "output": "\n".join(output),
            }
        )
    )


if __name__ == "__main__":
    main()
      

Python Console

Preparing output...