Commit c725106b authored by diesys's avatar diesys 🎈

numeropartite eliminatorie singolo/doppio

parent ad5d0930
#!/usr/bin/env python3
import math, sys, json, os.path, time
import math
import sys
import json
import os.path
import time
# cartella dei tornei
tornei_dir = os.path.dirname('data/')
......@@ -14,19 +18,19 @@ def scriviTorneo(torneo, web=False):
# permission bad fix
if(not web):
os.chmod(torneo['FILE'], 0o666)
def importaTorneo(torneo, web=False):
# leggi da file
file_path = tornei_dir + '/' + torneo + '/' + torneo + '.json'
with open(file_path, 'r') as file_json:
dict_torneo = json.load(file_json)
if(not web):
os.chmod(file_path, 0o666)
aggiornaRanking(dict_torneo)
return dict_torneo
# crea un nuovo torneo con 'torneo' come nome di default
......@@ -38,10 +42,11 @@ def nuovoTorneo(nome="torneo", web=False):
file_path = tornei_dir + '/' + nome + '/' + nome + '.json'
dir_path = os.path.dirname(file_path)
# dir_path = os.path.dirname(tornei_dir + '/' + nome + '/' + file_name)
# dizionario torneo base vuoto
torneo = { 'NOME' : nome, 'FILE' : file_path, 'GIOCATORI' : {}, 'MATCHES' : [], 'RANKING' : [] }
torneo = {'NOME': nome, 'FILE': file_path,
'GIOCATORI': {}, 'MATCHES': [], 'RANKING': []}
# controlla se esiste la cartella col nome del torneo
if not os.path.exists(dir_path):
os.makedirs(dir_path)
......@@ -54,7 +59,7 @@ def nuovoTorneo(nome="torneo", web=False):
else:
print('Nome presente, cambiare nome per favore.\n')
return
return torneo
......@@ -63,16 +68,16 @@ def aggiungiGiocatore(torneo, nome, web=False):
# non esiste un altro giocatore con lo stesso nome. In caso positivo viene
# aggiunto il Giocatore. Gli viene assegnato un punteggio iniziale di 1440 e
# gli viene associato un numero d' iscrizione.
#controlla che non ci sia un giocatore con lo stesso NOME
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == nome:
print('Nome gia in uso: scegliere un altro NOME')
return torneo
# crea un dizionario ausiliario che verra' copiato nel torneo, l'ID e' anche chiave (univoca)
nuovoID = torneo['NOME'] + '_' + str(len(torneo['GIOCATORI']))
nuovoGiocatore = {'NOME' : nome, 'ID' : nuovoID, 'RANK' : 1440, 'MATCH' : 0}
nuovoGiocatore = {'NOME': nome, 'ID': nuovoID, 'RANK': 1440, 'MATCH': 0}
# aggiunge il nuovo giocatore al torneo
torneo['GIOCATORI'][str(len(torneo['GIOCATORI']))] = nuovoGiocatore
......@@ -86,28 +91,28 @@ def aggiungiGiocatore(torneo, nome, web=False):
def eliminaGiocatore(torneo, nome, web=False):
# Elimina dal torneo il Giocatore 'NOMEX'. Nella torneo e nella classifica del
# torneo al posto dei dati di tale giocatore sara' presente una riga del tipo
# ['ND',...]
# ['ND',...]
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == nome:
# imposta valori oltre i limiti al posto di cancellare, preserva l'ID
torneo['GIOCATORI'][str(id)]['NOME'] = 'ND'
torneo['GIOCATORI'][str(id)]['RANK'] = -9999
torneo['GIOCATORI'][str(id)]['MATCH'] = -1
# scrivi su file
scriviTorneo(torneo, web)
def nuoviPunteggiXY(torneo, giocatoreX, giocatoreY, risultatoX):
# Calcola i nuovi di due giocatori dopo una partita. Il risultato
# Calcola i nuovi di due giocatori dopo una partita. Il risultato
# è 1 se vince il primo giocatore, 0 se perde e 0.5 se pareggiano.
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == giocatoreX:
punteggioX = int(torneo['GIOCATORI'][str(id)]['RANK'])
matchX = int(torneo['GIOCATORI'][str(id)]['MATCH'])
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == giocatoreY:
punteggioY = int(torneo['GIOCATORI'][str(id)]['RANK'])
......@@ -119,8 +124,8 @@ def nuoviPunteggiXY(torneo, giocatoreX, giocatoreY, risultatoX):
#calcola risultato atteso per il giocatoreX e il giocatoreY
attesoX = 1/2 + (math.atan((punteggioX - punteggioY)/200)) / math.pi
attesoY = 1 - attesoX
#calcolo coefficienti moltiplicativi per il giocatoreX e il giocatoreY
#calcolo coefficienti moltiplicativi per il giocatoreX e il giocatoreY
if (matchX > 9 and punteggioX > 1569):
coefficienteX = 10
elif (matchX < 6):
......@@ -141,9 +146,10 @@ def nuoviPunteggiXY(torneo, giocatoreX, giocatoreY, risultatoX):
#calcolo punteggi totali del giocatoreX e giocatoreY
punteggioX = punteggioX + parzialeX
punteggioY = punteggioY + parzialeY
return [punteggioX, punteggioY]
def aggiornaTorneo(torneo, giocatoreX, giocatoreY, risultatoX, web=False):
# Calcola i punti ottenuti dopo che il giocatoreX ha sfidato il giocatoreY,
# ottenendo un risultatoX = 0 (sconfitta) oppure 0.5 (pareggio) oppure 1
......@@ -153,12 +159,12 @@ def aggiornaTorneo(torneo, giocatoreX, giocatoreY, risultatoX, web=False):
if (risultatoX != 1 and risultatoX != 0.5 and risultatoX != 0):
print('Risultato della partita errato')
return
return
if (giocatoreX == giocatoreY):
print('Un giocatore non puo giocare contro se stesso')
return
trovatoX = False
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == giocatoreX:
......@@ -174,29 +180,34 @@ def aggiornaTorneo(torneo, giocatoreX, giocatoreY, risultatoX, web=False):
if not trovatoY:
print('GiocatoreY non presente al torneo')
return
else:
#calcola nuovi punteggi del giocatoreX e giocatoreY
[nuovoPunteggioX, nuovoPunteggioY] = nuoviPunteggiXY(torneo, giocatoreX, giocatoreY, risultatoX)
[nuovoPunteggioX, nuovoPunteggioY] = nuoviPunteggiXY(
torneo, giocatoreX, giocatoreY, risultatoX)
#aggiornamento dati giocatoreX nel torneo
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == giocatoreX:
torneo['GIOCATORI'][str(id)]['RANK'] = nuovoPunteggioX
torneo['GIOCATORI'][str(id)]['MATCH'] = torneo['GIOCATORI'][str(id)]['MATCH'] + 1
torneo['GIOCATORI'][str(
id)]['MATCH'] = torneo['GIOCATORI'][str(id)]['MATCH'] + 1
#aggiornamento dati giocatoreY nel torneo
for id in range(len(torneo['GIOCATORI'])):
if torneo['GIOCATORI'][str(id)]['NOME'] == giocatoreY:
torneo['GIOCATORI'][str(id)]['RANK'] = nuovoPunteggioY
torneo['GIOCATORI'][str(id)]['MATCH'] = torneo['GIOCATORI'][str(id)]['MATCH'] + 1
torneo['GIOCATORI'][str(
id)]['MATCH'] = torneo['GIOCATORI'][str(id)]['MATCH'] + 1
now = time.localtime()
dataora = str(now[3]) + ':' + str(now[4]) + ' - ' + str(now[2]) + '/' + str(now[1])
dataora = str(now[3]) + ':' + str(now[4]) + ' - ' + \
str(now[2]) + '/' + str(now[1])
# aggiorna classifica
aggiornaRanking(torneo)
torneo['MATCHES'].append((giocatoreX, giocatoreY, risultatoX, '(' + dataora + ')'))
torneo['MATCHES'].append(
(giocatoreX, giocatoreY, risultatoX, '(' + dataora + ')'))
return scriviTorneo(torneo, web)
......@@ -221,15 +232,16 @@ def aggiornaRanking(torneo, web=False):
nome = torneo['GIOCATORI'][i]['NOME']
rank = torneo['GIOCATORI'][i]['RANK']
partite = torneo['GIOCATORI'][i]['MATCH']
if(torneo['GIOCATORI'][i]['MATCH'] > 5):
stabile = True
else:
stabile = False
classifica.append((nome, rank, partite, stabile))
classifica = sorted(classifica, key=lambda giocatore: (giocatore[1], giocatore[2]), reverse=True) #sort su due criteri (punteggio, partite)
classifica = sorted(classifica, key=lambda giocatore: (
giocatore[1], giocatore[2]), reverse=True) # sort su due criteri (punteggio, partite)
torneo['RANKING'] = classifica
......@@ -254,17 +266,17 @@ HELP = 'Benvenuto in torneo-web (interfaccia CLI), le opzioni sono le seguenti:\
## sezione opzioni script
if(len(sys.argv) > 1): ## getting parameters if exist
if(len(sys.argv) > 1): # getting parameters if exist
options = sys.argv
## check if there is '--web' option (workaround for php permissions)
if any("--web" in o for o in options):
web = True
else:
web = False
if(options[1] == '-n' or options[1] == '--new'):
if(len(options)>2):
if(len(options) > 2):
nuovoTorneo = nuovoTorneo(options[2])
tornei = {options[2]: nuovoTorneo}
......@@ -272,17 +284,16 @@ if(len(sys.argv) > 1): ## getting p
else:
print('Manca il nome del torneo!')
elif(options[1] == '-i' or options[1] == '--import'):
if(len(options) > 2):
torneo_test = options[2]
torneo = importaTorneo(torneo_test, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
tornei = {torneo['NOME'] : torneo}
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo_test, web)
tornei = {torneo['NOME']: torneo}
else:
print('Manca il nome del torneo!')
elif(options[1] == '-p' or options[1] == '--print'):
if(len(options) > 2):
torneo = options[2]
......@@ -292,12 +303,12 @@ if(len(sys.argv) > 1): ## getting p
else:
print('Manca il nome del torneo!')
elif(options[1] == '-a' or options[1] == '--add'):
if(len(options) > 2):
torneo = options[2]
torneo = importaTorneo(torneo, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo, web)
if(len(options) > 3):
giocatore = options[3]
......@@ -308,13 +319,13 @@ if(len(sys.argv) > 1): ## getting p
else:
print('Manca il nome del torneo!')
elif(options[1] == '-d' or options[1] == '--delete'):
if(len(options) > 2):
torneo = options[2]
torneo = importaTorneo(torneo, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo, web)
if(len(options) > 3):
giocatore = options[3]
......@@ -325,13 +336,13 @@ if(len(sys.argv) > 1): ## getting p
else:
print('Manca il nome del torneo!')
elif(options[1] == '-u' or options[1] == '--update'):
if(len(options) > 2):
torneo = options[2]
torneo = importaTorneo(torneo, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo, web)
if(len(options) > 5):
giocatore1 = options[3]
giocatore2 = options[4]
......@@ -344,19 +355,24 @@ if(len(sys.argv) > 1): ## getting p
else:
print('Manca il nome del torneo!')
# stampaFormattato(tornei[torneo_test])
elif(options[1] == '-r' or options[1] == '--ranking'):
if(len(options) > 2):
torneo = options[2]
torneo = importaTorneo(torneo, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo, web)
instabili = False
caratteri_omessi = ",'[(]"
caratteri_sostituiti = ")"
if(torneo['NOME'] == 'singolo'):
numero_partite = 8
else:
numero_partite = 16
ranking = {'stabili': [], 'instabili': []}
for giocatore in torneo['RANKING']:
if (giocatore[-1]):
......@@ -367,11 +383,11 @@ if(len(sys.argv) > 1): ## getting p
if any("--web" in o for o in options):
print("<table class = 'table table-sm text-center table-bordered table-striped' ><thead class=''><tr><th scope='col'>Giocatore</th><th scope='col'>Punti</th><th scope='col'>Match</th></tr></thead><tbody>")
# giocatori stabili
for giocatore in ranking['stabili']:
# i evidenzia i primi 8 giocatori, selezionati per le eliminatorie
if(ranking['stabili'].index(giocatore) < 8):
if(ranking['stabili'].index(giocatore) < numero_partite):
classColore = 'table-success'
else:
classColore = ''
......@@ -380,7 +396,7 @@ if(len(sys.argv) > 1): ## getting p
print(" <td>" + str(giocatore[1]) + "</td>")
print(" <td>" + str(giocatore[2]) + "</td>")
print("</tr>")
if(len(ranking['instabili'])):
print("<table class = 'table table-sm text-center table-bordered table-striped' ><thead><tr class='bg-danger text-white'></><th scope='row'>Giocatori fuori classifica</th><th></th><th></th></tr></thead><tbody>")
# giocatori stabili
......@@ -390,11 +406,11 @@ if(len(sys.argv) > 1): ## getting p
print(" <td>" + str(giocatore[1]) + "</td>")
print(" <td>" + str(giocatore[2]) + "</td>")
print("</tr>")
print("</table>")
else:
ranking_str = ' ' + str(ranking['stabili'])
ranking_str = ' ' + str(ranking['stabili'])
if(instabili):
ranking_str += '\n== Match < 6 ==\n ' + str(ranking['instabili'])
......@@ -402,13 +418,13 @@ if(len(sys.argv) > 1): ## getting p
for char in caratteri_omessi:
ranking_str = ranking_str.replace(char, '')
ranking_str = ranking_str.replace(caratteri_sostituiti, '\n')
ranking_str = ranking_str.replace(caratteri_sostituiti, '\n')
print(ranking_str)
else:
print('Manca il nome del torneo!')
## lista dei tornei
elif(options[1] == '-l' or options[1] == '--list'):
......@@ -418,17 +434,17 @@ if(len(sys.argv) > 1): ## getting p
for char in caratteri_omessi:
tornei = tornei.replace(char, '')
tornei = tornei.replace(',', '\n')
tornei = tornei.replace(',', '\n')
print(tornei)
## lista dei giocatori
elif(options[1] == '-g' or options[1] == '--giocatori'):
if(len(options) > 2):
torneo = options[2]
torneo = importaTorneo(torneo, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo, web)
giocatori = []
......@@ -441,7 +457,7 @@ if(len(sys.argv) > 1): ## getting p
if any("--web" in o for o in options):
for giocatore in giocatori:
print("<option value='" + giocatore + "'>" + giocatore + "</option>")
else:
giocatori = str(giocatori)
caratteri_omessi = "'[(])"
......@@ -450,20 +466,17 @@ if(len(sys.argv) > 1): ## getting p
for char in caratteri_omessi:
giocatori = giocatori.replace(char, '')
giocatori = giocatori.replace(caratteri_sostituiti, '\n')
giocatori = giocatori.replace(caratteri_sostituiti, '\n')
print(giocatori)
else:
print('Manca il nome del torneo!')
elif(options[1] == '-m' or options[1] == '--match'):
if(len(options) > 2):
torneo = options[2]
torneo = importaTorneo(torneo, web) # True come parametro opzionale x funzionare coi permessi da shell e non da web
# True come parametro opzionale x funzionare coi permessi da shell e non da web
torneo = importaTorneo(torneo, web)
# la lista invertita per visualizzare l'ultima in alto
matches = torneo['MATCHES'][::-1]
......@@ -501,9 +514,8 @@ if(len(sys.argv) > 1): ## getting p
print(matches)
else:
print('Manca il nome del torneo!')
# stampaFormattato(tornei[torneo_test])
# stampaFormattato(tornei[torneo_test])
elif(options[1] == '--testNew'):
## test
......@@ -523,7 +535,6 @@ if(len(sys.argv) > 1): ## getting p
stampaFormattato(tornei[torneo_test])
# stampa su std output
# json.dump(tornei['pingpong'], sys.stdout)
elif(options[1] == '--impweb'):
## test
......@@ -534,9 +545,9 @@ if(len(sys.argv) > 1): ## getting p
# torneo = nuovoTorneo(torneo_test)
torneo = importaTorneo(torneo_test)
tornei = {torneo['NOME'] : torneo}
tornei = {torneo['NOME']: torneo}
# torneo = aggiungiGiocatore(tornei[torneo_test], 'Aacca')
# torneo = aggiungiGiocatore(tornei[torneo_test], 'michele')
aggiornaTorneo(tornei[torneo_test], 'michele', 'Aacca', 1)
......@@ -544,12 +555,11 @@ if(len(sys.argv) > 1): ## getting p
stampaFormattato(tornei[torneo_test])
# stampa raw su std output
# json.dump(tornei[torneo_test], sys.stdout)
elif(options[1] == '-h' or options[1] == '--help'):
elif(options[1] == '-h' or options[1] == '--help'):
print(HELP)
else:
print(HELP)
else:
print(HELP)
else:
print(HELP)
else:
print(HELP)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment