Demosthene-OR's picture
Change translator to deep-translator module
74cb5f4
raw
history blame
9.39 kB
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