24Game / app.py
MrJShen's picture
Update app.py
27e26d0
Raw
History Blame Contribute Delete
5.43 kB
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)