Forum

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

Petit jeux de combat tres basique - Page 1 / 2

adrien41 le 27/02/2015 à 16:28
Salut les gens.Cette fois-ci je reviens avec un petit programme que j'essaierai d'améliorer avec votre aide.
Code
10000->P
10000->V
Lbl 0
ClrHome
Menu("QUE FAIRE?","ATTAQUER",A,"SE SOIGNER",S,"PV,PV
Lbl A
randInt(5000,0)->B
V-B->V
If V (inferieur ou egal) 0:Goto P
ClrHome
Output 5,1,"PV IA:
Output 5,8,V
Pause "PAUSE"
Goto 1
Lbl S
randInt(5000,0)->B
P+B->P
If P>10000:10000->P
Output 5,1,"PV J1:
Output 5,8,P
Pause "PAUSE"
Lbl 1
randInt(2,1)->B
If B=1:randInt(5000,0)->E:E+V->V:If V>10000:10000->V:Goto 0
If B=2:randInt(5000,0)->E:P-E->P:If P<0:Goto P2:Goto 0
Lbl PV
ClrHome
Output 4,1,"PV J1:
Output 4,8,P
Output 6,1,"PV IA:
Output 6,8,V
Pause "PAUSE"
ClrHome
Goto 0
Lbl P
ClrHome
Output 5,1,"GAGNER
Pause "PAUSE"
10000->P
10000->V
Goto 0
Lbl P2
ClrHome
Output 5,1,"PERDU"
Pause "PAUSE"
10000->P
10000->V
Goto 0
adrien41 le 28/02/2015 à 11:23
bonjour tlm. Est-ce que quelqu'un aurai une idee pour les attaques et les soins,s'il vous plait?
leo_85 le 02/03/2015 à 18:37
j'ai bien une idée mais je te fais patienter jusque demain la j'ai pas le temps je suis sure qu'ont peut faire plus court et relativement bien optimisé ,si j'ai bien compris c'est un jeu de combat en mode texte avec attaque et guérison contre la calculette (mais peut être pourquoi pas contre un joueur?)bref je fais sa sur papier puis sur ma calto et je te dis ça demain happy.gif
adrien41 le 03/03/2015 à 10:28
Tiens regarde:j'ai essayé de le faire pour deux joueurs.
Code
 Lbl ZZ
10000->P
10000->V
Lbl 0
ClrHome
Menu("CHOIX DE J1","ATTAQUE",A1,"SOINS",S1
Lbl A1
randInt(5000,0)->A
V-A->V
If V<0:Goto V:End
Goto J2
Lbl S1
randInt(5000,0)->S
P+S->P
If P>10000:10000->P:End
Lbl J2
ClrHome
Menu("CHOIX J2","ATTAQUE",A2,"SOINS",S2
Lbl A2
randInt(5000,0)->A
P-A->P
If P<0:Goto P:End
Goto 0
Lbl S2
randInt(5000,0)->S
V+S->V
If V>10000:10000->V:End
Goto 0
Lbl V
ClrHome
Disp"VICTOIRE DE J1"
Pause
Goto ZZ
Lbl P
ClrHome
Disp"VICTOIRE DE J2"
Pause
Goto ZZ
leo_85 le 03/03/2015 à 18:52
Ma version du schmilblick ^^

Code
EffEcr
20->B
20->C
Disp "vie=20","Action:","Combattre!(1)","Se Soigner(2)"
Lbl 01
Prompt A
If A=1
Then
EffEcr
entAléat(2,5->D
C-D->C
If C&#8804;0 ou B&#8804;0
Then
Goto 03
Else
Disp "Degas a IA","Vie IA:",C
Goto 02
If A=2
Then
B+2->B
Disp "Soigne","Vie:",B
Goto 02
If A&#8800;1 et A&#8800;2
Then
Goto 01
Lbl 02
entAléat(1,4->E
If E<4
Then
entAléat(2,5->F
B-F->B
Disp "IA Frappe",F,"Votre Vie:",B
If B&#8804;0 ou C&#8804;0
Then
Goto 03
Else
Goto 01
If E=4
Then
C+2->C
Disp "IA Se Soigne","Vie IA:",C
Goto 01
If C>20
Then
20->C
Lbl 03
If B=0
Then
Disp "Perdu
If C=0
Then
Disp "Gagne!
End 
leo_85 le 03/03/2015 à 19:00
petit oublis (et énorme bug...) si l'IA ou le joueur se soigne sa met fin au programme... goutte.gif si quelqu’un a la soluce je suis preneur...
linkakro le 04/03/2015 à 00:03
J'ai lu quelques instants mais je n'ai pas le courage de l'étudier entièrement avec tous les abus de goto. Mon article Goto_vs_algo dans ma signature.
leo_85 le 04/03/2015 à 12:55
3 goto c'est abusé? moodforlove.gif il y a t-il une alternative? (elle optimiserait peut-être le programme?)je suis désolé mais mes connaissance en TI basic sont très limité pour te donner une idée c'est mon programme le plus long et le plus complexe...
Mingerton le 04/03/2015 à 14:10
A vrai dire je pense que tu as oublié de fermer presque toutes tes conditions, ce qui peut être la source des bugs. Le Goto est vraiment une arme de toute dernière nécessité en TI-Basic, car il est TOUJOURS possible de le remplacer par une boucle ou un test, et aussi parce que le Goto est une source illimitée de bugs. Regarde ce code par exemple :

Code
Lbl 1
For(A,1,53
Goto 1
End


On entre dans une boucle, et on en ressort. Mais on est encore dépendant de la boucle. Sauf qu'entre temps on y est entré à nouveau... Ainsi de suite jusqu'à l'inévitable Err:Memory.

De plus, les Goto sont très difficiles à lire dans un code (pour un lecteur humain), parce qu'il faut prendre en compte à chaque Goto le code qui y est rattaché, etc...

Pour éviter tout ça, je te conseille une structure comme celle ci :

Code
//Affichage de la console, textes fixes qui ne varient pas, commandes, etc
//Initialisations des points de vie, B et C
While BC             // un test booléen : si l'un des deux est nul, alors la condition d'entrée de boucle n'est pas vraie et le programme s'arrête
//Ton code pour faire varier les points de vie, et l'IA
End
//Affichages de fin de code


C'est une structure très simple, pas moins rapide puisqu'elle n'appelle aucune étiquette, et tu peux même y glisser un codeTouche :

Code
codeTouche->K           //stocke le code de la première touche pressée dans K
If K=92
//Si on a appuyé 1, alors il se passe ça
If K=93
//Si on a appuyé sur 2, alors il ce passe cette autre chose.


A insérer dans une boucle pour ce genre d'interaction. Ta boucle While fera l'affaire. Le code d'une touche est formé de sa ligne sur le clavier puis de sa colonne. Par exemple, la touche 2nd a pour code 21. La touche On n'a pas de code.

Essaye déjà de venir à bout du programme avec ces techniques, et on pourra te proposer des améliorations et/ou optimisations winkle.gif
leo le 04/03/2015 à 17:02
je suis désolé de te demander ça et je comprendrais que tu ne le fasse pas mais comme je l'ais dit mes connaissances en TI-Basic sont très limité alors pourrais tu refaire le code avec les nouvelles boucles? moodforlove.gif
Mingerton le 04/03/2015 à 18:13
Eh bien à vrai dire je n'ai pas vraiment le temps...

De plus, le meilleur moyen de progresser est de programmer toi même, de comprendre comment ça marche en faisant des erreurs et en les résolvant. Je te propose donc d'essayer déjà de le faire toi même happy.gif
leo_85 le 04/03/2015 à 18:48
oui bien sur je comprend c'est pas grave... si j'ai bien compris un "goto" annule le "end" qui vient après? donc le programme va n'importe ou?
Mingerton le 04/03/2015 à 18:53
Le Goto saute directement à son label, donc forcément le End n'est pas lu (dans le code exemple). Mais c'est pas forcément un End qui est oublié, même si c'est souvent ce cas qui pose des problèmes. Si tu veux apprendre à bien programmer en TI-Basic, je te conseille le tuto de mdr1 sur le sdz :

http://openclassrooms.com/cour[...]mer-en-ti-basic
leo_85 le 05/03/2015 à 19:06
Nouveau code! avec des vrais morceaux de Goto et de tête de mule a l’intérieur: tout est corrigé zero bug!

Code
EffEcr
20->B
20->C
Disp "vie=20","Action:","Combattre!(1)","Se Soigner(2)"
Lbl 01
If B>0 et C>0
Then
Prompt A
Else
Goto 03
End
If A=1
Then
EffEcr
entAléat(2,5->D
B-D->B
Disp "Degas a IA","Vie IA:",B
Goto 02
End
If A=2
Then
C+2->C
If C>20
Then
20->C
End
Disp "Soigne","Vie:",C
Goto 02
End
If A[différent de]1 et A[différent de]2
Then
Goto 01
Lbl 02
If B>0 et C>0
Then
entAléat(1,4->E
Else
Goto 03
End
If E<4
Then
entAléat(2,5->F
C-F->C
Disp "IA Frappe",F,"Votre Vie:",C
Goto 01
End
If E=4
Then
B+2->B
If B>20
Then
20->B
End
Disp "IA Se Soigne","Vie IA:",B
Goto 01
End
Lbl 03
If C[inférieur ou égal à]0
Then
Disp "Perdu
Output(1,1,"
End
If B[inférieur ou égal à]0
Then
Disp "Gagne!
Output(1,1,"
End 


je me suis peut-être planté au recopiage mais comme ma version marche si sa plante contacter moi ici

sinon merci Mingerton je continue de suivre le cours du site du zéro (oui je l’appelle comme ça)
leo_85 le 05/03/2015 à 19:13
et puis je me suis fais un compte sur le site voila!
Mingerton le 05/03/2015 à 20:28
Très bien leo_85 ! happy.gif

En suivant ce tuto tu pourras maîtriser les boucles et les conditions pour arriver à ce que je t'ai proposé. Déjà tu as réussi à dompter ce bug seul, c'est déjà une belle avancée !

Je peux déjà te proposer quelques astuces :

- les Lbl et les Goto n'ont pas forcément deux caractères. Pour économiser des octets, tu peux remplacer tes Lbl et Goto à 2 caractères par d'autres à un seul caractères

- Inutile de créer des variables si elles ne servent qu'une fois. Ainsi, ces deux codes sont équivalents :
Code
entAléat(2,5->D
B-D->B

entAléat(2,5->F
C-F->C

équivaut à :

B-entAléat(2,5->B

C-entAléat(2,5->C


- Je vois que tu as pris le coup de main du Output(1,1,". Tu peux économiser des octets en mettant un simple guillemet ("), qui par contre décalera une ligne à la fin mais ça n'a as l'air grave pour ce code

Je pourrais te donner d'autres trucs (cf ma signature sinon) quand tu appliqueras des boucles et des tests booléens winkle.gif
leo_85 le 06/03/2015 à 16:53
merci a toi! j'ai optimisé et économisé quelque octet mais je pense pas que je vais le re-recopier avec les modif' le principe et la et le programme fonctionne!
Mingerton le 06/03/2015 à 17:24
A ta guise, même si je pense que c'est dommage pour ton progrès personnel.
leo_85 le 07/03/2015 à 10:59
non je voulais dire que j'ai pris en compte tes modif sur ma calto mais que j'avais la flemme de re-recopier les modif sur la page mais sinon si tu veux je le ferait... ^^
leo_85 le 10/03/2015 à 18:11
désolé de Up mais j'ai décidé de ressortir mon code avec les amélio de Mingerton (merci encore au passage) , des indications pour les débutants et ma version deux joueurs (je n'explique pas la version 2 joueur car c'est un vague copier-coller de la version 1 joueur)

bref la version 1 joueur :

Code
EffEcr //on fait place net
20->B
20->C //on définit les points de vie
Disp "vie=20","Action:","Combattre!(1)","Se Soigner(2)"
Lbl 1 //le label 1 sera les actions du joueur 1
If B>0 et C>0 //on vérifie que personne n'est mort pour jouer
Then
Prompt A
Else
Goto 3 //si quelqu’un est mort on va aux conditions de victoire/défaite
End
If A=1
Then
EffEcr
B-entAléat(2,5->B // on soustrait les dégâts a la vie de l'IA
Disp "Degas a IA","Vie IA:",B
Goto 2 //après une action c'est au tour de l'IA
End
If A=2
Then
C+2->C
If C>20
Then
20->C //se soigner ne permet pas de dépasser la vie maximale
End
Disp "Soigne","Vie:",C
Goto 2 //après une action c'est au tour de l'IA
End
If A[différent de]1 et A[différent de]2
Then
Goto 1 //si il y a faute de frappe on redemande un choix
Lbl 2 //le label 2 définit les actions de l'IA
If B>0 et C>0 //on revérifie la vie pour éviter que le joueur humain tue l'IA en étant mort
Then
entAléat(1,4->E //l'action de l'IA est aléatoire
Else
Goto 03 //si quelqu’un est mort on va aux conditions de victoire/défaite
End
If E<4
Then
entAléat(2,5->F
C-F->C
Disp "IA Frappe",F,"Votre Vie:",C
Goto 01
End
If E=4
Then
B+2->B
If B>20
Then
20->B
End
Disp "IA Se Soigne","Vie IA:",B
Goto 01
End
Lbl 03 //les fameuses conditions de victoire/défaite
If C[inférieur ou égal à]0
Then
Disp "Perdu
Output(1,1," //cette commande permet de ne pas afficher "fait" ou "end" a la fin
End
If B[inférieur ou égal à]0
Then
Disp "Gagne!
Output(1,1,"
End



et la version 2 joueurs

Code
20->C
20->D
EffEcr
Lbl 1
Disp "J1(A):",c,"J2(B):",D,"Frapper=1","Soigner=2"
If C>0 et D>0
Then
Prompt A
EffEcr
Else
Goto 3
End
If A=1
Then
D-entAléat(2,5->D
Goto 2
End
If A=2
Then
C+2->C
If C>20
Then
20->C
End
Goto 2
End
If A [différent de]1 et A [différent de]2
Then
Goto 1
End
Lbl 2
Disp "J1(A):",c,"J2(B):",D,"Frapper=1","Soigner=2"
If C>0 et D>0
Then
Prompt B
EffEcr
Else
Goto 3
End
If B=1
Then
C-entAléat(2,5->C
Goto 1
End
If B=2
D+2->D
If D>20
Then
20->D
End
Goto 1
End
If B[différent de]1 et B[différent de]2
Then
Goto 2
End
Lbl 3
If C [inférieur ou égal] 0
Then
EffEcr
Disp "J1(A):",c,"J2(B):",D,"J2 a Gagne!"
End
If D [inférieur ou égal]0
Then
EffEcr
Disp "J1(A):",c,"J2(B):",D,"J1 a gagne!"
End