Forum

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

Roulette Russe

Homer_Dalor le 13/05/2017 à 13:55
Bonjour les gens.

Une roulette russe où on choisit le nombre de balles dans le barillet, une animation à chier parce que flemme, une étoile c'est une balle, un O, c'est vide, si la forme en haut est une étoile, vous êtes mort.

Code
:Lbl M
:Menu("ROUL. RUSSE","JOUER",J,"QUITTER",Q
:Lbl J
:EffEcr
:Disp "****************
:Output(3,5,"COMBIEN
:Output(4,8,"DE
:Output(5,5,"BALLES ?
:Output(8,1,"****************
:Output(6,7,"< >
:3->A
:Repeat K=45 ou K=105
:codeTouche->K
:min(6,max(1,A+(K=26)-(K=24->A
:Output(6,8,A
:End
:If K=45:Goto M
:{1,2,3,4,5,6->L1
:{0,0,0,0,0,0->L2
:For(B,1,A
:EntAléat(B,6->C
:0->L1(C
:TriCroi(L1
:End
:" ->Chaîne1
:For(F,1,6
:Chaîne1+sous-Chaîne("*0",somme(L1=F)+1,1->Chaîne1
:End
:EffEcr
:sous-Chaîne(Chaîne1,2,longueur(Chaîne1)-1->Chaîne1
:For(F,1,40
:sous-Chaîne(Chaîne1,2,longueur(Chaîne1)-1)+sous-Chaîne(Chaîne1,1,1->Chaîne1
:For(G,1,3
:Output(1+2G,8-2(G>1),sous-Chaîne(Chaîne1,G,1
:Output(7-2G,10-2(G=1),sous-Chaîne(Chaîne1,G+3,1
:End
:For(G,1,e^(F/7
:End
:End
:If sous-Chaîne(Chaîne1,1,1="*
:Then
:Output(4,4,"YOU'RE DEAD
:Else
:Output(4,3,"T'AS EU CHAUD
:End
:Pause
:Goto M
:Lbl Q
:EffEcr


Vous allez sûrement vous dire "Tu t'es fait chier pour rien avec tes chaînes", je vous répondrai "oui, mais j'aime bien".
Bisous ! <3
Mingerton le 13/05/2017 à 15:15
De l'optimisation à la con parce que vraiment pas grand chose à redire sinon :

Code
:{1,2,3,4,5,6->L1
:{0,0,0,0,0,0->L2

Devient :
Code
:suite(X,X,1,6->L1
:6->dim(L2
:Remplir(0,L2



Code
:For(B,1,A
:EntAléat(B,6->C
:0->L1(C
:TriCroi(L1
:End

Devient :
Code
:For(B,1,A
:0->L1(EntAléat(B,6
:TriCroi(L1
:End



Le code des chaînes est bien maîtrisé. Bonne idée le ralentissement progressif grâce à une boucle For, bien plus pratique que des 69! enchaînés dans ce cas.

Juste une remarque, tu ne peux pas enlever la parenthèse dans ce cas là :
Code
:If sous-Chaîne(Chaîne1,1,1="*

Donc on fait :
Code
:If sous-Chaîne(Chaîne1,1,1)="*


Après c'est vrai qu'il est pas très joli mais sur l'écran numérique y a pas grand chose qu'on puisse faire de joli winkle.gif.
Ruadh le 13/05/2017 à 19:27
Code
:sous-Chaîne(Chaîne1,2,longueur(Chaîne1)-1->Chaîne1
[...]
:sous-Chaîne(Chaîne1,2,longueur(Chaîne1)-1)+sous-Chaîne(Chaîne1,1,1->Chaîne1


La longueur de la chaîne est toujours la même à ces lignes, elle est de 7 pour la première et de 6 pour la deuxième.
Tu peux donc remplacer ces deux lignes par :

Code
:sous-Chaîne(Chaîne1,2,6->Chaîne1
[...]
:sous-Chaîne(Chaîne1,2,5)+sous-Chaîne(Chaîne1,1,1->Chaîne1


Code
:Disp "****************
:Output(3,5,"COMBIEN
:Output(4,8,"DE
:Output(5,5,"BALLES ?
:Output(8,1,"****************


Devient :

Code
:"****************
:Disp Rép
:Output(3,5,"COMBIEN
:Output(4,8,"DE
:Output(5,5,"BALLES ?
:Output(8,1,Rép
m@thieu41 le 13/05/2017 à 22:15
Mingerton a écrit :
De l'optimisation à la con parce que vraiment pas grand chose à redire sinon :

Code
:{1,2,3,4,5,6->L1
:{0,0,0,0,0,0->L2

Devient :
Code
:suite(X,X,1,6->L1
:6->dim(L2
:Remplir(0,L2


Et même:
Code
:suite(X,X,1,6->L1
:DelVar L26->dim(L2


Ou carrément:
Code
:suite(X,X,1,6->L1
:0L1->L2


Mais... à quoi te sert L2 ?

**************************************

Code
:For(B,1,A
:EntAléat(B,6->C
:0->L1(C
:TriCroi(L1
:End
:" ->Chaîne1
:For(F,1,6
:Chaîne1+sous-Chaîne("*0",somme(L1=F)+1,1->Chaîne1
:End


Devient:

Code
:EntAléat(0,9,6->L2
:suite(X<=A,X,1,6
:TriCroi(L1,L2
:"
:For(F,1,6
:Rép+sous-Chaîne("*0",1+L1(F),1->Chaîne1
:End


***********************

On peu aussi utiliser Rép tout du long, sans jamais stocker la chaine dans chaine1.

**************************
Code
:If sous-Chaîne(Chaîne1,1,1="*
:Then
:Output(4,4,"YOU'RE DEAD
:Else
:Output(4,3,"T'AS EU CHAUD
:End


devient:

Code
:"T'AS EU CHAUD
:If sous-Chaîne(Chaîne1,1,1="*
:" YOU'RE DEAD
:Output(4,3,Rép


****************************

[spoiler]C'est bizarre ton histoire de chaines :p[/spoiler]
Homer_Dalor le 13/05/2017 à 22:48
Merci pour vos réponses :3

Effectivement, L2 ne sert à rien, j'avais essayé plusieurs solutions auparavant et elle m'était utile à ce moment là, j'ai oublié de l'enlever ^^

Et en quoi c'est bizarre mon histoire de chaîne? cry.gif

Sinon, je sais pas si c'est moi mais

Citation


Code
:For(B,1,A
:EntAléat(B,6->C
:0->L1(C
:TriCroi(L1
:End
:" ->Chaîne1
:For(F,1,6
:Chaîne1+sous-Chaîne("*0",somme(L1=F)+1,1->Chaîne1
:End




Devient:



Code
:EntAléat(0,9,6->L2
:suite(X<=A,X,1,6
:TriCroi(L1,L2
:"
:For(F,1,6
:Rép+sous-Chaîne("*0",1+L1(F),1->Chaîne1
:End



Je comprend pas les trois premières lignes notgood.gif
Mingerton le 14/05/2017 à 00:40
Bien vu m@thieu41 ! Effectivement un Ans passe tout seul sur tout le code j'avais pas remarqué.

Pour les trois lignes qui te posent problème :
- EntAleat peut prendre un troisième argument, qui est la longueur d'une liste. On aura alors une liste de nombres aléatoires
- Une autre utilisation du suite() : remplira avec les X croissants tant que X<=A. On se passe là aussi de la boucle
- TriCroi prend autant de listes que voulues en argument

Soyons fous pour la première ligne :
Code
:EntAléat(0,9,6->L2

//Devient :

:partEnt(10NbrAléat(6->L2
Homer_Dalor le 14/05/2017 à 01:23
En testant, pour suite(X<=A,X,1,6) j'obtient {1,1,0,0,0,0} si A=2 par exemple, ça me paraît logique. Pour le EntAleat, on se retrouve avec 6 valeurs de 1 à 9. Ce que je ne comprend pas,c'est en quoi ça remplace mon code.

Avec ce que j'ai écris, on se retrouve avec A fois 0 puis 6-A fois des valeurs entre 1 et 6 sans doublons dans L1.

Ici on se retrouve avec deux listes qui n'ont rien à voir. notgood.gif
Mingerton le 14/05/2017 à 02:22
Pour l'utilisation du TriCroi à plusieurs listes : ca ne trie pas chacune des listes mais seulement la première, et ensuite réarrange les suivantes de manière à ce que les éléments qui étaient à la même place le soient encore. Je m'explique :
Code
{6,5,1,2,4,3->L1
{7,0,2,1,6,4->L2

TriCroi(L1,L2

//On obtient alors :

L1={1,2,3,4,5,6}
L2={2,1,4,6,0,7}


Je pense que ce qu'a essayé de faire m@thieu c'est un code de rand sans répétition, mais en effet quelque chose ne va pas. Déjà le TriCroi est ici mal utilisé il me semble, on trie la mauvaise liste. Et il doit manquer une ligne, le but doit être de multiplier par cette liste de 0 et de 1 par la suite pour éliminer les valeurs mauvaises.

Je propose le correctif suivant :
Code
NbrAléat(6->L2
TriCroi(L2,L1
L1suite(X>A,X,1,6->L1


Noter que la liste L1 n'est pas triée, on doit rajouter un tri si on veut forcément qu'elle soit triée dans la suite
Homer_Dalor le 14/05/2017 à 03:24
Je ne suis donc pas fou ! \o/

Ta méthode est bonne, et pas besoin de trier la liste pour la suite du programme bigmouth.gif

Voici le programme avec vos améliorations <3


Code
:Lbl M
:Menu("ROUL. RUSSE","JOUER",J,"QUITTER",Q
:Lbl J
:EffEcr
:"****************
:Disp Rép
:Output(3,5,"COMBIEN
:Output(4,8,"DE
:Output(5,5,"BALLES ?
:Output(8,1,Rép
:Output(6,7,"< >
:3->A
:Repeat K=45 ou K=105
:codeTouche->K
:min(6,max(1,A+(K=26)-(K=24->A
:Output(6,8,A
:End
:If K=45:Goto M
:suite(X,X,1,6->L1
:NbrAléat(6->L2
:TriCroi(L2,L1
:L1suite(X>A,X,1,6->L1
:"
:For(F,1,6
:Rép+sous-Chaîne("*0",somme(L1=F)+1,1
:End
:EffEcr
:sous-Chaîne(Rép,2,6
:For(F,1,40
:sous-Chaîne(Rép,2,5)+sous-Chaîne(Rép,1,1
:For(G,1,3
:Output(-1+2G,8-2(G>1),sous-Chaîne(Rép,G,1
:Output(9-2G,10-2(G=1),sous-Chaîne(Rép,G+3,1
:End
:For(G,1,e^(F/7
:End
:End
:sous-Chaîne(Rép,1,1)="*->Y
:"T'AS EU CHAUD
:If Y
:" YOU'RE DEAD
:Output(4,3,Rép
:Pause
:Goto M
:Lbl Q
:EffEcr
Mingerton le 14/05/2017 à 20:05
Du coup on garde quand même le
Code
{1,2,3,4,5,6->L1
//Devient :
suite(X,X,1,6->L1


Pourquoi stocker la variable Y ?

Code
:sous-Chaîne(Rép,1,1)="*->Y
:"T'AS EU CHAUD
:If Y
:" YOU'RE DEAD

//Devient  :

:"T'AS EU CHAUD
:If sous-Chaîne(Rép,1,1)="*
:" YOU'RE DEAD
Homer_Dalor le 14/05/2017 à 20:16
Non, Rép devient "T'AS EU CHAUD" à la ligne d'avant, ça ne marche plus notgood.gif

J'ai modifié mon post pour L1 :3
Mingerton le 14/05/2017 à 21:08
Ah oui, j'ai optimisé trop vite ^^
Paulo1026 le 15/05/2017 à 19:46
Tou82 ressort de sa tombe ^^ 10 postes en 2 jours sur le même sujet bigmouth.gif
Mingerton le 15/05/2017 à 21:54
Ah ba quand un bon programme sort c'est toujours un plaisir de l'améliorer winkle.gif
m@thieu41 le 16/05/2017 à 15:56
Mingerton a écrit :
Pour l'utilisation du TriCroi à plusieurs listes : ca ne trie pas chacune des listes mais seulement la première, et ensuite réarrange les suivantes de manière à ce que les éléments qui étaient à la même place le soient encore. Je m'explique :
Code
{6,5,1,2,4,3->L1
{7,0,2,1,6,4->L2

TriCroi(L1,L2

//On obtient alors :

L1={1,2,3,4,5,6}
L2={2,1,4,6,0,7}


Je pense que ce qu'a essayé de faire m@thieu c'est un code de rand sans répétition, mais en effet quelque chose ne va pas. Déjà le TriCroi est ici mal utilisé il me semble, on trie la mauvaise liste. Et il doit manquer une ligne, le but doit être de multiplier par cette liste de 0 et de 1 par la suite pour éliminer les valeurs mauvaises.

Je propose le correctif suivant :
Code
NbrAléat(6->L2
TriCroi(L2,L1
L1suite(X>A,X,1,6->L1


Noter que la liste L1 n'est pas triée, on doit rajouter un tri si on veut forcément qu'elle soit triée dans la suite



Ouais j'ai chibré crazy.gif

Je pense plutôt aux 3 lignes suivantes, sinon on a pas le bon nombre de balles si ?

Code
NbrAléat(6->L2
suite(X<=A,X,1,6->L1
TriCroi(L2,L1
Mingerton le 17/05/2017 à 12:10
Je crois que les nombres mis dans la liste finale désignent les places des balles dans le barillet. Avec ton code on aura jamais les nombres au dessus de A si je me trompe pas, donc ca revient à toujours avoir les balles au même endroit.

Je ne sais pas exactement comment le A est exploité, j'ai écrit mon code avec l'indication suivante :
"Homer_Dalor" a écrit :
Avec ce que j'ai écris, on se retrouve avec A fois 0 puis 6-A fois des valeurs entre 1 et 6 sans doublons dans L1.
m@thieu41 le 18/05/2017 à 12:22
En fait je m'étais trompé, la sous-chaine doit être "0*" et non "*0" avec mon code (corrigé, cette fois c'est la bonne :p):

Code
NbrAléat(6->L2
suite(X<=A,X,1,6->L1
TriCroi(L2,L1
"
For(F,1,6
Rép+sous-Chaîne("0*",1+L1(F),1
End


À la fin des 3 premières lignes, on a une liste L1 avec A fois 1 dedans, et 6-A fois 0, dans un ordre aléatoire.

Ensuite, avec ma façon d'afficher (1+L1(F)), on affiche bien des "*" lorsque L1 vaut 1 (à A endroits) et des "0" ailleurs.

*************************

Code
:suite(X,X,1,6->L1
:NbrAléat(6->L2
:TriCroi(L2,L1
:L1suite(X>A,X,1,6->L1
:"
:For(F,1,6
:Rép+sous-Chaîne("*0",somme(L1=F)+1,1
:End


Cette méthode marche aussi, mais est moins optimisée
Mingerton le 18/05/2017 à 22:45
Je crois que j'ai capté où on ne s'était pas compris : je n'avais pas vu que tu avais changé la ligne qui est dans le For(), c'est pour ca que je ne comprenais pas ton code.

Donc oui, cette méthode est mieux optimisée winkle.gif