Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 1609
Réponses : 12
Type : discussion
Etat : réponses autorisées

Démineur en graphique *NEW*

-Coco- le 07/12/2011 à 12:48
Bonjour à tous chers membres (et invités !) de Tout 82 !
Cela doit faire un petit bout de temps que vous ne m'avez pas vu (et je ne pense pas que cela vous dérangeait), mais me voilà de retour avec un Démineur !

Il se nomme DEMINE2 (tout simplement parce que c'est le second que je fais, mais vous n'avez jamais connu le premier : nommez le comme vous voulez après tout)

Propriétés/fonctionnalités :

-Poids : 1328 octets
-Lorsque la case découverte est vide, cela découvre également les 8 cases autour (bien), et cela marche également si on appuie sur une case vide déjà découverte.
-Il est en mode graphique
-Possibilité de quitter instantanément à tout moment, et de reprendre après en appuyant sur la touche [annul] puis en sélectionnant REPRENDRE dans le menu principal
-Propre = une fois terminé, ne laisse pas de matrice traîner
-Possibilité de choisir ou non la taille de la grille
-On peut mettre de jolis petits drapeaux
-La case par défaut sur laquelle se trouve le curseur est toujours vide
-Détection de victoire quand toutes les cases (sauf les mines) ont été découvertes
-rapide et optimisé (Et oui les If, Then et Else sont plus rapides que les Lbl !)


Touches :

-[2nde] : découvrir une case
-[alpha] : poser un petit drapeau / enlever un petit drapeau déjà posé
-flèches : déplacer le curseur
-[annul] : Quitter la partie à tout moment

Screenshots :
Image manquante

Réflexion...

Image manquante

I won !


Le programme !

Allez, pour ceux qui ont le câble pu qui veulent tester sur émulateur, je vous épargne du boulot !
http://www.mediafire.com/?c15e46o441v4def (télécharger en format .83p)


Et pour les autres, voilà le code :

(avant de commencer à taper comme un bourrin, voir les notes en dessous)

Code

:12[sto>]W
:7[sto>]H
:FnOff
:AxesOff
:0[sto>]Xmin
:94[sto>]Xmax
:(-)62[sto>]Ymin
:0[sto>]Ymax
:ClrHome
:Menu("   DEMINEUR 2   ","NOUVEAU",N,"REPRENDRE",R,"QUIT",Q
:Lbl Q
:ClrHome
:Stop
:Lbl N
:Menu(">TAILLE<","STANDARD",TS,"PERSONNALISEE",TP
:Lbl TP
:Disp "LA TAILLE EST","LIMITEE","AUTOMATIQUEMENT
:Input "LARGEUR:",W
:Input "HAUTEUR:",H
:min(H,7[sto>]H
:min(W,15[sto>]W
:Lbl TS
:ClrDraw
:Input "MINES:",M
:ClrHome
:iPart(W/2[sto>]Z
:iPart(H/2[sto>]¤
:DelVar [A]
:{H,W[sto>]dim([A]
:W*H-M[sto>]O
:For(A,1,M
:Output(4,8,A
:Lbl 00
:randInt(1,W[sto>]U
:randInt(1,H[sto>]V
:If 9=[A](V,U
:Goto 00
:If U[supérieur ou égal]Z-1 and U[inférieur ou égal]Z+1 and V[supérieur ou égal]¤-1 and V[inférieur ou égal]¤+1
:Goto 00
:9[sto>][A](V,U
:For(B,max(1,V-1),min(H,V+1
:For(C,max(1,U-1),min(W,U+1
:If 9[pas égal][A](B,C
:1+[A](B,C[sto>][A](B,C
:End
:End
:End
:For(A,0,W
:Line(A*6,0,A*6,(-)H*8
:End
:For(B,0,H
:Line(0,(-)B*8,W*6,(-)B*8
:End
:For(A,1,W
:For(B,1,H
:Text(B*8-7,A*6-4,"O
:0.1+[A](B,A[sto>][A](B,A
:End
:End
:Lbl R
:1[sto>]P
:While P
:Line(Z*6-5,(-)¤*8+7,Z*6-1,(-)¤*8+7
:Line(Z*6-5,(-)¤*8+7,Z*6-5,(-)¤*8+1
:0[sto>]T
:Repeat T
:getKey[sto>]T
:End
:Line(Z*6-5,(-)¤*8+7,Z*6-1,(-)¤*8+7,0
:Line(Z*6-5,(-)¤*8+7,Z*6-5,(-)¤*8+1,0
:Z+(T=26)-(T=24[sto>]Z
:¤+(T=34)-(T=25[sto>]¤
:Z-(Z=W+1)+(Z=0[sto>]Z
:¤-(¤=H+1)+(¤=0[sto>]¤
:If T=45
:Goto Q
:If T=31
:Then
:fPart([A](¤,Z[sto>]A
:If .1=A
:Then
:.1+[A](¤,Z[sto>][A](¤,Z
:Text(¤*8-7,Z*6-4,"P
:End
:If .2=A
:Then
:[A](¤,Z)-.1[sto>][A](¤,Z
:Text(¤*8-7,Z*6-4,"O
:End
:End
:If T=21
:Then
:If 0=[A](¤,Z
:Goto 01
:If 9.1=[A](¤,Z
:0[sto>]P
:If .1=fPart([A](¤,Z
:Then
:O-1[sto>]O
:[A](¤,Z)-0.1[sto>][A](¤,Z
:If 0[pas égal][A](¤,Z
:Then
:Text(¤*8-7,Z*6-4,[A](¤,Z
:Else
:Text(¤*8-7,Z*6-4,"    //3 espaces
:Lbl 01
:For(A,max(Z-1,1),min(Z+1,W
:For(B,max(¤-1,1),min(¤+1,H
:If .1=fPart([A](B,A
:Then
:[A](B,A)-.1[sto>][A](B,A
:O-1[sto>]O
:If 0=[A](B,A
:Then
:Text(B*8-7,A*6-4,"    //3 espaces
:Else
:Text(B*8-7,A*6-4,[A](B,A
:End
:End
:End
:End
:End
:End
:End
:If O=0
:0[sto>]P
:End
:If 9=[A](¤,Z
:Then
:Text(¤*8-7,Z*6-4,"X
:Text(57,35,"PERDU!
:Else
:Text(57,35,"GAGNE!
:End
:For(A,1,W
:For(B,1,H
:If fPart([A](B,A
:Then
:If 0[pas égal]iPart([A](B,A
:Then
:Text(B*8-7,A*6-4,iPart([A](B,A
:If 9<[A](B,A
:Text(B*8-7,A*6-4,"X
:Else
:Text(B*8-7,A*6-4,"    //3 espaces
:End
:End
:End
:End
:DelVar [A]



Notes avant de taper le code :

Voici quelques explications sur la notation du code :
-[sto>] : la flèche sto (en dessus du bouton ON)
-[inférieur ou égal], [supérieur ou égal], [pas égal], >, <, = : Se trouvent dans tests : [2dne]+[math]
-Toutes les fonctions de dessin, comme Ligne (Line), Texte (Text), EffDessin (ClrDraw) ect se trouvent dans le menu dessin : [2nde]+[prgm]
-Les fonctions min() et max() se trouvent dans le menu NUM (touche [math]+[flèche droite])
-"[A]" : Il s'agit bien de la matrice [A] (touche [matrice]), n'allez pas me mettre un crochet, un A et un autre crochet !
-Xmin,Xmax et tout ça sont des variables que l'on trouve en faisant [var]+[entrer]
-AxesNAff (AxesOff pour les francophones) se trouve avec [2nde]+[zoom] (format)
-FonctOff -> [var]+[fleche droite]+[4]+[2]


OMGZ ! Cette fonction n'existe pas sur ma calculatrice !

Pas de panique ! Si vous possédez une Ti-82 stats fr, toutes les fonctions ont été traduites en Français. Si vous êtes mauvais en anglais, vous pouvez aller voir la table de traduction ici présente sur ce forum : TRADUCTIONS ET EMPLACEMENTS


J'arrive pas à trouver la touche pour cette fonction !

Pas de problème ! Allez dans le Catalogue (touche catalog : [2nde]+[0]), puis tapez la première lettre de la fonction (par exemple, un "E" pour "EffDessin") : le catalogue vous donnera toutes les fonctions de la calculatrice commençant par un "E" (par exemple) : vous n'aurez plus qu'à chercher la bonne et appuyer sur Entrée.


Des questions, des suggestions, des commentaires, des critiques (j'accepte tout!) : une seule chose à faire : Cliquer sur Répondre!
linkakro le 07/12/2011 à 13:01
Pas mal du tout. Je creuserai ça plus tard.

L'article de traduction a été remplacé par un nouvel article plus à jour.
Tu n'es pas le premier à ne pas chercher assez.
Cherchez un peu dans la section article avant de conclure.
TRADUCTIONS ET EMPLACEMENTS
-Coco- le 07/12/2011 à 13:04
Je l'avais vu, mais je m'étais dit que les gens pourraient être rebutés par le fait de télécharger un truc, je le mets donc quand même en lien (en espérant que les gens le lisent)
The K le 07/12/2011 à 13:33
Eh bien ! Moi ça m'a l'air du sérieux boulot, et bien fait en plus, sans label / goto ! bigmouth.gif

Je pense bien que je vais le recopier happy.gif, bravo à toi !

(je le compare avec le démineur sp de coc5 et je te dis ce que j'en pense winkle.gif )
-Coco- le 07/12/2011 à 13:49
Il s'agit d'un démineur classique, il est juste joli et bien optimisé happy.gif (pas d'innovation de gameplay, tout de même difficile à faire sur un démineur !)
sandro le 07/12/2011 à 17:42
ça a l'air pas mal, mais on peut encore grater quelques octés si on vet:
Code
:12[sto>]W
:7[sto>]H
:FnOff
:AxesOff
:0[sto>]Xmin
:94[sto>]Xmax
:(-)62[sto>]Ymin
:0[sto>]Ymax
:ClrHome
:Menu("   DEMINEUR 2","NOUVEAU",N,"REPRENDRE",R,"QUIT",Q   //ici: les 3 espaces après 2
:Lbl Q
:ClrHome
:Stop
:Lbl N
:Menu(">TAILLE<","STANDARD",TS,"PERSONNALISEE",TP
:Lbl TP
:Disp "LA TAILLE EST","LIMITEE","AUTOMATIQUEMENT
:Input "LARGEUR:",W
:Input "HAUTEUR:",H
:min(H,7[sto>]H
:min(W,15[sto>]W
:Lbl TS
:ClrDraw
:Input "MINES:",M
:ClrHome
:iPart(.5W[sto>]Z   //remplacer W/2 par .5W est plus rapide pour la même place
:iPart(.5H[sto>]¤   //remplacer W/2 par .5W est plus rapide pour la même place
:DelVar [A]{H,W[sto>]dim([A]    //ici: l'instruction suivant un DelVar peut
// toujours être coller sauf parfois si précédé d'un If ou suivit d'un End
:WH-M[sto>]O    //ici
:For(A,1,M
:Output(4,8,A
:Lbl 00
:randInt(1,W[sto>]U
:randInt(1,H[sto>]V
:If 9=[A](V,U
:Goto 00
:If U[supérieur ou égal]Z-1 and U[inférieur ou égal]Z+1 and V[supérieur ou égal]¤-1 and V[inférieur ou égal]¤+1
:Goto 00
:9[sto>][A](V,U
:For(B,max(1,V-1),min(H,V+1
:For(C,max(1,U-1),min(W,U+1
:If 9[pas égal][A](B,C
:1+[A](B,C[sto>][A](B,C
:End
:End
:End
:For(A,0,W
:Line(6A,0,6A,(-)8H  //ici*3:multiplication implicite
:End
:For(B,0,H
:Line(0,(-)8B,6W,(-)8B   //ici:idem
:End
:For(A,1,W
:For(B,1,H
:Text(8B-7,6A-4,"O    //ici:idem
:.1+[A](B,A[sto>][A](B,A      //ici : 0.1 et .1 est interprété de la même manière
:End
:End
:Lbl R
:1[sto>]P
:While P
:Line(6Z-5,(-)8¤+7,6Z-1,(-)8¤+7  //ici:*4:mult implicite
:Line(6Z-5,(-)8¤+7,6Z-5,(-)8¤+1   //idem
:delVar TRepeat T    //ici:*2:delvar
:getKey[sto>]T
:End
:Line(6Z-5,(-)8¤+7,Z6-1,(-)8¤+7,0
:Line(6Z-5,(-)8¤+7,6Z-5,(-)8¤+1,0
:Z+(T=26)-(T=24[sto>]Z
:¤+(T=34)-(T=25[sto>]¤
:Z-(Z=W+1)+not(Z[sto>]Z  //ici : (Z=0 est interprété parreil que not(Z
:¤-(¤=H+1)+not(¤[sto>]¤  //ici:idem
:If T=45
:Goto Q
:If T=31
:Then
:fPart([A](¤,Z[sto>]A
:If .1=A
:Then
:.1+[A](¤,Z[sto>][A](¤,Z
:Text(8¤-7,6Z-4,"P   //ici: mult implicite
:End
:If .2=A
:Then
:[A](¤,Z)-.1[sto>][A](¤,Z
:Text(8¤-7,6Z-4,"O   //ici: mult implicite
:End
:End
:If T=21
:Then
:If not([A](¤,Z        //not(?  <=> (?=0
:Goto 01
:If 9.1=[A](¤,Z
:0[sto>]P
:If .1=fPart([A](¤,Z
:Then
:O-1[sto>]O
:[A](¤,Z)-0.1[sto>][A](¤,Z
:If [A](¤,Z  //ici: 0[différent de]?  <=> ?
:Then
:Text(8¤-7,6Z-4,[A](¤,Z   //mult implicite
:Else
:Text(8¤-7,6Z-4,"    //3 espaces   //ici : idem
:Lbl 01
:For(A,max(Z-1,1),min(Z+1,W
:For(B,max(¤-1,1),min(¤+1,H
:If .1=fPart([A](B,A
:Then
:[A](B,A)-.1[sto>][A](B,A
:O-1[sto>]O
:If 0=[A](B,A
:Then
:Text(8B-7,6A-4,"    //3 espaces   //mult implicite
:Else
:Text(8B-7,6A-4,[A](B,A   //mult implicite
:End
:End
:End
:End
:End
:End
:End
:If not(O  //ici
:0[sto>]P
:End
:If 9=[A](¤,Z
:Then
:Text(8¤-7,6Z-4,"X   //mult implicite
:Text(57,35,"PERDU!
:Else
:Text(57,35,"GAGNE!
:End
:For(A,1,W
:For(B,1,H
:If fPart([A](B,A
:Then
:If not(iPart([A](B,A   //ici
:Then
:Text(8B-7,6A-4,iPart([A](B,A   //mult implicite
:If 9<[A](B,A
:Text(8B-7,6A-4,"X   //mult implicite
:Else
:Text(8B-7,6A-4,"    //3 espaces   //mult implicite
:End
:End
:End
:End
:DelVar [A]


Sandro
-Coco- le 07/12/2011 à 19:58
Ouaip, merci.
En fait je n'y avais pas pensé, au début je les avais laissé pour la lisibilité du code (parce j'ai besoin d'y revenir moultes fois), et j'ai même pas pensé à les retirer, mais il est vrai que l'on peut les enlever, et ça fait quand même gagner au final quelques dizaines d'octets (toujours bon à prendre pour une calculatrice qui n'a que 25 ko de RAM (trop peu!) )
programmaths le 07/12/2011 à 21:02
yeah pas mal !! winkle.gif
il y a quelque optimisation a faire (pour une question de jouabilité):
en bas a droite, mettre les mines restantes (si ya 10 mine, ça marque 10, si on met un drapeau ça met 9, si on met X drapeau ça met 10-X ^^, si on met 10 drapeau (et que c'est pas gagné) on met erreur
pour savoir a combien on en est, si on a fais une erreur ou pas a la fin winkle.gif

Code

Disp "LA TAILLE EST","LIMITEE","AUTOMATIQUEMENT
:Input "LARGEUR:",W
:Input "HAUTEUR:",H

plutot:
Code

input "largeur(1-15):",W
input "hauteur(1-7):",H

ça économise quelque octet et ça montre le max/min winkle.gif

quand on perd, si un drapeau a été mal placé ça mette un "!" au lieu de rien, ça montre l'endroit ou l'on s'est planté happy.gif
dans le chargement des drapeaux, j'ai déja fais un ptti truck pas mal, ça ne doit pas concorder avec le tiens mais si ça te plais tu peux l'éssayé winkle.gif
Code

0->xmin:94->xmax
0->ymin:62->ymax
text(19,26,"chargement...
horizontal 31
horizontal 33
pt-On(0,32
pt-On(94,32
94/N->A   //N nombre de mines
0->I:O->D
repeat N=D
D+1->D
text(37,35,D," / ",N
line(0,32,I+A,32
I+N->I
..  // ici une génération de mine avec les matrices
end

comme ça si ya 10 mine, a chaque mine généré le chargement augmente de 1/10 avec un bel effet graphique winkle.gif

voila voila, très bon démineur sinon winkle.gif
The K le 08/12/2011 à 18:53
Tiens j'ai qqes idées pour réduire ton code programmaths ...
Code

0->xmin:94->xmax
0->ymin:62->ymax
text(19,26,"chargement...
horizontal 31
horizontal 33
pt-On(0,32
pt-On(94,32
94/N->A   //N nombre de mines
EffVar IEffVar DRepeat N=D
D+1->D
text(37,35,D," / ",N
line(0,32,I+A,32
I+N->I
..  // ici une génération de mine avec les matrices
end


Bon au final je n'en ai qu'une, je croyais qu'il y avait moyen de faire mieux en stockant 32 dans L vu qu'il y a beaucoup de 32 mais ... en fait non, tu ne perds, ni gagne, un seul octet laugh.gif
Polymorph le 08/12/2011 à 23:01
Un programme propre et sympathique, bravo !
Guiguititan le 09/12/2011 à 17:19
Coco les crédits!! ^^ sinon belle amélioration.
sandro le 09/12/2011 à 22:23
bah, moi, généralement, j'en mets pas, ça bouffe de la mémoir pour rien. et quand je télécharge un programme, la 1er chose que je fais, c'est de les virer.

Sandro
-Coco- le 10/12/2011 à 19:21
@Guiguititan
Hé man je te rappelle que celui là c'est MOI qui l'ai programmé sans même regarder le tien. Donc tu n'as aucune raison de te retrouver dans les crédits xD

Bon allez j'avoue Guiguititan m'a donné un peu d'inspiration graphique