Bonjour!
J'ai pour objectif de créer un système de score dans mon jeu.
Le joueur est invité à marqué son nom, puis le score sera automatiquement enregistré à côté du nom dans un fichier bloc note.
Par exemple :
Alexandress,1563
Risitas,20
Toi,56
...
Etc
J'arrive donc à écrire le tout dans un bloc note, mais j'aimerais ensuite convertir le tout en une liste (j'y arrive) puis ensuite la trier en fonction du score pour obtenir un nombre décroissant des meilleurs scores (c'est là ou ça coince)
Il semblerait que le code ne peut pas classer sur le deuxiéme terme de la liste puisqu'il le considère comme un string à cause du /n ? Je n'arrive pas à l'enlever. Le code semble trier uniquement sur le premier chiffre, par exemple si c'est un 2 et 5 il va les trier dans le bon ordre : Alexandress,5 puis Alexandress,2
Mais si c'est 20 et 5 il va ignorer le 0 et va donner :
Alexandress,5 puis Alexandress,20.
(Je sais pas si c'est clair? )
Merci pour votre aide
oui=input("saissisez qq chose") #Nom
oui=str(oui)
o=3 #Valeur du score
o=str(o)
b=1
i=0
j=0
p=0
t=0
fichier = open("data.txt", "a")
fichier.write(oui)
fichier.write(',')
fichier.write(o)
fichier.write('\n')
fichier.close()
fichier = open("data.txt", "r")
ligne = fichier.readline()
toutesleslignes= fichier.readlines()
premierElement = ligne.split(',')
print (premierElement[0])
print (premierElement[1])
print (toutesleslignes)
print (ligne)
listlignes = [] #On fait une liste
while i < len(toutesleslignes) :
listlignes=listlignes + [toutesleslignes[i].split(',')]
i=i+1
print (listlignes)
print ("Séparation avant le tri")
while j<len (listlignes)-1 : #Tri
v=0
while v<len (listlignes)-1 :
if listlignes[v][1]<listlignes[v+1][1] :
rep=listlignes[v]
listlignes[v]=listlignes[v+1]
listlignes[v+1]=rep
v=v+1
j=j+1
print (listlignes)
fichier.close()
Petite update; j'ai réussi à enlever le /n à la fin mais le problème est toujours là, il me prend les chiffres que pour le premier nombre et c'est tout.
oui=input("saissisez qq chose") #Nom
oui=str(oui)
o=9 #Valeur du score
o=str(o)
b=1
i=0
j=0
t=0
fichier = open("data.txt", "a")
fichier.write(oui)
fichier.write(',')
fichier.write(o)
fichier.write('\n')
fichier.close()
fichier = open("data.txt", "r")
#ligne = fichier.readline()
toutesleslignes= fichier.readlines()
#premierElement = ligne.split(',')
#print (premierElement[0])
#print (premierElement[1])
print (toutesleslignes)
#print (ligne)
print ("Séparation")
listlignes = [] #On fait une liste
while i < len(toutesleslignes) :
listlignes=listlignes + [toutesleslignes[i].split(',')]
i=i+1
print (listlignes)
print ("Séparation avant le truc de n")
while t <len (listlignes) : #On remove les n
s=0
while s<len (listlignes) :
listlignes[s][1]= listlignes[s][1].rstrip('\n')
s=s+1
t=t+1
print (listlignes)
print ("Séparation avant le tri")
while j<len (listlignes)-1 : #Tri
v=0
while v<len (listlignes)-1 :
if listlignes[v][1]<listlignes[v+1][1] :
rep=listlignes[v]
listlignes[v]=listlignes[v+1]
listlignes[v+1]=rep
v=v+1
j=j+1
print (listlignes)
fichier.close()
while b==1:
b=1
Re-update, j'ai réussi à convertir les listes de score de string en int mais ça ne marche pas sur les grand nombres en fait; je me retrouve avec du 2000 string converti en 2,0,0,0 en int...
oui=input("saissisez qq chose") #Nom
oui=str(oui)
o=20000 #Valeur du score
o=str(o)
b=1
i=0
j=0
t=0
jsp=0
fichier = open("data.txt", "a")
fichier.write(oui)
fichier.write(',')
fichier.write(o)
fichier.write('\n')
fichier.close()
fichier = open("data.txt", "r")
#ligne = fichier.readline()
toutesleslignes= fichier.readlines()
#premierElement = ligne.split(',')
#print (premierElement[0])
#print (premierElement[1])
print (toutesleslignes)
#print (ligne)
print ("Séparation")
listlignes = [] #On fait une liste
while i < len(toutesleslignes) :
listlignes=listlignes + [toutesleslignes[i].split(',')]
i=i+1
print (listlignes)
print ("Séparation avant le truc de n")
while t <len (listlignes) : #On remove les n
s=0
while s<len (listlignes) :
listlignes[s][1]= listlignes[s][1].rstrip('\n')
s=s+1
t=t+1
print (listlignes)
print ("Séparation avant la convertion de string en int")
while jsp <len (listlignes) :
p=0
while p <len (listlignes) :
listlignes[p][1] = list(map(int, listlignes[p][1]))
p=p+1
jsp=jsp+1
print (listlignes)
print ("Séparation avant le tri")
while j<len (listlignes)-1 : #Tri
v=0
while v<len (listlignes)-1 :
if listlignes[v][1]<listlignes[v+1][1] :
rep=listlignes[v]
listlignes[v]=listlignes[v+1]
listlignes[v+1]=rep
v=v+1
j=j+1
print (listlignes)
fichier.close()
while b==1:
b=1
pourquoi ne pas utiliser une base SQLite ?
tu aura juste a balancer t'es données dedans sans te soucier de l'ordre ,
puis quand tu a besoin de lire tes scores tu indique dans ta requête que tu veux la liste des scores mais décroissant ,
c'est plus simple , plus fiable, plus rapide , ça te fait gagner beaucoup de temps et ça t'offres plus de possibilités (afficher le score de façon croissant , décroissant , le dernier score enregistrer ect.....)
tu na pas besoin de serveur pour une base SQLite c'est riens d'autre qu'un fichier comme ton fichier data.txt,
ça ne répond pas a ta question mais selon moi tu te complique la vie pour rien ![]()
essaie de convertir en utilisant int()
while jsp < len(listlignes):
p = 0
while p < len(listlignes):
listlignes[p][1] = int(listlignes[p][1])
p = p + 1
jsp = jsp + 1
Le 02 mai 2018 à 18:26:17 mgpercoman a écrit :
pourquoi ne pas utiliser une base SQLite ?
tu aura juste a balancer t'es données dedans sans te soucier de l'ordre ,
puis quand tu a besoin de lire tes scores tu indique dans ta requête que tu veux la liste des scores mais décroissant ,
c'est plus simple , plus fiable, plus rapide , ça te fait gagner beaucoup de temps et ça t'offres plus de possibilités (afficher le score de façon croissant , décroissant , le dernier score enregistrer ect.....)tu na pas besoin de serveur pour une base SQLite c'est riens d'autre qu'un fichier comme ton fichier data.txt,
ça ne répond pas a ta question mais selon moi tu te complique la vie pour rien
Parce que c'est dans le cadre d'un projet, et je me suis limité à Python pour le faire ![]()
Après j'pense avoir deux-trois libertés mais je m'y connais pas du tout en SQL du coup voilà
Le 02 mai 2018 à 18:37:26 kickme a écrit :
essaie de convertir en utilisant int()while jsp < len(listlignes):
p = 0
while p < len(listlignes):
listlignes[p][1] = int(listlignes[p][1])
p = p + 1
jsp = jsp + 1
Bah c'était tout con ![]()
J'pensais pas pouvoir convertir une liste en int mais en fait si
(Me semblait avoir déjà essayer et fail
)
En tout cas merci le problème est réglé!
Voici le code si quelqu'un est intéressée dans le futur :
oui=input("Nom du joueur : ") #Nom
oui=str(oui)
o=20000 #Valeur du score
o=str(o)
b=1
i=0
j=0
t=0
jsp=0
fichier = open("data.txt", "a")
fichier.write(oui)
fichier.write(',')
fichier.write(o)
fichier.write('\n')
fichier.close()
fichier = open("data.txt", "r")
#ligne = fichier.readline()
toutesleslignes= fichier.readlines()
#premierElement = ligne.split(',')
#print (premierElement[0])
#print (premierElement[1])
print (toutesleslignes)
#print (ligne)
print ("Séparation")
listlignes = [] #On fait une liste
while i < len(toutesleslignes) :
listlignes=listlignes + [toutesleslignes[i].split(',')]
i=i+1
print (listlignes)
print ("Séparation avant de retirer le /n")
while t <len (listlignes) : #On remove les n
s=0
while s<len (listlignes) :
listlignes[s][1]= listlignes[s][1].rstrip('\n')
s=s+1
t=t+1
print (listlignes)
print ("Séparation avant la conversion de string en int")
while jsp <len (listlignes) :
p=0
while p <len (listlignes) :
listlignes[p][1] = int(listlignes[p][1])
p=p+1
jsp=jsp+1
print (listlignes)
print ("Séparation avant le tri")
while j<len (listlignes)-1 : #Tri
v=0
while v<len (listlignes)-1 :
if listlignes[v][1]<listlignes[v+1][1] :
rep=listlignes[v]
listlignes[v]=listlignes[v+1]
listlignes[v+1]=rep
v=v+1
j=j+1
print (listlignes)
fichier.close()
while b==1:
b=1
honnêtement je pense que ton truc est foireux ![]()
j'immagine deja la lenteur de ton code quand ton fichier sera bien rempli ...
fait des recherches sur le SQLite c'est pas compliqué , tu me remerciera plus tard ![]()
tient je suis gentil : https://docs.python.org/2/library/sqlite3.html :
import sqlite3
conn = sqlite3.connect('data.db')
c = conn.cursor()
c.execute('''CREATE TABLE scores
(nom TEXT, score real)''')
nomJoueur = input("Nom du joueur : ")
scoreJoueur = 2000
c.execute("INSERT INTO scores VALUES (nomJoueur,scoreJoueur)")
conn.commit()
for row in c.execute('SELECT * FROM scores ORDER BY score DESC'):
print row10 lignes qui donne exactement le même résultat que ton code ![]()
Oui, si t'es pas contraint passe par SQLite, c'est intégré dans python, et une bdd ca change la vie
par pitier remplace moi tes :
i=0
while i < len(toutesleslignes) :
print(str(i))par des :
for i in range(0,len(toutesleslignes)) :
print(str(i))et j'ai tellement de chose a dire sur ton code , il y a trop de truc qui ne vont pas ... mais je vais m'abstenir ![]()
j'immagine deja la lenteur de ton code quand ton fichier sera bien rempli ...
Son fichier ne sera jamais bien rempli, c'est un projet (scolaire ?) pour apprendre la programmation et personne ne jouera jamais à son jeu. S'il ne sait pas convertir une chaîne de caractères en entier ce n'est pas contourner le problème en utilisant un autre outil qu'il va progresser.
Le 02 mai 2018 à 22:25:31 Seins_en_MP_SVP a écrit :
j'immagine deja la lenteur de ton code quand ton fichier sera bien rempli ...
Son fichier ne sera jamais bien rempli, c'est un projet (scolaire ?) pour apprendre la programmation et personne ne jouera jamais à son jeu. S'il ne sait pas convertir une chaîne de caractères en entier ce n'est pas contourner le problème en utilisant un autre outil qu'il va progresser.
j'essais juste de le ramener sur le droit chemin
il va très vite abandonner quand il voudra rajouter plus de fonctionnalités, j'aurais aimé qu'on me guide a mes début quand je me suis égaré
, a l'époque j'avais
créer un réseau social sans utiliser de base de données , uniquement des boucles for et des conditions, je stockais tout dans des fichiers .txt
c'était horrible , mine de rien j'avais créer un mini moteur de base de données, c'était tellement lent que je m'étais lancé comme défi de l'améliorer en stockant tout dans la RAM et juste faire des backup de temps en temps pour minimiser les accès au disque
je l'ai abonné quand j'ai compris l'utilité d'une base de données ![]()
Le 02 mai 2018 à 22:51:10 mgpercoman a écrit :
Le 02 mai 2018 à 22:25:31 Seins_en_MP_SVP a écrit :
j'immagine deja la lenteur de ton code quand ton fichier sera bien rempli ...
Son fichier ne sera jamais bien rempli, c'est un projet (scolaire ?) pour apprendre la programmation et personne ne jouera jamais à son jeu. S'il ne sait pas convertir une chaîne de caractères en entier ce n'est pas contourner le problème en utilisant un autre outil qu'il va progresser.
j'essais juste de le ramener sur le droit chemin
il va très vite abandonner quand il voudra rajouter plus de fonctionnalités, j'aurais aimé qu'on me guide a mes début quand je me suis égaré
, a l'époque j'avais
créer un réseau social sans utiliser de base de données , uniquement des boucles for et des conditions, je stockais tout dans des fichiers .txtc'était horrible , mine de rien j'avais créer un mini moteur de base de données, c'était tellement lent que je m'étais lancé comme défi de l'améliorer en stockant tout dans la RAM et juste faire des backup de temps en temps pour minimiser les accès au disque
je l'ai abonné quand j'ai compris l'utilité d'une base de données
Et cette expérience t'a sans doute largement facilité la tâche quand tu as abordé les BDD pour la première fois. Ayant été confronté directement au problème, tu connaissais déjà les enjeux, les difficultés qu'on veut résoudre, et tu as pu directement comprendre à quel point utiliser une BDD pouvait te simplifier la vie. Bien souvent, si on te balance directement la solution à un problème que tu ne t'étais même pas posé, ça va te passer complètement au-dessus de la tête. Il faut un certain recul pour pouvoir l'assimiler correctement.
Par exemple la remarque sur les boucles for me semble plus adaptée à son niveau... le SQL, il a le temps de voir venir. Pour un tableau de high scores il va s'en sortir comme ça et ça sera suffisant pour progresser.
Oulah, je repasse sur le topic et je vois qu'il y a plein de messages ![]()
Je sais que mon code est loin d'être opti, je suis débutant et je pense que ça sa voit ![]()
Effectivement c'est pour un projet scolaire, le jeu a pas pour but d'être vendu ou d'être jouer par le public, du coup si c'est pas si optimisé que ça c'est pas la mort tant que ça tourne sur nos PC ![]()
Du coup ouais je pense pas avoir besoin d'une base donnée puisque y'aura pas plus de 10 scores je pense, surtout qu'au final j'ai réussi à faire sans pour le moment. J'ai d'autre truc à faire sur le projet, du coup j'me vois mal passé des bonnes heures sur le SQL alors que j'ai trouvé une alternative.
Après j'ai rien contre hein! Merci pour l'aide et les conseils, je suis tout à fait d'accord avec toi et j'y jetterais un coup d'oeil quand j'aurais le temps ![]()
Sans forcément passer par du SQL, tu aurais pu utiliser du JSON (ou du YAML) qui permettent d’écrire dans un fichier du même type très facilement. Nativement en python tu peux faire un import json.
Et pour le coup tu y gagnes en performances (bien que la question n’est pas là) mai surtout en lisibilité !