Avertissement :Il s'agit d'une page optimisée pour la navigation mobile. Voir la
page originale.
Enchainement d'ennemis
uninternaute le 23/12/2012 à 23:56
Bonjours. Voilà mon problème, je me suis lancé dans un programme, en fait c'est un jeu d'adresse, un "X" que l'on promene dans une zone limitée sur l'écran des calculs (long : 1-16, larg : 4-6) doit eviter de toucher les "O" qui arrivent vers lui (ils sont dans la meme zone), mais le probleme c'est que je ne crée qu'un seul "O" à la fois, comment faire pour en avoir 1 à chaque ligne verticale ?
J'ai un peu de mal à m'exprimer ce soir, si jamais vous n'avez pas compris ce que j'ai demandé, dites le je vous ecrirez le code que j'ai fait pour l'instant
Mais en gros c'est comme un de ces jeux de voitures sur neogeo ou megadrive (où l'on doit esquiver les voitures devant nous, sauf que la tout ce passe à l'horizontale)
Merci d'avancePersalteas le 24/12/2012 à 10:01
Il te faut utiliser une matrice de 4 par 16 contenant les positions des ennemis, et redessiner la matrice a chaque tour de boucle en fonction de ses valeurs.
Une technique plus optimisée et plus rapide (mais plus difficile

) consisterait a faire du scrolling avec des chaines: en utilisant 4 chaines de caractères (une par horizontale) que tu décales d'un pas vers la gauche avec "sous-chaine" en rajoutant un blanc vers la droite a chaque tour de boucle (ou un nouveau O si un nombre aléatoire le décide).
Tu fais ça pour chacune des 4 chaines, puis tu affiche une chaine par ligne.
uninternaute le 24/12/2012 à 13:42
ah d'accord, mais je ne suis pas du tout familier avec les matrices et les chaines, un petit exemple d'utilisation ainsi qu'une explication seraient les biens venusmaxence le 24/12/2012 à 16:41
Si tu as du mal horisontalement, je te conseil de commencer d'abord verticalement, c'est bien plus simple. Tu affiche ton "O" en bas de l'écran, et tu utilise la commande Disp "" pour faire remonter tout l'écran vers le haut.
Non seulement c'est plus simple, mais c'est aussi plus léger et plus rapide.
Après c'est plus simple de passer horisontalement. Mais biensur tu fait comme tu veux
Pour les chaines de caractères, tu peux faire comme ceci:
Code
sous-chaîne(chaîne1+"O", 2, 16)->chaîne1
Avec "chaine1" une ligne de ton scroling qui est composé au total de 4 lignes.
le fait de faire ' chaine1+"O" ' rajoute un "O" à la fin de ta chaine.
la commande "sous-chaine" s'utilise de cette manière:
sous-chaine( chaineÀCouper, premierCaractèreDeLaNouvelleChaine, longueurDeLaNouvelleChaine )
par exemple: sous-chaine( "BONJOUR", 2, 4) te donne "ONJO"
J'espere que tu a compris mon exemple, persaelorus rex te conseilera mieux que moi sur les matrices

uninternaute le 26/12/2012 à 19:07
ça me fait dimension invalide
voilà mon cocode
Code
:1->E // variable permetaant au jeu de continuer
:5->A // position du "X" (selon la largeur)
:1->B // position du "X" (selon la longeur)
:0->F // score
:0->C // position ennemie (larg)
:0->D // position ennemie (long)
:EffEcr
:For (I,1,16)
:output (3,I,"-
:Output (7,I,"-
:End // limites de l'ecran de jeu
:output (2,1,"score:
:While E=1 // continuer le jeu
:Output (2,7,F
:codetouche->T
:If T (> ou =)24 et T (< ou =)26 ou T=34:Output (A,B," "
:If T=24:B+1->B
:If T=25:A-1->A
:If T=26:B-1->B
:If T=34:A+A->A
:min (6,A->A:max (4,A->A
:min (10,B->B:max (1,B->B
:Output (A,B,"X
Ca c'est le début du code identique aux trois versions du programme,
pour la version 1 (avec 1 ennemie a la fois:
Code
:If D=0
:Then
:entaleat(4,6)->C
:15->D
:End
:Output (C,D+1," "
:Output (C,D,"O
:D-1->D
:If C=A et D=B:0->E // si il y a colision, la partie se termine
:F+B->F
:End
sans grand interet vous l'aurez vu, voici ce que j'ai rajouté pour les chaines :
Code
:" "->Chaine1
:" "->Chaine2
:" "->Chaine3
:sous-chaine(Chaine1+"O",2,15)->Chaine1
:sous-chaine(Chaine2+"O",2,15)->Chaine2
:sous-chaine(Chaine3+"O",2,15)->Chaine3
:F+B->F
:End
qui ne marche pas

quand au troisieme code avec la matrice, c'est un vrai desastre, je ne prefere pas en parler

maxence le 27/12/2012 à 00:28
C'est normal.
Tout d'abord si tu veux que ton jeu se déroule sur toute la largeur de l'écran,
Code
il faut que tu mette
sous-chaine(chaine1+"O", 2, 16)->chaine1
et non pas
sous-chaine(chaine1+"O", 2, 15)->chaine1
mais surtout, il faut que tes chaines de base soient composées de 16 espaces et non pas un seul, car tu ne peux pas découper une phrase de 16 caractère à partir d'une phrase de 2 caractères, c'est de la que viens ton erreur, mais désolé, c'est de ma faute j'avais oublier de te le préciser

linkakro le 30/12/2012 à 15:32
Continuez comme ça, cela promet. C'est en effet la première fois que quelqu'un cite cette méthode à ma connaissance sur ce forum.
(j'ai déjà utilisé une chaine mais pas de cette façon)
Cependant cette méthode me semble plus adaptée pour générer plusieurs obstacles par ligne qu'un par ligne comme demandé.
Je propose de stocker une abscisse d'obstacle par ligne, dans une liste ou dans quelques variables numériques. Ainsi il reste à incrémenter ces abscisses pour simuler l'avancée et enfin la collision.
Concernant l'affichage il y a plusieurs solutions/complications.
-Les chaines sont idéales pour l'affichage du déplacement horizontal.
-Les listes sont idéales pour l'affichage du déplacement vertical avec Disp.
-La matrice peut gérer n'importe quoi mais n'apporte pas d'avantage d'affichage.
Quand je dis que l'affichage est idéal, c'est qu'une fonction d'affichage permet de gérer à elle toute seule une ligne entière voire tout l'écran.
Sinon il faut écrire des instruction d'effacement et d'écriture répétées ou dans des boucles.Erdnuss le 05/01/2013 à 19:18
Le
Code
:If T=24:B+1->B
:If T=25:A-1->A
:If T=26:B-1->B
:If T=34:A+A->A ////////////// c est pas plutôt A+1 ???
Peut se remplacer par :
Code
:B+(T=24)-(T=26->B
A-(T=25)+(T=34->A
Ça fonctionne car si T=24, alors (T=24) vaut 1, sinon, 0
Avertissement :Il s'agit d'une page optimisée pour la navigation mobile. Voir la
page originale.