Pages : 1
#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 ) 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 14.10 64-bits et Lubuntu 14.10 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
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
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
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
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...
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 14.10 64-bits et Lubuntu 14.10 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
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 !
Comment ça se fait ?
Dernière modification par WSH (Le 13/01/2013, à 16:36)
Actuellement sous Ubuntu 14.10 64-bits et Lubuntu 14.10 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
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 14.10 64-bits et Lubuntu 14.10 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
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()
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 14.10 64-bits et Lubuntu 14.10 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
Actuellement sous Ubuntu 14.10 64-bits et Lubuntu 14.10 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 ! 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)
Bon je vais essayer !
Actuellement sous Ubuntu 14.10 64-bits et Lubuntu 14.10 32-bits
Intel Core i5 760 @ 2.80 GHz / CG Sapphire Radeon HD5770 1Go DDR5 / 4 Go DDR3 PC12800 / MB Asus P7P55D
Hors ligne
Pages : 1