Value-Props / tabs /game_tab.py
Demosthene-OR's picture
Initialization 2
4df9e3a
import streamlit as st
import pandas as pd
import numpy as np
import os
import time
import matplotlib.pyplot as plt
import random
import json
import csv
from extra_streamlit_components import tab_bar, TabBarItemData
import matplotlib.pyplot as plt
from datetime import datetime
import tracemalloc
from translate_app import tr
title = "Jouez avec nous !"
sidebar_name = "Jeu"
dataPath = st.session_state.DataPath
@st.cache_data
def init_game():
new = int(time.time())
sentence_test = pd.read_csv(dataPath+'/multilingue/sentence_test_extract.csv')
sentence_test = sentence_test[4750:]
# Lisez le contenu du fichier JSON
with open(dataPath+'/multilingue/lan_to_language.json', 'r') as fichier:
lan_to_language = json.load(fichier)
t_now = time.time()
return sentence_test, lan_to_language, new, t_now
def find_indice(sent_selected):
l = list(lan_to_language.keys())
for i in range(len(l)):
if l[i] == sentence_test['lan_code'].iloc[sent_selected]:
return i
@st.cache_data
def set_game(new):
nb_st = len(sentence_test)
sent_sel = []
# Utilisez une boucle pour générer 5 nombres aléatoires différents
while len(sent_sel) < 5:
nombre = random.randint(0, nb_st)
if nombre not in sent_sel:
sent_sel.append(nombre)
rep_possibles=[]
for i in range(5):
rep_possibles.append([find_indice(sent_sel[i])])
while len(rep_possibles[i]) < 5:
rep_possible = random.randint(0, 95)
if rep_possible not in rep_possibles[i]:
rep_possibles[i].append(rep_possible)
random.shuffle(rep_possibles[i])
return sent_sel, rep_possibles, new
def calc_score(n_rep,duration):
if n_rep==0: return 0
s1 = n_rep*200
if duration < 60:
s2 = (60-duration)*200/60
if n_rep==5:
s2 *= 2.5
else:
s2 = max(-(duration-60)*100/60,-100)
s = int(s1+s2)
return s
def read_leaderboard():
return pd.read_csv(dataPath+'/game_leaderboard.csv', index_col=False,encoding='utf8')
def write_leaderboard(lb):
lb['Nom'] = lb['Nom'].astype(str)
lb['Rang'] = lb['Rang'].astype(int)
lb.to_csv(path_or_buf=dataPath+'/game_leaderboard.csv',columns=['Rang','Nom','Score','Timestamp','BR','Duree'],index=False, header=True,encoding='utf8')
def display_leaderboard():
lb = read_leaderboard()
st.write("**"+tr("Leaderboard")+" :**")
list_champ = """
| Rang | Nom | Score |
|------|------------|-------|"""
if len(lb)>0:
for i in range(len(lb)):
list_champ += """
| """+str(lb['Rang'].iloc[i])+""" | """+str(lb['Nom'].iloc[i])[:9]+""" | """+str(lb['Score'].iloc[i])+""" |"""
st.markdown(list_champ, unsafe_allow_html=True )
return lb
def write_log(TS,Nom,Score,BR,Duree):
log = pd.read_csv(dataPath+'/game_log.csv', index_col=False,encoding='utf8')
date_heure = datetime.fromtimestamp(TS)
Date = date_heure.strftime('%Y-%m-%d %H:%M:%S')
log = pd.concat([log, pd.DataFrame(data={'Date':[Date], 'Nom':[Nom],'Score':[Score],'BR':[BR],'Duree':[Duree]})], ignore_index=True)
log.to_csv(path_or_buf=dataPath+'/game_log.csv',columns=['Date','Nom','Score','BR','Duree'],index=False, header=True,encoding='utf8')
def display_files():
log = pd.read_csv(dataPath+'/game_log.csv', index_col=False,encoding='utf8')
lb = pd.read_csv(dataPath+'/game_leaderboard.csv', index_col=False,encoding='utf8')
st.dataframe(lb)
st.dataframe(log)
def run():
global sentence_test, lan_to_language
sentence_test, lan_to_language, new, t_debut = init_game()
st.write("")
st.title(tr(title))
st.write("#### **"+tr("Etes vous un expert es Langues ?")+"**\n")
st.markdown(tr(
"""
Essayer de trouvez, sans aide, la langue des 5 phrases suivantes.
Attention : Vous devez être le plus rapide possible !
"""), unsafe_allow_html=True
)
st.write("")
player_name = st.text_input(tr("Quel est votre nom ?"))
if player_name == 'display_files':
display_files()
return
elif player_name == 'malloc_start':
tracemalloc.start()
return
elif player_name == 'malloc_stop':
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')
# pick the biggest memory block
for k in range(3):
stat = top_stats[k]
print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))
for line in stat.traceback.format():
print(' >'+line)
total_mem = sum(stat.size for stat in top_stats)
print("Total allocated size: %.1f KiB" % (total_mem / 1024))
return
score = 0
col1, col2 = st.columns([0.7,0.3])
with col2:
lb = display_leaderboard()
with col1:
sent_sel, rep_possibles, new = set_game(new)
answer = [""] * 5
l = list(lan_to_language.values())
for i in range(5):
answer[i] = st.radio("**:blue["+sentence_test['sentence'].iloc[sent_sel[i]]+"]**\n",[l[rep_possibles[i][0]],l[rep_possibles[i][1]],l[rep_possibles[i][2]], \
l[rep_possibles[i][3]],l[rep_possibles[i][4]]], horizontal=True, key=i)
t_previous_debut = t_debut
t_debut = time.time()
if st.button(label=tr("Validez"), type="primary"):
st.cache_data.clear()
nb_bonnes_reponses = 0
for i in range(5):
if lan_to_language[sentence_test['lan_code'].iloc[sent_sel[i]]]==answer[i]:
nb_bonnes_reponses +=1
t_fin = time.time()
duration = t_fin - t_previous_debut
score = calc_score(nb_bonnes_reponses,duration)
write_log(time.time(),player_name,score,nb_bonnes_reponses,duration)
if nb_bonnes_reponses >=4:
st.write(":red[**"+tr("Félicitations, vous avez "+str(nb_bonnes_reponses)+" bonnes réponses !")+"**]")
st.write(":red["+tr("Votre score est de "+str(score)+" points")+"]")
else:
if nb_bonnes_reponses >1 : s="s"
else: s=""
st.write("**:red["+tr("Vous avez "+str(nb_bonnes_reponses)+" bonne"+s+" réponse"+s+".")+"]**")
if nb_bonnes_reponses >0 : s="s"
else: s=""
st.write(":red["+tr("Votre score est de "+str(score)+" point"+s)+"]")
st.write(tr("Bonne réponses")+":")
for i in range(5):
st.write("- "+sentence_test['sentence'].iloc[sent_sel[i]]+" -> :blue[**"+lan_to_language[sentence_test['lan_code'].iloc[sent_sel[i]]]+"**]")
new = int(time.time())
st.button(label=tr("Play again ?"), type="primary")
with col2:
now = time.time()
# Si le score du dernier est plus vieux d'une semaine, il est remplacé par un score + récent
renew_old = ((len(lb)>9) and (lb['Timestamp'].iloc[9])<(now-604800))
if (score>0) and ((((score >= lb['Score'].min()) and (len(lb)>9)) or (len(lb)<=9)) or (pd.isna(lb['Score'].min())) or renew_old):
if player_name not in lb['Nom'].tolist():
if (((score >= lb['Score'].min()) and (len(lb)>9)) or (len(lb)<=9)) or (pd.isna(lb['Score'].min())) :
lb = pd.concat([lb, pd.DataFrame(data={'Nom':[player_name],'Score':[score],'Timestamp':[now],'BR':[nb_bonnes_reponses],'Duree':[duration]})], ignore_index=True)
lb = lb.sort_values(by=['Score', 'Timestamp'], ascending=[False, False]).reset_index()
lb = lb.drop(lb.index[10:])
else:
st.write('2:',player_name)
lb['Nom'].iloc[9]= player_name
lb['Score'].iloc[9]= score
lb['Timestamp'].iloc[9]=now
lb['BR'].iloc[9]=nb_bonnes_reponses
lb['Duree'].iloc[9]=duration
lb = lb.reset_index()
else:
liste_Nom = lb['Nom'].tolist()
for i,player in enumerate(liste_Nom):
if player == player_name:
if lb['Score'].iloc[i] < score:
lb['Score'].iloc[i] = score
lb['Timestamp'].iloc[i]=now
lb = lb.sort_values(by=['Score', 'Timestamp'], ascending=[False, False]).reset_index()
for i in range(len(lb)):
if (i>0):
if (lb['Score'].iloc[i]==lb['Score'].iloc[i-1]):
lb['Rang'].iloc[i] = lb['Rang'].iloc[i-1]
else:
lb['Rang'].iloc[i] = i+1
else:
lb['Rang'].iloc[i] = i+1
if player_name !="":
write_leaderboard(lb)
return