1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #!/usr/bin/env python3
# coding: utf-8
raw_input = input
from functools import cmp_to_key
class cRelique:
carac=("Titan Sante","Titan Degats","Titan Armure","Titan Perforation","Titan Critique","Troupes Degats","Resistance Distance","Resistance Melee","Horde Sante","Horde Degats","Horde Armure","Horde Perforation","Horde Critique","Omega Sante","Omega Degats","Omega Armure","Omega Perforation","Omega Critique","Titan Resistance Feu","Titan Resistance Glace","Titan Resistance Physique","Titan Resistance Vide","Titan Resistance Terre","Titan Resistance Poison","Titan Resistance Eclair","Horde Resistance Feu","Horde Resistance Glace","Horde Resistance Physique","Horde Resistance Vide","Horde Resistance Terre","Horde Resistance Poison","Horde Resistance Eclair","Omega Resistance Feu","Omega Resistance Glace","Omega Resistance Physique","Omega Resistance Vide","Omega Resistance Terre","Omega Resistance Poison","Omega Resistance Eclair")
def __init__(self, name="", TitanSante=0, TitanDegats=0, TitanArmure=0, TitanPerforation=0, TitanCritique=0, TroupesDegats=0, ResistanceDistance=0, ResistanceMelee=0, HordeSante=0, HordeDegats=0, HordeArmure=0, HordePerforation=0, HordeCritique=0, OmegaSante=0, OmegaDegats=0, OmegaArmure=0, OmegaPerforation=0, OmegaCritique=0, TitanResistanceFeu=0, TitanResistanceGlace=0, TitanResistancePhysique=0, TitanResistanceVide=0, TitanResistanceTerre=0, TitanResistancePoison=0, TitanResistanceEclair=0, HordeResistanceFeu=0, HordeResistanceGlace=0, HordeResistancePhysique=0, HordeResistanceVide=0, HordeResistanceTerre=0, HordeResistancePoison=0, HordeResistanceEclair=0, OmegaResistanceFeu=0, OmegaResistanceGlace=0, OmegaResistancePhysique=0, OmegaResistanceVide=0, OmegaResistanceTerre=0, OmegaResistancePoison=0, OmegaResistanceEclair=0):
self.__values={
"name" : name,
}
self.__values.update(
zip(
cRelique.carac,
(TitanSante, TitanDegats, TitanArmure, TitanPerforation, TitanCritique, TroupesDegats, ResistanceDistance, ResistanceMelee, HordeSante, HordeDegats, HordeArmure, HordePerforation, HordeCritique, OmegaSante, OmegaDegats, OmegaArmure, OmegaPerforation, OmegaCritique, TitanResistanceFeu, TitanResistanceGlace, TitanResistancePhysique, TitanResistanceVide, TitanResistanceTerre, TitanResistancePoison, TitanResistanceEclair, HordeResistanceFeu, HordeResistanceGlace, HordeResistancePhysique, HordeResistanceVide, HordeResistanceTerre, HordeResistancePoison, HordeResistanceEclair, OmegaResistanceFeu, OmegaResistanceGlace, OmegaResistancePhysique, OmegaResistanceVide, OmegaResistanceTerre, OmegaResistancePoison, OmegaResistanceEclair),
)
)
# __init__()
# Pour pouvoir utiliser l'objet comme un dictionnaire
__getitem__=lambda self, k: self.__values[k]
# La liste des combinaisons d'objets
#@staticmethod
def comb(n, reliques):
# Fonction récursive de génération
def generate_r(n, lst):
if n == 0: return ((),)
return tuple(
(x,) + tuple(suffix,)
for (i, x) in enumerate(lst)
for suffix in generate_r(n-1, lst[i+1:])
)
# generate_r()
# Génération des reliques
return generate_r(n, reliques)
# comb()
# Les totaux des valeurs des combinaisons
#@staticmethod
def totaux(reliques, comb, base=None):
tot={}
for c in comb:
tot[c]={}
for k in cRelique.carac:
tot[c][k]=sum(x[k] for x in reliques if x in c)
if base: tot[c][k]+=base[k]
# for
return tot
# totaux()
# Le tri des totaux
#@staticmethod
def sort(tableau, liste_keys, reverse=False):
# La fonction qui compare deux items du tableau
def comp(x, y):
# On va faire une comparaison des items sur chaque critère
for (k, v) in liste_keys:
ret={
"<" : (-1, 1),
">" : (1, -1),
}[v]
if x[1][k] < y[1][k]: return ret[0]
if x[1][k] > y[1][k]: return ret[1]
# for
# Les deux items sont définitivement identiques
return 0
# comp()
# On trie le tableau selon ce que renvoie la fonction (là Python se démerde pour appeler la fonction sur chaque élément du tableau autant de fois qu'il le faut)
return sorted(tableau, key=cmp_to_key(comp), reverse=reverse)
# sort()
# class cRelique
Relique=(
cRelique(" FioleMaudite ", 0 , 60 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 50 , 0 , 0 , 0 , 0 , 50 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 ,),
cRelique(" CouronneD'Osiris ", 0 , 30 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 30 , 0 , 36 , 0 , 0 , 30 , 0 , 36 , 36 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,),
cRelique(" EpéeEnOs ", 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 50 , 0 , 30 , 20 , 0 , 50 , 0 , 30 , 20 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,),
cRelique(" DagueDeSacrifice ", 0 , 50 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 50 , 0 , 30 , 0 , 0 , 50 , 0 , 30 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,),
cRelique(" OrbeDeRancoeur ", 0 , 30 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 30 , 0 , 0 , 0 , 0 , 30 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 24 , 24 , 0 , 0 , 0 , 0 , 0 , 24 , 24 , 0 , 0 , 0 , 0 , 0 , 24 , 24 , 0 ,)
)
Base=cRelique(0, 0, 0, 0, 0)
# Calcul des combinaisons possibes
combinaisons=cRelique.comb(3, Relique)
#print("comb: ", tuple(tuple(r["name"] for r in c) for c in combinaisons))
# Les totaux des valeurs des combinaisons
totaux=cRelique.totaux(Relique, combinaisons, Base)
#print("totaux")
#for (k, v) in totaux.items():
# print(tuple(x["name"] for x in k), v)
#Choix des paramètres
print(" ".join("%d.%s" % (i, c) for (i, c) in enumerate(cRelique.carac, 1)))
while True:
reponse = raw_input("Choisissez un 1er paramètre de tri: ")
choix1=dict((i, c) for (i, c) in enumerate(cRelique.carac, 1)).get(int(reponse))
if choix1 is not None: break
print ("Choix incorrect !")
while True:
reponse = raw_input("Choisissez un 2ème paramètre de tri: ")
choix2=dict((i, c) for (i, c) in enumerate(cRelique.carac, 1)).get(int(reponse))
if choix2 is not None: break
print ("Choix incorrect !")
# while
#print(choix1)
#print(choix2)
# Le tri des totaux
tri=cRelique.sort(totaux.items(), ((choix1, ">"), (choix2, ">")), reverse=False)
#print("tri")
for t in tri:
obFichier = open('Monfichier.txt','a')
obFichier.write("*"*50 + "\n")
obFichier.write(str(tuple(x["name"] for x in t[0])) + "\n")
for k in cRelique.carac:
obFichier.write(str("%s: %d\n" % (k, t[1][k]))) |
Partager