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()