π
<-
Chat plein-écran
[^]

Un démineur en python pour la NumWorks

Un démineur en python pour la NumWorks

Message non lude cent20 » 26 Fév 2020, 21:50

Article de présentation du démineur : https://nsi.xyz/demine

Publication initiale :



Lien vers le script : https://workshop.numworks.com/python/cent20/demine
Ne fonctionnera que sur l'os Omega pour l'instant. Tout est expliqué dans l'article de présentation.
Vous pouvez commenter / critiquer en utilisant le forum ci-dessous.
Le programme avant optimisation, il pèse alors 3.09 ko :

Code: Tout sélectionner
from ion import keydown
from kandinsky import *
from random import randint
from time import sleep

# cut
co=color
a,r,t,l,k,s=set_pixel,fill_rect,draw_string,range,keydown,sleep

# couleurs
f,h,n = 255,127,0
c=[co(f,f,f), co(45,125,210), co(151,204,4), co(238,185,2), co(244,93,1), co(215,65,167), co(n,n,n), co(n,n,n), co(n,n,n),
   co(h,h,h),co(192,192,192),co(96,96,96),co(253,236,185)]
nb=[19,0,0]

# init
p=[[6,5],[7,5]]
m = []

def deminage():
  t(str(nb[1]),12,2,c[2]);t("/"+str(150-nb[0]),42,2,c[1]);
  t("Demineur",120,2)
  t("mines:"+str(nb[0]),220,2,c[5])
  if nb[1]+nb[0]>=150:t("Gagné ! ",120,2)

def decouvre(x,y):
  i=1
  while i>0:
    chiffre(x,y)
    for p in l(max(0,x-1),min(15,x+2)):
      for q in l(max(0,y-1),min(10,y+2)):
        if m[p][q]>=100:chiffre(p,q)
        elif m[p][q]==0:m[p][q]+=1
    i=0
    for p in l(15):
      for q in l(10):
        if m[p][q]%100==1:i=1;x=p;y=q;p=14;q=9
 
def terrain():
  r(8,21,300,200,c[9])
  for y in l(21,243,20):
    for x in l(8,309):
      a(x,y,c[10])
  for x in l(8,320,20):
    for y in l(21,222):
      a(x,y,c[10])

def chiffre(x,y):
  cl(x,y)
  nb[1]+=(m[x][y]%100!=42)
  i=m[x][y]-m[x][y]%100
  m[x][y]=i+42
  if i>=100:v=int(i/100);t(str(v),13+20*(x),23+20*(y),c[v],c[0])
  deminage()

def minage(b=nb[0]):
  if nb[2]==0:start()
  nb[2]+=1;terrain();m.clear();t(" "*28,12,2)
  for x in range(15):m.append([0 for y in range(10)])
  nb[1]=0
  while b>0:
    x, y = randint(0,14),randint(0,9)
    if m[x][y]!=999:
      m[x][y]=999;b-=1
      for p in l(max(0,x-1),min(15,x+2)):
        for q in l(max(0,y-1),min(10,y+2)):
          if m[p][q]!=999:m[p][q]+=100
  deminage();drone()

def start():
  t("Demineur",120,42,c[4])
  t("par cent20",110,62,c[1])
  t("https://nsi.xyz/demine",42,82,c[6])
  t("[OK] [Clear] [+] [-] [EXE]",32,122,c[2])
  s(4)

def explose():
  t("perdu ! ",120,2)
  for x in l(15):
    for y in l(10):
      if m[x][y]==999:mine(x,y)

def marche(x,y):
  if m[x][y]>=999:explose()
  elif m[x][y]>=100:chiffre(x,y)
  else:decouvre(x,y)

def survol():
  x, y = p[1][0], p[1][1]
  v = m[x][y]
  gps(x,y)
  # t(str(int(v/100)),20,2)
  x, y = p[0][0], p[0][1]
  v = m[x][y]
  if p[1][0]!=x or p[1][1]!=y:
    if (v-42)%100==0:gps(x,y,0)
    else:gps(x,y,9)
  del p[0]
 
def gps(x,y,i=6):
  r(9+20*x,22+20*y,19,2,c[i]);r(26+20*x,22+20*y,2,19,c[i]);r(9+20*x,22+20*y,2,19,c[i]);r(9+20*x,39+20*y,19,2,c[i])

def drone():
  while not k(5):
    if k(0):p.append([max(p[0][0]-1,0),p[0][1]])
    if k(3):p.append([min(p[0][0]+1,14),p[0][1]])
    if k(1):p.append([p[0][0],max(p[0][1]-1,0)])
    if k(2):p.append([p[0][0],min(p[0][1]+1,9)])
    if k(4):marche(p[0][0],p[0][1])
    if k(17) or k(16):drapeau(p[0][0],p[0][1])
    if k(52):nb[0]=19;minage(nb[0]);s(1)
    if k(45):nb[0]=min(nb[0]+3,42);minage(nb[0]);s(1)
    if k(46):nb[0]=max(nb[0]-3,11);minage(nb[0]);s(1)
    if len(p)>1:survol();s(0.120)
  print(42)

def drapeau(x,y):
  r(17+20*x,26+20*y,3,9,c[12]);r(17+20*x,36+20*y,3,3,c[12])
 
def mine(x,y):
  cl(x,y);r(12+20*x,36+20*y,13,4,c[9]);r(14+20*x,34+20*y,9,2,c[11]);r(17+20*x,32+20*y,3,2,c[5])

def cl(x,y):
  r(9+20*x,22+20*y,19,19,c[0])

minage()


Multiples mise à jour :



Avec l'aide des membres du forum, une version optimisée tournant sous Epsilon à été publiée.
Un autre membre de tiplanet à lui aussi codé un démineur.

Il y a donc à la date du 07/03 trois démineurs en python compatibles et optimisés pour la NumWorks :

demine.py, script initial compatible uniquement avec la ROM Omega. Lien workshop
deminime2.py script optimisé compatible avec la ROM Epsilon et la ROM Omega. Lien workshop
demineur.py script de Arthur Jacquin, annoncé ici, Lien workshop
Dernière édition par cent20 le 07 Mar 2020, 21:54, édité 5 fois.
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
Avatar de l’utilisateur
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 45.9%
 
Messages: 1009
Images: 64
Inscription: 17 Mai 2012, 09:49
Localisation: Avignon
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: nsi_xyz

Re: Un démineur en python pour la NumWorks

Message non lude cent20 » 26 Fév 2020, 22:16

C'est l'histoire d'un script de 3.09 ko qui refuse de s’exécuter dans une mémoire de 16ko ... :troll:
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
Avatar de l’utilisateur
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 45.9%
 
Messages: 1009
Images: 64
Inscription: 17 Mai 2012, 09:49
Localisation: Avignon
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: nsi_xyz

Re: Un démineur en python pour la NumWorks

Message non lude Dogm » 26 Fév 2020, 23:01

Super script :#top#:

Néanmoins un petit problème fort embêtant est la possibilité de perdre en cliquant sur la 1ère case. En effet, dans le démineur premier du nom, les mines sont générées après le 1er appui du joueur sur la grille l'empêchant ainsi de perdre au premier coup.

Un appui sur la touche flèche (KEY_BACK) pour quitter le jeu plus facilement serait également une amélioration fort sympathique. ;)
Avatar de l’utilisateur
DogmEcrivain
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 44.3%
 
Messages: 117
Images: 7
Inscription: 14 Nov 2019, 18:53
Localisation: Lyon, France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: Terminale Math NSI
GitHub: Tim-ats-d

Re: Un démineur en python pour la NumWorks

Message non lude cent20 » 26 Fév 2020, 23:06

Dogm a écrit:Super script :#top#:

Néanmoins un petit problème fort embêtant est la possibilité de perdre en cliquant sur la 1ère case. En effet, dans le démineur premier du nom, les mines sont générées après le 1er appui du joueur sur la grille l'empêchant ainsi de perdre au premier coup.

Un appui sur la touche flèche (KEY_BACK) pour quitter le jeu plus facilement serait également une amélioration fort sympathique. ;)


La flèche KEY_BACK a déjà cet usage, elle interrompt le script chez moi.

Je ne connaissais pas cet règle "les mines sont générées après le 1er appui du joueur sur la grille" même si elle me parait évidente. Tu veux que mon script grossisse c'est ça ?
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
Avatar de l’utilisateur
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 45.9%
 
Messages: 1009
Images: 64
Inscription: 17 Mai 2012, 09:49
Localisation: Avignon
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: nsi_xyz

Re: Un démineur en python pour la NumWorks

Message non lude Lionel Debroux » 26 Fév 2020, 23:09

Hmm... j'ai déjà joué à des versions du démineur Windows où l'on peut tout à fait perdre du premier coup ?
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Avatar de l’utilisateur
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 11.2%
 
Messages: 6859
Inscription: 23 Déc 2009, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: -
GitHub: debrouxl

Re: Un démineur en python pour la NumWorks

Message non lude Dogm » 26 Fév 2020, 23:13

Et bien là, pour le coup, il va grossir.


PS : J'ai gagné :troll:

Image

EDIT :
Lionel Debroux a écrit:
Hmm... j'ai déjà joué à des versions du démineur Windows où l'on peut tout à fait perdre du premier coup ?


Un démineur où l'on peut perdre dès le premier coup est un mauvais démineur.
Dernière édition par Dogm le 26 Fév 2020, 23:33, édité 2 fois.
Avatar de l’utilisateur
DogmEcrivain
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 44.3%
 
Messages: 117
Images: 7
Inscription: 14 Nov 2019, 18:53
Localisation: Lyon, France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: Terminale Math NSI
GitHub: Tim-ats-d

Re: Un démineur en python pour la NumWorks

Message non lude cent20 » 26 Fév 2020, 23:31

Dogm a écrit:Et bien là pour le coup il va grossir.

PS : J'ai gagné :troll:

Image


Oui quand on perd on peut continuer à jouer, parce que je suis un prof sympa et que je laisse à mes élèves une seconde chance... :)
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
Avatar de l’utilisateur
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 45.9%
 
Messages: 1009
Images: 64
Inscription: 17 Mai 2012, 09:49
Localisation: Avignon
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: nsi_xyz

Re: Un démineur en python pour la NumWorks

Message non lude Bisam » 27 Fév 2020, 10:40

Quelques commentaires sur le script :
  1. Pourquoi utiliser
    Code: Tout sélectionner
    int(i/100)
    au lieu de
    Code: Tout sélectionner
    i//100
    ?
    Le deuxième est plus précis, puisque ne passant pas par les nombres réels et demande probablement moins de mémoire également (car les entiers considérés dans le script sont petits) !
  2. On peut avantageusement remplacer
    Code: Tout sélectionner
      i = m[x][y] - m[x][y]%100
      m[x][y] = i + 42
      if i >= 100: v = int(i/100); t(str(v),13+20*(x),23+20*(y),c[v],c[0])

    par
    Code: Tout sélectionner
      v=m[x][y]//100
      m[x][y] = 100*v + 42
      if v: t(str(v),13+20*(x),23+20*(y),c[v],c[0])
  3. Plus loin, on trouve
    Code: Tout sélectionner
    if (v-42)%100 == 0: gps(x,y,0)
        else: gps(x,y,9)
    . J'aurais plutôt écrit :
    Code: Tout sélectionner
    gps(x,y, 0 if v%100 == 42 else 9)
    à la place de ces deux lignes.
  4. Tu peux utiliser la fonction d'unpacking de Python pour simplifier certaines lignes. Combiné avec les remarques ci-dessus,
    Code: Tout sélectionner
    def survol():
      x, y = p[1][0], p[1][1]
      v = m[x][y]
      gps(x,y)
      # t(str(int(v/100)),20,2)
      x, y = p[0][0], p[0][1]
      v = m[x][y]
      if p[1][0]!=x or p[1][1]!=y:
        if (v-42)%100==0:gps(x,y,0)
        else:gps(x,y,9)
      del p[0]

    deviendrait
    Code: Tout sélectionner
    def survol():
      x, y = p[1]
      v = m[x][y]
      gps(x,y)
      # t(str(v//100),20,2)
      x, y = p[0]
      v = m[x][y]
      if p[1]!=(x,y):
        gps(x,y,0 if v%100==42 else 9)
      del p[0]
  5. On peut certainement remplacer la liste p de positions par deux ou trois couples de nombres : cela prendrait BEAUCOUP moins de place en mémoire.
Voilà, c'est tout pour les remarques qui ne témoignent que du fait que tu ne penses pas à utiliser le "sucre syntaxique" de Python... mais absolument pas de la réflexion et du boulot formidable qu'il y a derrière ce script.
Par ailleurs, l'explication sur ton site est plutôt remarquable et très pédagogique. :bj:
Avatar de l’utilisateur
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 69.5%
 
Messages: 5665
Inscription: 11 Mar 2008, 00:00
Localisation: Lyon
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Un démineur en python pour la NumWorks

Message non lude Hamza.S » 27 Fév 2020, 10:45

Vous venez de le briser moralement et psychologiquement :troll:
Image
Avatar de l’utilisateur
Hamza.SAdmin
Niveau 17: GM (Grand Maître des calculatrices)
Niveau 17: GM (Grand Maître des calculatrices)
Prochain niv.: 28.5%
 
Messages: 4461
Images: 18
Inscription: 07 Nov 2014, 00:43
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Un démineur en python pour la NumWorks

Message non lude critor » 27 Fév 2020, 10:50

J'ai déjà fait je crois toutes les optimisations 1 à 4 ainsi, et ça ne suffit pas à faire passer le script.
Merci quand même d'avoir pris le temps de les expliquer. :)
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41464
Images: 14477
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Suivante

Retourner vers Programmation Python

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
908 utilisateurs:
>892 invités
>11 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)