24Game / app.py
MrJShen's picture
Update app.py
27e26d0
import streamlit as st
from PIL import Image
import random, operator, ast, sqlite3, datetime, json, math
from itertools import product, permutations
from utils import *
from sqlite3 import Connection
import pandas as pd
@st.cache_data()
def static_variables():
suits = ["hearts","spades","diamonds","clubs"]; jo = "_of_"; path = "static/"
return suits, jo, path
@st.cache_data(ttl=3600*4)
def static_layout_top():
st.header("24 Game!")
st.markdown(f"""Welcome! Today is {st.session_state.date}""")
st.markdown("""
#### How to play:
- Using +, -, *, / , and () on 4 cards to get 24;
- Each card represent a number as shown, where J=11, Q=12, K=13, and A=1
- You will have 3 operations, and you have to express the first and second
operation explicitly, e.g. even though you have 6, 6, 6, 6 and you know that
6 + 6 + 6 + 6 = 24, you need to type your expression clearly as ((6+6)+6)+6 or
(6+6)+(6+6) to specify your first two operations.
- The algorithm encourage thinking of associativity, so, (12/6)*(11+1) and
(12/6)*(1+11) would be counted as two different and correct answers.
""")
c0, c1, c2, c3 = st.columns([0.25,0.25,0.25,0.25]); cs = [c0,c1,c2,c3]
for idx, x in enumerate(cs):
with x:
im = Image.open(path+str(st.session_state.nums[idx])+jo+st.session_state.su[idx]+".png")
st.image(im)
@st.cache_resource(ttl=3600*4)
def get_cards():
i = True
while i:
nums = random.sample(range(1,14),4)
suit = random.sample(suits,4)
sols = solve24(nums)
i = (len(sols) == 0)
conn = get_connection("data24.db"); date = str(datetime.date.today())
value = (date, str(nums), str(suit), str(sols), len(sols))
insert_value_games(conn, value)
return nums, suit, sols, date, conn
def check_ans_default(inp): # for non-id player
if inp in st.session_state.sols:
if st.session_state.get('ans') == None:
st.session_state['ans'] = {inp}
else:
s1 = st.session_state['ans']
s1.add(inp)
st.session_state['ans'] = s1
a1, a2 = st.columns([0.5,0.5])
with a1:
st.markdown(f"Got one! :green[${inp}=24$]")
with a2:
st.markdown(f"There are {len(st.session_state.sols)} expressions in total. :chart_with_upwards_trend:")
else:
st.write("Oop! Incorrect.....")
return
def check_ans_user(inp): # On session, but data on cache_resource
id = int(st.session_state.u_id); date = st.session_state.date;
nums = str(st.session_state.nums); suit = str(st.session_state.su)
df = get_plays_answer(st.session_state.conn, id, date, nums)
if len(df) > 0:
st.session_state['ans'] = set(ast.literal_eval(df.values[0][0]))
else:
st.session_state['ans'] = set()
if inp in st.session_state.sols:
s1 = st.session_state['ans']
if len(s1) > 0:
s1.add(inp)
else:
s1 = {inp}
st.session_state['ans'] = s1
if st.session_state.u_id is not None:
if not check_plays_user(st.session_state.conn, id, date, nums):
value = (id, date, nums, suit, json.dumps(s1,default=tuple))
insert_value_plays(st.session_state.conn, value)
else:
update_value_plays(st.session_state.conn, id, date, nums, json.dumps(s1,default=tuple))
else:
st.write("Oop! Incorrect.....")
# Call statics and session variables
suits, jo, path = static_variables()
st.session_state['nums'], st.session_state['su'], st.session_state['sols'], st.session_state['date'], st.session_state['conn'] = get_cards()
# Call page layout
#with st.sidebar:
# df = get_top_board(st.session_state.conn)
# df = top_board_df(df)
# st.write(df)
static_layout_top()
# User data collecting
#with st.expander("If you want to join the competition"):
# u1, u2 = st.columns([0.5,0.5])
# with u1:
# st.text_input("Enter your TGS id for prize:", key="u_id")
# with u2:
# st.text_input("The user name, one per TGS id", key="u_name")
# if st.button("Join Weekly Competition"):
# conn = st.session_state.conn; u_id = int(st.session_state.u_id); u_name = st.session_state.u_name
# if check_value_user(conn, u_id):
# st.write("You already joined the competition, good luck! :smile:")
# else:
# insert_value_user(conn, (u_id, u_name))
# st.write(f"Welcome {u_name}! You just signed up for this week's competition! Good Luck!")
# User plays collecting
inp = st.text_input("Enter your expression here: ").replace(" ", "")
if st.button("Try your luck!"):
#if st.session_state.u_id:
# check_ans_user(inp)
#else:
check_ans_default(inp)
#st.write(st.session_state.ans) #-- local testing only
# Display session answers
if st.session_state.get('ans') == None:
pass
else:
st.markdown("### Your correct answers: ")
col = 4; n = len(st.session_state.ans)
row = math.ceil(n / col)
for i in range(row):
cols = st.columns(col)
for m in range(min(4, n-4*i)):
cols[m].latex(list(st.session_state.ans)[m+i*4].replace("/","\div"))
st.markdown("##")
#st.write(st.session_state.sols)