|
|
|
|
|
|
|
import gradio as gr |
|
import random |
|
from typing import Literal |
|
from typing_extensions import TypedDict |
|
from langgraph.graph import StateGraph, START, END |
|
|
|
|
|
global_score = {"total": 0} |
|
game_history = [] |
|
|
|
class State(TypedDict): |
|
bet: int |
|
result: str |
|
score: int |
|
roll: int |
|
|
|
|
|
def roll_node(state): |
|
state["roll"] = random.randint(1, 6) + random.randint(1, 6) |
|
return state |
|
|
|
def input_node(state): |
|
return state |
|
|
|
def success_node(state): |
|
global_score["total"] += 10 |
|
state["result"] = f"π You win! +$10 (Roll: {state['roll']})" |
|
state["score"] = global_score["total"] |
|
return state |
|
|
|
def failure_node(state): |
|
global_score["total"] -= 5 |
|
state["result"] = f"π You lose! -$5 (Roll: {state['roll']})" |
|
state["score"] = global_score["total"] |
|
return state |
|
|
|
def determine_outcome(state) -> Literal["node_2", "node_3"]: |
|
return "node_2" if state["roll"] <= state["bet"] else "node_3" |
|
|
|
|
|
builder = StateGraph(State) |
|
builder.add_node("roll_node", roll_node) |
|
builder.add_node("node_1", input_node) |
|
builder.add_node("node_2", success_node) |
|
builder.add_node("node_3", failure_node) |
|
|
|
builder.add_edge(START, "roll_node") |
|
builder.add_edge("roll_node", "node_1") |
|
builder.add_conditional_edges("node_1", determine_outcome) |
|
builder.add_edge("node_2", END) |
|
builder.add_edge("node_3", END) |
|
|
|
graph = builder.compile() |
|
|
|
|
|
def play_game(bet: int): |
|
if bet < 1 or bet > 12: |
|
return "Please enter a value between 1 and 12.", global_score["total"], [] |
|
result = graph.invoke({"bet": bet, "result": "", "score": global_score["total"]}) |
|
game_history.append({"Bet": bet, "Roll": result["roll"], "Result": result["result"], "Score": result["score"]}) |
|
history_table_data = [[g["Bet"], g["Roll"], g["Result"], g["Score"]] for g in game_history[::-1]] |
|
return result["result"], result["score"], history_table_data |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("## π² Dice Bet Game with LangGraph") |
|
with gr.Row(): |
|
bet_input = gr.Number(label="Your Bet (1-12)", value=7, precision=0) |
|
play_button = gr.Button("π² Roll Dice") |
|
with gr.Row(): |
|
result_output = gr.Textbox(label="Result") |
|
score_output = gr.Number(label="Total Winnings", value=0, precision=0, interactive=False) |
|
history_table = gr.Dataframe(headers=["Bet", "Roll", "Result", "Score"], label="Game History", interactive=False) |
|
|
|
play_button.click(play_game, inputs=[bet_input], outputs=[result_output, score_output, history_table]) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |