import gradio as gr import pandas as pd import random from datasets import load_dataset # Load dataset dataset = load_dataset("tejasashinde/a2z-multidomain-glossary", split="train") df = pd.DataFrame(dataset) # Prepare dataset df = ( df.dropna(subset=["word", "description"]) .sample(frac=1) .reset_index(drop=True) ) # Game settings GAME_LENGTHS = { "Quick Game (10 Qs)": 10, "Medium Game (20 Qs)": 20, "Endless Mode": None, } # Session state session_state = { "score": 0, "question_idx": 0, "game_length": 10, "used_indices": [], "current_correct_word": "", "current_options": [], "mode": None, } def generate_question(): while True: idx = random.randint(0, len(df) - 1) if idx not in session_state["used_indices"]: session_state["used_indices"].append(idx) break row = df.loc[idx] correct = row["word"] description = row["description"] domain = row["domain"] prev = df[(df["domain"] == domain) & (df["word"] != correct)] distractors = ( prev["word"].sample(3).tolist() if len(prev) >= 3 else df[df["word"] != correct]["word"].sample(3).tolist() ) options = distractors + [correct] random.shuffle(options) session_state.update(current_correct_word=correct, current_options=options) return description, options def show_mode_selection(): return ( gr.update(visible=False), # start_btn gr.update(visible=True), # mode_selector gr.update(visible=True), # proceed_btn gr.update(visible=False), # level_text gr.update(value="", visible=False), # question_display *(gr.update(visible=False),)*4, # buttons b0,b1,b2,b3 "", # feedback cleared "", # summary cleared gr.update(visible=False), # play_again_btn gr.update(visible=False), # end_game_btn ) def start_game(mode): session_state.update( score=0, question_idx=0, used_indices=[], game_length=GAME_LENGTHS[mode], mode=mode, ) desc, options = generate_question() return ( gr.update(visible=False), # mode_selector gr.update(visible=False), # proceed_btn gr.update(value=f"Question 1", visible=True), # level_text gr.update(value=desc, visible=True), # question_display *[gr.update(value=opt, visible=True) for opt in options], # buttons "", # feedback cleared "", # summary cleared gr.update(visible=False), # play_again_btn gr.update(visible=(mode == "Endless Mode")), # end_game_btn only visible in endless mode ) def answer_question(choice): session_state["question_idx"] += 1 correct = session_state["current_correct_word"] if choice == correct: session_state["score"] += 1 feedback = '
You scored {session_state["score"]} out of {session_state["game_length"]}
You scored {session_state["score"]} points.
This space uses tejasashinde/a2z-multidomain-glossary dataset.
') start_btn = gr.Button("đŽ Start Game") mode_selector = gr.Radio( choices=list(GAME_LENGTHS.keys()), label="Choose Mode", visible=False ) proceed_btn = gr.Button("Proceed", visible=False) level_text = gr.Markdown("Question 1", elem_classes="level-tracker", visible=False) question_display = gr.Markdown("", elem_classes="question-header", visible=False) with gr.Row(): b0 = gr.Button("", elem_classes="option", visible=False) b1 = gr.Button("", elem_classes="option", visible=False) with gr.Row(): b2 = gr.Button("", elem_classes="option", visible=False) b3 = gr.Button("", elem_classes="option", visible=False) feedback = gr.Markdown() summary = gr.HTML(visible=False) play_again_btn = gr.Button("đ Play Again", visible=False) end_game_btn = gr.Button("âšī¸ End Game", visible=False) # Logic connections start_btn.click( fn=show_mode_selection, inputs=None, outputs=[ start_btn, mode_selector, proceed_btn, level_text, question_display, b0, b1, b2, b3, feedback, summary, play_again_btn, end_game_btn, ], ) proceed_btn.click( fn=start_game, inputs=mode_selector, outputs=[ mode_selector, proceed_btn, level_text, question_display, b0, b1, b2, b3, feedback, summary, play_again_btn, end_game_btn, ], ) for btn in [b0, b1, b2, b3]: btn.click( fn=answer_question, inputs=btn, outputs=[ feedback, question_display, b0, b1, b2, b3, summary, level_text, play_again_btn, end_game_btn, ], ) play_again_btn.click( fn=show_mode_selection, inputs=None, outputs=[ start_btn, mode_selector, proceed_btn, level_text, question_display, b0, b1, b2, b3, feedback, summary, play_again_btn, end_game_btn, ], ) end_game_btn.click( fn=end_game, inputs=None, outputs=[ feedback, question_display, b0, b1, b2, b3, summary, level_text, play_again_btn, end_game_btn, ], ) demo.launch()