Spaces:
Sleeping
Sleeping
import openai | |
import random | |
import os | |
import gradio as gr | |
# Retrieve the OpenAI API key from Hugging Face Secrets | |
openai.api_key = os.getenv('OPENAI_API_KEY') | |
# Define the words and their clues for each difficulty level with at least 10 words | |
word_list = { | |
'Beginner': { | |
'apple': ['fruit', 'red', 'tree'], 'book': ['read', 'pages', 'story'], 'car': ['drive', 'vehicle', 'wheels'], | |
'dog': ['pet', 'bark', 'tail'], 'house': ['home', 'building', 'roof'], 'rain': ['wet', 'cloud', 'storm'], | |
'tree': ['leaves', 'wood', 'tall'], 'chair': ['sit', 'furniture', 'legs'], 'phone': ['call', 'device', 'ring'], | |
'shirt': ['clothing', 'wear', 'sleeve'] | |
}, | |
'Intermediate': { | |
'planet': ['orbit', 'solar', 'space'], 'bridge': ['cross', 'river', 'connect'], 'computer': ['device', 'keyboard', 'screen'], | |
'ocean': ['water', 'sea', 'waves'], 'mountain': ['tall', 'peak', 'climb'], 'school': ['learn', 'students', 'teacher'], | |
'market': ['buy', 'sell', 'goods'], 'train': ['rails', 'transport', 'station'], 'forest': ['trees', 'wild', 'nature'], | |
'painting': ['art', 'canvas', 'brush'] | |
}, | |
'Advanced': { | |
'philosophy': ['thought', 'ethics', 'reason'], 'courage': ['bravery', 'fear', 'bold'], 'innovation': ['new', 'ideas', 'progress'], | |
'gravity': ['force', 'pull', 'earth'], 'liberty': ['freedom', 'rights', 'society'], 'education': ['knowledge', 'teach', 'learn'], | |
'architecture': ['buildings', 'design', 'structure'], 'diplomacy': ['negotiation', 'peace', 'agreement'], 'agriculture': ['farming', 'crops', 'soil'], | |
'democracy': ['government', 'voting', 'people'] | |
}, | |
'Expert': { | |
'ephemeral': ['short-lived', 'fleeting', 'temporary'], 'labyrinth': ['maze', 'complex', 'twist'], 'serendipity': ['chance', 'happy', 'unexpected'], | |
'obfuscate': ['confuse', 'unclear', 'hide'], 'obstreperous': ['noisy', 'unruly', 'disruptive'], 'quintessential': ['perfect', 'ideal', 'example'], | |
'perspicacious': ['observant', 'insightful', 'sharp'], 'antediluvian': ['ancient', 'prehistoric', 'old'], 'ineffable': ['indescribable', 'beyond words', 'inexpressible'], | |
'magnanimous': ['generous', 'noble', 'big-hearted'] | |
} | |
} | |
# Function to get 5 random words and clues for the chosen difficulty | |
def get_five_words(difficulty): | |
return random.sample(list(word_list[difficulty].items()), 5) | |
# Function to interact with OpenAI for additional clues (if requested by the player) | |
def generate_hint(word): | |
response = openai.ChatCompletion.create( | |
model="gpt-4-0613", | |
messages=[ | |
{"role": "system", "content": "You are a helpful assistant that gives hints for words."}, | |
{"role": "user", "content": f"Give me a hint for the word '{word}' without saying the word directly."} | |
], | |
max_tokens=30 | |
) | |
return response.choices[0].message['content'].strip() | |
# Game state variables | |
game_state = { | |
"word_list": [], | |
"current_word_index": 0, | |
"attempts": 3, | |
"score": 0, | |
"clue_index": 0, | |
"difficulty": "Beginner", | |
"max_words": 5 # The game will consist of 5 words | |
} | |
# Scoring system based on difficulty | |
scoring = { | |
'Beginner': [30, 20, 10], | |
'Intermediate': [40, 30, 20], | |
'Advanced': [50, 40, 30], | |
'Expert': [60, 50, 40] | |
} | |
# Function to reset the game state for a new round | |
def reset_game(difficulty): | |
words = get_five_words(difficulty) | |
game_state.update({ | |
"word_list": words, | |
"current_word_index": 0, | |
"attempts": 3, | |
"clue_index": 0, | |
"difficulty": difficulty, | |
"score": 0 | |
}) | |
word, clues = words[0] | |
return f"New game started with {game_state['max_words']} words at {difficulty} level. Here's your first clue: {clues[0]}" | |
# Function to move to the next word after a guess | |
def next_word(): | |
game_state["current_word_index"] += 1 | |
if game_state["current_word_index"] >= game_state["max_words"]: | |
return f"Game over! You've completed {game_state['max_words']} words. Your total score is {game_state['score']}." | |
game_state["attempts"] = 3 | |
game_state["clue_index"] = 0 | |
word, clues = game_state["word_list"][game_state["current_word_index"]] | |
return f"Let's now go to the next word! Here's your first clue: {clues[0]}" | |
# Function to check the user's guess | |
def guess_word(guess): | |
guess = guess.lower() | |
word, clues = game_state["word_list"][game_state["current_word_index"]] | |
if guess == word: | |
difficulty = game_state["difficulty"] | |
attempts = game_state["attempts"] | |
points = scoring[difficulty][3 - attempts] # Points for 3rd, 2nd, or 1st attempt | |
game_state["score"] += points | |
message = f"Correct! You've earned {points} points. The word was '{word}'. Your total score is {game_state['score']}." | |
# Move to the next word or end the game if max words reached | |
message += f"\n\n{next_word()}" | |
return message, next_word() # Two outputs: guess feedback and next word clue | |
else: | |
game_state["attempts"] -= 1 | |
game_state["clue_index"] += 1 | |
if game_state["attempts"] == 0: | |
message = f"Sorry, you're out of guesses! The correct word was '{word}'." | |
# Move to the next word or end the game if max words reached | |
message += f"\n\n{next_word()}" | |
return message, next_word() | |
return f"Incorrect! Try again. Here's your next clue: {clues[game_state['clue_index']]}", f"Next clue: {clues[game_state['clue_index']]}" | |
# Function to give an extra hint using OpenAI (no points awarded) | |
def get_extra_hint(): | |
word, _ = game_state["word_list"][game_state["current_word_index"]] | |
hint = generate_hint(word) | |
return f"Extra hint: {hint}. No points will be awarded for guessing this word now." | |
# Gradio Interface | |
with gr.Blocks(css=""" | |
#feedback { | |
position: absolute; | |
top: 20px; | |
right: 20px; | |
background-color: #f8f9fa; | |
border: 1px solid #e0e0e0; | |
padding: 10px; | |
border-radius: 5px; | |
font-weight: bold; | |
font-size: 14px; | |
} | |
#instructions { | |
background-color: #f8f9fa; | |
padding: 10px; | |
border: 1px solid #e0e0e0; | |
border-radius: 5px; | |
} | |
#guess-section { | |
margin-top: 50px; /* Add vertical space before the "Your Guess" section */ | |
} | |
/* Add responsive behavior for mobile devices */ | |
@media only screen and (max-width: 768px) { | |
.gr-blocks { | |
padding: 10px; | |
} | |
.gr-row { | |
flex-direction: column; | |
} | |
#feedback { | |
position: relative; | |
top: auto; | |
right: auto; | |
margin-top: 10px; | |
} | |
#guess-section { | |
margin-top: 20px; | |
} | |
button, input { | |
font-size: 16px; | |
} | |
} | |
""") as game_interface: | |
# Layout with two columns | |
with gr.Row(): | |
with gr.Column(scale=2): # Left side (main game interface) | |
# Game feedback (top-right corner on desktop, below on mobile) | |
guess_output = gr.Markdown("", elem_id="feedback") | |
# Game output (clues and game messages) | |
game_info = gr.Markdown("") | |
# Section for guessing (with space above) | |
with gr.Column(elem_id="guess-section"): | |
guess_input = gr.Textbox(label="Your Guess", placeholder="Type your guess here.") | |
guess_button = gr.Button("Submit Guess") | |
# Section for extra hint | |
hint_button = gr.Button("Get Extra Hint (No Points)") | |
hint_output = gr.Markdown("") | |
with gr.Column(scale=1): # Right side (instructions) | |
# Instructions block | |
gr.Markdown(""" | |
### Instructions: | |
- Choose a difficulty level and click 'Start New Game'. | |
- You will be given 5 words to guess. | |
- You earn points based on how quickly you guess the word. | |
- If you need an extra hint, click 'Get Extra Hint', but no points will be awarded for the word. | |
- Good luck! | |
""", elem_id="instructions") | |
# Section for Game Setup (below instructions and game) | |
with gr.Row(): | |
difficulty = gr.Dropdown(choices=['Beginner', 'Intermediate', 'Advanced', 'Expert'], label="Select Difficulty Level", value="Beginner") | |
start_button = gr.Button("Start New Game / Reset Game") | |
# Action Connections | |
start_button.click(fn=reset_game, inputs=difficulty, outputs=game_info) | |
guess_button.click(fn=guess_word, inputs=guess_input, outputs=[guess_output, game_info]) | |
hint_button.click(fn=get_extra_hint, outputs=hint_output) | |
# Launch the Gradio interface | |
game_interface.launch() | |