Autorisation : Membre
Nb de messages : 3
Inscrit le : Ven 31 Déc 2010, 14:37
Posté le : Ven 02 Sep 2011, 16:10
Bonjour à tous.
Tout d'abord je tiens à dire que je suis un peu débutant.
J'ai commencé à réaliser un petit jeu qui consiste à déplacer un caractère (un personnage) sur l'écran jusqu'à une case de l'écran qui mènera à la salle suivante, en passant par toutes les cases seulement une seule fois.
Le terrain est parsemé de 4 obstacles (du moins pour le 1er niveau) à position aléatoire qui sont aussi des caractères.
Ce mini-jeu ressemble grandement à ce qu'on peut voir parfois dans les jeux Pokémon ou The Legend Of Zelda en 2D.
Si le personnage passe deux fois sur la même case, il doit recommencer la salle.
Bien sûr j'ai pris en compte le fait que ça ne soit pas toujours possible, à cause de l'apparition totalement aléatoire des obstacles, mais je ne suis pas assez expérimenté pour que ça soit possible.
Voilà, mon actuel problème :
Je cherche un moyen d'empêcher le traversement des obstacles.
Voici mon début :
Code
EffEcr
1->X
1->Y
entAléat(1,16)->A
entAléat(1,8)->B
entAléat(1,16)->C
entAléat(1,8)->D
entAléat(1,16)->E
entAléat(1,8)->F
entAléat(1,16)->G
entAléat(1,8)->H
Output(B,A,"O"
Output(D,C,"O"
Output(F,E,"O"
Output(H,G,"O"
Repeat K=105
Output(W,V,"*"
Output(Y,X,"X"
X->V
Y->W
codeTouche->K
X-(K=24)+(K=26)->X
Y-(K=25)+(K=34)->Y
If X=0
1->X
If X=17
16->X
If Y=0
1->Y
If Y=9
8->Y
End
---------- EDIT :
Pour le moment j'empêche de traverser les obstacles mais je ne réinitialise pas la salle.
Code
EffEcr
1->X
1->Y
entAléat(1,16->A
entAléat(1,8->B
entAléat(1,16->C
entAléat(1,8->D
entAléat(1,16->E
entAléat(1,8->F
entAléat(1,16->G
entAléat(1,8->H
Output(B,A,"O
Output(D,C,"O
Output(F,E,"O
Output(H,G,"O
Repeat K=105
Output(W,V,"*
Output(Y,X,"X
X->V
Y->W
Repeat K
codeTouche->K
End
min(16,max(1,X-(K=24)+(K=26->X
min(8,max(1,Y-(K=25)+(K=34->Y
If X=A et Y=B ou X=C et Y=D ou X=E et Y=F ou X=G et Y=H
Then
W->Y
V->X
End
End
Il reste plusieurs améliorations à employer, en particulier liste et boucle dont on pourra contrôler la taille selon le niveau.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Autorisation : Membre
Nb de messages : 3
Inscrit le : Ven 31 Déc 2010, 14:37
Posté le : Sam 03 Sep 2011, 20:59
Oh putain ! J'avais pas pensé à ça ! Ça reste encore un peu louche pour moi mais je vais étudier ça.
Merci !
Mais il reste le problème du fait qu'il faut qu'on ne puisse pas repasser sur la même case sous peine de perdre...
Une connaissance m'a dit qu'il fallait faire un "tableau".
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Sam 03 Sep 2011, 21:10
Je peux proposer une autre méthode avec une matrice :
Code
:Lbl DP
:EffEcr
:{8,16 -> dim([A] //atribue à la matrice [A] une dimention verticale de 8 et
horizontale de 16; "dim(" est dans [matrice][droite]; "[A] est dans [matrice]
:Remplir(0,[A] // remplit la matrice de 0 (0=libre)
:For(A,1,nombre_d'obstacles //nombre_d'obstacle doit être remplacer par un
nombre, une variable ou un calcul
:Lbl 1
:entAléat(1,16->X //abscisse de l'obstacle
:entAléat(1,8->Y //ordonnée de l'obstacle
:If [A](Y,X // dans une matrice, on met la ligne avant la colonne
:Goto 1 // s'il y a déjà un obstacle, on revient à avant le tirage (on
reprend au Lbl 1
:1->[A](Y,X //1=obstacle
:Output(Y,X,"O //O peut être remplacé par un autre caractère symbolisant
l'obstacle
:End //Fin du tirage aléatoire des obstacles
:Lbl 2
:entAléat(1,16->X //abscisse de l'arrivée
:entAléat(1,8->Y //ordonnée de l'arrivée
:If [A](Y,X
:Goto 2 // s'il y a déjà un obstacle, on revient à avant le tirage (on
reprend au Lbl 2
:2->[A](Y,X //2=arrivée
:Output(Y,X,"! //! peut être remplacé par un autre caractère symbolisant
l'arrivée
:Lbl 3
:entAléat(1,16->X //abscisse du départ
:entAléat(1,8->Y //ordonnée du départ
:If [A](Y,X
:Goto 3 // s'il y a déjà un obstacle ou si c'est l'arrivée, on revient
à avant le tirage (on reprend au Lbl 3
:3->[A](Y,X //3=on y est déja passé
:Output(Y,X,"+ //+ peut être remplacé par un autre caractère symbolisant
le personnage
:1->E //si E=0, on est déjà passé sur la case
:1->V //si V=0, on aréussit le niveau
:While E et V
:Repeat K //attend que l'on appuit sur une touche
:CodeTouche ->K //"CodeTouche" est dans [prgm][droite] et attribue à chaque
touche un nombre (gauche=24, haut=25, droite=26, bas=34)
:End
:X+(K=26)-(K=24->S //nouvelle abscisse dans S
:Y+(Y=34)-(Y=25->T //Nouvelle ordonnée dans T
:If T=0 ou T=9 ou S=0 ou S=17 //on est sortit de l'écran + évite un bug dans
les tests suivants
:End //comme le If n'utilise pas de Then, ferme la boucle du While sans
modifier la position du perso
:If 3=[A](T,S
:0->E //E=0 signifie que l'on doit recommencer (on sort d'abord de la
boucle pour ne pas ralentir la TI)
:If 1=[A](T,S //il y a un obstacle
:End //comme le If n'utilise pas de Then, ferme la boucle du While sans
modifier la position du perso
:If 2=[A](T,S //on est arrivé au bout du niveau
:0->V //si V=0 : niveau fini
:Output(Y,X,"X //X peut être remplaé par un autre symbôle représentant une
case où l'on est déjà passé (on marque la case que l'on est en train de quiter)
:Output(Y,X,"+ //+ peut être remplacé par un autre caractère symbolisant
le personnage (on marque le nouvel emplacement du personnage)
:S->X
:T->Y
:End //termine la boucle While
:If non(E //si on est allé sur une case où on était déjà
:Goto DP //on recommence (on reprend au Lbl DP)
:Output(4,2,"NIVEAU TERMINE //si la boucle While s'arrête et que l'on ne
doit pas recommencer, alors, on a réussit.
En espérant avoir suffisament bien expliqué
Sandro
PS : je n'ai pas testé, donc si ça ne marche pas, décrit moi le bug, la valeur des variables et, si ça bug, aussi le type d'erreur (ERR:???????) ainsi que l'emplacement de l'erreur (appuie sur 2 et recopie moi la ligne (en la situant s'il y en a plusieurs d'identiques dans le programme) et indique moi sur quel carractère s'arrête le curseur).
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes