Archives pour l'étiquette jeux

Fin du concours Nspire Lua

Bonjour à tous et à toutes,

Il y a quelques temps déjà, nous vous annoncions un concours de programmation sur Nspire en Lua à grande échelle puisque la somme totale des lots s’estimait environ à 750 € , avec notamment 3 magnifiques TI-Nspire CX CAS à gagner !

Le concours est désormais terminé !

C’est avec donc pas moins de 14 programmes Lua que nous avons terminé ce concours, et nous pensons que c’est une belle réussite pour un langage si « nouveau » sur cette calculatrice !

Nous tenons donc à remercier vivement tous les participants, quels que soient leurs résultats !

Les juges (Levak, Critor et moi-même) allons procéder à l’analyse de tout ce que vous nous avez fait, dans les prochains jours, et les résultats devraient être là prochainement :)

En attendant, voici la liste (juste Nom + Screenshot) des participations reçues.
(certains ne sont pas disponibles en téléchargement pour le moment, mais celà ne saurait tarder….)

Nous rappelons que ces programmes, sauf mention contraire sur la page de téléchargement, sont soumis à la licence CC BY-SA 2.0. Ne pas respecter les termes de cette licence entraînera des conséquences légales. Les auteurs des programmes respectifs peuvent changer cette attribution à leur souhait en nous contactant par e-mail, bien évidemment.

Jeux: 7


Bobby Carrot – – – – Loïc P.

Image
Labyrinthe – – – – David L.


Reversi (Othello) – – – – Deep Thought.

Image
MasterMind – – – – Nick V.


TI-Cran – – – – Julien R.


Nspired Phoenix Lua – – – – Florent D.


Tactical Wars CX – – – – Rehn C.

Mathématiques: 4


TabVar 3 – – – – JayTe.


LuaCS – – – – Jonathan L.


LogoMagic – – – – Jim B.


ABA Logique – – – – Loulou54.

Physique-Chimie: 3


Planétarium – – – – Bastien V.

Image
FormulaOne – – – – Naji A.

Image
Formules de Chimie – – – – Paul J.

Bref, en attendant les résultats officiels de ce concours, testez ces programmes et faites-nous part de vos commentaires !

Encore une fois Bravo à tous, et que les meilleurs gagnent !

Enregistre un record (ou autre) sans possibilité de triche !

Dans ce tutoriel nous allons voir une notion assez intéressante du framework de la TI-Nspire en Lua : enregistrer et restaurer des données dans un format quelconque directement en Lua ce qui permet par exemple de se souvenir d’un record pour un jeu, ou une quelconque configuration pour un programme plus évolué.

Mise en situation : Nous venons de réaliser un jeu génial. Nous voulons que nos camarades puissent se mesurer à notre record, mais comment faire ?

La première méthode consiste à utiliser l’API var et d’appeler var.store(). Ainsi, on sauvegarde le record dans le classeur comme variable globale.

Votre système de record est en place ! Hum, pas si vite : un de vos camarades a réussi à faire un score de 10 000 000 ! Comment est-ce possible ?? Il a simplement édité la variable qui vous sert de record. Etant donné qu’elle est accessible via une application Calcul et modifiable à souhait cela n’est pas compliqué !

La deuxième méthode utilise la première, à ceci près que nous disposons de math.eval() qui nous permet d’exécuter n’importe quelle commande du TI-Basic, comme la commande Lock par exemple. Ainsi, si nous faisons :

math.eval("Unlock highscore")
var.store("highscore", highscore)
math.eval("Lock highscore")

Notre variable est protégée contre l’écriture. Seulement, étant donné que Lock est une commande présente dans le TI-Basic, elle peut très bien être exécutée à l’extérieur du programme Lua. Donc cela ne fait que repousser le problème.

Et si nous nous tournions vers le Lua en lui même ? En effet, il existe var.monitor() qui permet de poser une sentinelle qui vérifie si la variable pointée va être changée. Si oui, alors l’évènement on.varChange() est appelé. L’intérêt d’utiliser cette technique est qu’elle permet de contrôler la modification de la variable. En effet :

function on.create()
  if not var.recall("highscore") then
    highscore = 0
    var.store("highscore", highscore)
  end
  var.monitor("highscore")
end
 
function on.varChange(list)
  for k, v in pairs(list) do
    if k == "highscore" then
      if var.recall(k) ~= highscore then
        return 1 -- it is an external change, block modifications
      else
        return 0 -- it is an internal change, allow modifications
      end
    end
  end
  return 0 -- allow modifications of other monitored variables if any
end

Ce code empêchera toute modification extérieure de record par un message d’erreur :

Changement non autorisé : Entrée non valide.

Seulement voilà … C’est une méthode lourde et répétitive si on doit le faire pour plusieurs données, telle des données de configuration … C’est là que l’on regarde la documentation et qu’on aperçoit deux évènements qui pourraient paraître banals à première vue : on.save() et on.restore(). En réalité, ce couple d’évènement gère ce que nous essayons de faire depuis le début !

En effet, lorsque le widget est fermé (on ferme le classeur, on copie/coupe le widget), l’évènement on.save() est appelé. on.save() doit être écrit de telle sorte qu’il puisse renvoyer une donnée quelconque (booléen, nombre, chaîne de caractères, table etc …).
Lorsque le widget sera ouvert la prochaine fois (on ouvre le classeur, on colle le widget), l’évènement on.restore() sera appelé avec en paramètre cette donnée que nous avions renvoyé depuis on.save() !

Ainsi, plus de prise de tête :

function on.save()
  return highscore
end
 
function on.restore(data)
  if type(data) == "number" then
    highscore = data
  end
end
 
function on.create()
  if not highscore then
    highscore = 0 -- first time we initialize highscore
  end
end