Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#1 Le 13/01/2013, à 02:42

WSH

Chemins relatifs en Lua

Salut à tous,

Avec une petite équipe nous sommes en train de nous lancer sur un projet de jeu pour participer à Innov'Game 2013 par L'EFREI.
Après avoir épluché un peu tout ce qu'on trouvait de cool sur le sujet, nous nous sommes tourné vers la solution de développer le jeu avec Lua + Löve et l'éditeur de maps Tiled ME, comme il était mentionné dans la page de développement d'un jeu vidéo sur la doc Ubuntu.
Je me lance donc dans l'apprentissage de Lua, (ce qui n'est pas une mince affaire, vu qu'on est en train de voir les rudiments de Java en L1 info lol ) mais un truc me tracasse... Pour m'échauffer je me suis lancé dans un bête programme d'entraînement au calcul mental avec enregistrement du meilleur score dans un fichier 'score' dans le même dossier que le script, je me retrouve donc à ce moment à un bout de code comme ça :

f = assert(io.open("/home/wsh/Documents/Programmation/Calcul mental/score","w"));
f:write(score.total);
f:lines();
f:write(meilleurJoueur);
f:close();

Ma question est toute simple, comment insérer un lien relatif vers mon fichier score dans io.open() ? Parce que là dès que je déplace mon script le lien n'est plus valide... C'est bête mais je n'ai pas trouvé de réponse simple sur la doc et les forums, ils ne proposent que des trucs alambiqués, pourtant ça doit être simple non ?

Merci d'avance !


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

#2 Le 13/01/2013, à 10:11

grim7reaper

Re : Chemins relatifs en Lua

Pas un truc du genre :

f = assert(io.open("score","w"));

?

Hors ligne

#3 Le 13/01/2013, à 11:56

spad35

Re : Chemins relatifs en Lua

Salut

Peut-être :

f = assert(io.open("file:///home/wsh/Documents/Programmation/Calcul mental/score","w"));

Hors ligne

#4 Le 13/01/2013, à 12:59

grim7reaper

Re : Chemins relatifs en Lua

Heu, là c’est toujours un chemin absolu, ça ne change rien.

Hors ligne

#5 Le 13/01/2013, à 14:45

claudius01

Re : Chemins relatifs en Lua

Bonjour,

Utiliser un chemin relatif dans un programme pour accéder à des données n'est pas recommandé car son accès pourra échouer suivant le répertoire de lancement. Je garderais un chemin absolu mais pointant vers un répertoire du type /var/opt/XXX , les éléments de configuration pouvant être dans /etc/opt/XXX .

cf. Hiéarchies pour une description des hiéarchies standard des répertoires sous Unix.


Cordialement, A+
--
Claudius

Hors ligne

#6 Le 13/01/2013, à 15:45

WSH

Re : Chemins relatifs en Lua

Salut à tous ! Merci de me répondre smile

grim7reaper a écrit :

Pas un truc du genre :

f = assert(io.open("score","w"));

?

Non, je me retrouve avec une erreur :

lua: ...wsh/Documents/Programmation/Calcul mental/calcul.lua:47: score: No such file or directory
spad35 a écrit :

Salut
Peut-être :

f = assert(io.open("file:///home/wsh/Documents/Programmation/Calcul mental/score","w"));

En fait ça revient au même que ce que je fais...

claudius01 a écrit :

Bonjour,
Utiliser un chemin relatif dans un programme pour accéder à des données n'est pas recommandé car son accès pourra échouer suivant le répertoire de lancement. Je garderais un chemin absolu mais pointant vers un répertoire du type /var/opt/XXX , les éléments de configuration pouvant être dans /etc/opt/XXX .

cf. Hiéarchies pour une description des hiéarchies standard des répertoires sous Unix.

En fait le truc c'est que j'aurais voulu avoir mon fichier de score dans le même dossier que mon script, parce qu'en enregistrant ça dans un dossier système ça ne fonctionnerait pas sous Windows par exemple, ou même simplement pouvoir faire un programme portable sur clé usb...
Mais ce qui est bizarre, c'est que j'ai réussi à faire fonctionner ça sous Windows en écrivant

f = assert(io.open("./score","w"));

Alors que sous Ubuntu j'obtiens l'erreur

lua: ...wsh/Documents/Programmation/Calcul mental/calcul.lua:47: ./score: No such file or directory

A + !


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

#7 Le 13/01/2013, à 16:24

grim7reaper

Re : Chemins relatifs en Lua

WSH a écrit :

Mais ce qui est bizarre, c'est que j'ai réussi à faire fonctionner ça sous Windows en écrivant

f = assert(io.open("./score","w"));

Ouais ça ça reviens à ce que je t’avais dit.
Maintenant ce qui peut-être en cause, c’est la façon dont tu lances ton programme.
Tu le lances comment et d’où ?

Hors ligne

#8 Le 13/01/2013, à 16:31

WSH

Re : Chemins relatifs en Lua

Pour le lancer je tape la commande

lua '/home/wsh/Documents/Programmation/Calcul mental/calcul.lua'

Sous Windows comme je n'avais pas lua je compilais directement le script en .exe en utilisant srlua, ça peut venir de ça ?

Edit : effectivement, quand je compile le script avec luac avant et que je l'exécute avec

lua /home/wsh/calcul.out

ça marche ! yikes
Comment ça se fait ?

Dernière modification par WSH (Le 13/01/2013, à 16:36)


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

#9 Le 13/01/2013, à 17:01

grim7reaper

Re : Chemins relatifs en Lua

Essaye de faire un print de currentdir (lua-filesystem) avant de faire ton open et test en script et en exécutable.
Le répertoire de travail est peut-être différent entre la version interprété et compilé (je ne connais pas trop Lua donc bon)

Dernière modification par grim7reaper (Le 13/01/2013, à 17:04)

Hors ligne

#10 Le 13/01/2013, à 17:16

WSH

Re : Chemins relatifs en Lua

Merci, bonne idée, j'essaierai ça, faut que j'installe la librairie smile
Par contre j'ai un autre problème, j'espère ne pas être trop HS, lorsque je demande au joueur de saisir son nom s'il a battu le meilleur score, j'utilise :

print("Quel est votre nom ? ");
joueur = io.read();

Le problème est qu'à l'exécution, le programme n'attend pas qu'on écrive quelque chose, il passe directement à la suite :

Quel est votre nom ? Voulez-vous refaire une partie ? (oui - 1 / non - 0) : 

Pour refaire une partie cependant, je demande d'entrer 0 ou 1, donc j'utilise io.read("*number") et ça, ça marche, mais pour demander une chaîne de caractère je suis obligé d'utiliser io.read("*line") (ou io.read() c'est pareil apparemment) et alors ça ne marche pas... WTF ? ^^


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

#11 Le 13/01/2013, à 17:28

grim7reaper

Re : Chemins relatifs en Lua

Si c’est comme en C, c’est à cause d’un retour à la ligne qui reste dans le buffer.
Genre tu demandes un nombre, le gus tape 5 + Entrée pour valider.
Ton premier read lit le nombre, dans le buffer il reste '\n'.
Ton second read lit jusqu’à rencontrer '\n', ici il le rencontre tout de suite et te renvoie une chaîne vide.

Essaye de faire un

io.flush()

Après ton premier read ou avant le second wink

Hors ligne

#12 Le 13/01/2013, à 18:07

WSH

Re : Chemins relatifs en Lua

Merci pour ton explication, je comprend mieux maintenant pourquoi je voyais de temps en temps des io.flush() avant les io.read() big_smile
Effectivement, Lua a l'air d'être très proche du C, ç'en est dérivé d'après ce que j'ai compris...
Mais par contre ça ne marche toujours pas... je comprend pas, je me retrouve en fait avec ce code :

io.write("Ouah ! Vous avez battu le meilleur score de " .. meilleurJoueur .. " avec " .. string.format("%.2f", meilleurScore) .. " points ! Vous obtenez la première place !\nQuel est votre nom ? ");
io.flush();
joueur = io.read();
f = assert(io.open("./score","w"));
f:write(score.total);
f:lines();
f:write(joueur);
f:close();

Est-ce que quelque chose ne va pas ?

Merci !


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

#13 Le 13/01/2013, à 18:10

grim7reaper

Re : Chemins relatifs en Lua

C’est possible d’avoir le code complet (ou alors un code exécutable minimal qui reproduit le problème) ?
Ça permettrait de tester en direct.

Hors ligne

#14 Le 13/01/2013, à 18:24

WSH

Re : Chemins relatifs en Lua

J'ai essayé de simplifier un peu :

repeat
score, tempsTotal, operateur, reponse = {juste = 0, faux = 0, total = 0}, 0, math.floor(math.random()*3), nil;
	tempsDepart = os.time();
	if operateur == 0 then 
		nbre1 = math.random(1,999);
		nbre2 = math.random(1,999);
		resultat = nbre1 + nbre2;
		io.write("\n" .. nbre1 .. " + " .. nbre2 .. " = ");
	elseif operateur == 1 then
		nbre1 = math.random(1,1499);
		nbre2 = math.random(1,999);
		resultat = nbre1 - nbre2;
		io.write("\n" .. nbre1 .. " - " .. nbre2 .. " = ");
	else
		nbre1 = math.random(1,9);
		nbre2 = math.random(1,9);
		resultat = nbre1 * nbre2;
		io.write("\n" .. nbre1 .. " x " .. nbre2 .. " = ");
	end

	reponse = io.read("*number");
	tempsReponse = os.time() - tempsDepart;
	tempsTotal = tempsTotal + tempsReponse;
	if reponse ~= resultat then
		print("Faux, le bon résultat était " .. resultat);
		score.faux = score.faux + 1;
		score.total = score.total -250/tempsReponse;
	else
		print("Bien joué !");
		score.juste = score.juste + 1;
		score.total = score.total + 1000/tempsReponse;
	end
	print("Vous avez répondu en " .. tempsReponse .. " secondes !");

if score.total <= 0 then score.total = 0
end

print("Vous avez répondu correctement à " .. score.juste .. " calcul(s) et vous avez fait " .. score.faux .. " erreur(s), le tout en " .. tempsTotal .. " secondes, soit un score de " .. string.format("%.2f",score.total) .. " points.");
	io.write("Ouah ! Vous avez battu le meilleur score de Jojo l'asticot qui a fait -5 points ! Vous obtenez la première place !\nQuel est votre nom ? ");
	io.flush();
	joueur = io.read("*line");

print("Voulez-vous refaire une partie ? (oui - 1 / non - 0) : ");

repeat
arreter = io.read("*number");
until arreter == 0 or arreter == 1;

until arreter == 0;

Je viens de tester, normalement ça marche, j'ai enlevé la consultation du fichier de score pour plus de simplicité.
Merci smile


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

#15 Le 13/01/2013, à 19:13

grim7reaper

Re : Chemins relatifs en Lua

En fait, comme en C, flush vide le tampon de sortie et pas celui d’entrée (donc ça nous avance à rien) >_<
Ce que tu peux faire donc, c’est mettre un io.read() après tes io.read("*number") pour consommer le '\n'.
Y’a peut-être un moyen plus « luaesque » de faire ça, mais vu ce que j’y connais en Lua je ne le connais pas pour le moment.

Dernière modification par grim7reaper (Le 13/01/2013, à 19:13)

Hors ligne

#16 Le 13/01/2013, à 19:37

WSH

Re : Chemins relatifs en Lua

D'accord, merci beaucoup ! smile Si j'ai bien compris, le tampon d'entrée est celui utilisé pour io.read() et celui de sortie pour io.write(), ça correspond donc au sens où va l'information ?
C'est fou quand même qu'il n'y ait pas de méthode plus simple pour un truc aussi basique ^^ Lua a 20 ans je crois, et pourtant on ne trouve pas de documentation complète en français, et le seul bouquin que j'aie trouvé dessus n'est disponible nul part dans les bibliothèques (remarque, ça leur permettra de se diversifier) big_smile
Bon je vais essayer !


Actuellement sous Ubuntu 12.10 64-bits et Xubuntu 13.04 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D

Hors ligne

Haut de page ↑