Bonjour! Je programme un serpent sur ti 83+ avec l'écran graphique, j'utilise les point carrés (3*3 pixels, avec un pixel éteint au milieu) et j'ajoute : vertical 0 ; vertical 94 ; horizontal 0 ; horizontal 62.
Comment faire pour dire que, dès que le serpent touche un pixel allumé, la partie s'arrête?
J'ai une Dliste constituée de 1 et de 0. Cependant je voudrais différencier les listes {0 0 1 1}et {0 1 0 1} qui ont le même nombre de 0. Mais dans le premier cas la liste d'origine avait 3 nombres identiques consécutifs alors que dans le 2ème cas il y avait 2 * 2 nombres identiques. Mais je n'arrive pas à trouver un algorithme permettant de différencier ces 2 cas car je n'arrive pas à compter le nombre de 0 consécutifs dans la DListe.
Salut,
m@thieu41 : sujet déjà résolu ici. Ton code (en plus d'être plutôt tiré par les cheveux ) n'est pas très fiable (ni adaptable) : il ne permet par exemple pas de différencier {0,0,1,1} de {0,1,1,1}, {1,1,1,1}, {0,0,0,1} ou encore de {0,0,0,0} (en fait, de n'importe quelle liste déjà triée par ordre croissant). Et dans le else, on ne sait pas si on est dans le cas {0,1,0,1} ou bien {0,1,1,0} ou n'importe quelle liste non triée.
En fait, j'avais compris qu'il n'y avait que 2 cas à gérer
Par contre, du coup, tu peux réduire le code "If sum(L1={0,0,1,1})=4" en "If prod(L1={0,0,1,1" (je ne sais pas si c'est plus rapide, mais ça peut faire économiser de la place.
Ben il le dit juste au dessus de ton message... Effectivement, bien vu, le prod est plus court, mais je ne ne sais pas non plus si il y en a un qui est plus rapide qu'un autre. De toute façon, pour une telle longueur de liste, ça ne doit pas changer grand chose.
p162 de ce forum, j'ai demandé comment changer les dimensions d'une matrice sous Ti89. Melepe m'a proposé des solutions alternatives qui m'ont bien aidées, mais nous n'avons pas trouvé comment changer les dimensions d'une matrice. Après de loooooongues recherches, j'ai trouvé comment: il faut utiliser la fonction:
augmente(matrice,[[y][x]])->matrice
Voilà, petite astuce
S SI -> 1° année -> Je passe en 2° année d'IUT Info !
Petite question: Y a-t-il un moyen de vérifier si une touche est maintenu sous Ti-89 ?
Je m'explique: avec la fonction codtouch/getkey, on peut vérifier l'appui sur une touche. Mais si l'utilisateur ne relache pas la touche et que l'on redemande si la touche est maintenu la réponse est négative. Je n'ai pas trouvé de moyen de contourner ce problème, même en passant les cours de physique à chercher...
Help me, please
S SI -> 1° année -> Je passe en 2° année d'IUT Info !
Par contre j'ai un code en hexadécimal(que tu peux facilement introduire dans un programme axe avec " Asm( " ) qui stocke l'espace libre restant de la RAM dans la variable "A" de la calculatrice, mais pas dans la variable "A" de l'axe attention:
Ton code fonctionne très bien, par contre je n'arrive pas afficher la valeur en Axe. La variable A (du Ti-OS) est bien modifiée (même si la valeur semble approximative mais ça me suffira) mais le code du tuto pour afficher une vraie variable ne fonctionne pas :
Là pour l'erreur, je pourrai pas vraiment te répondre.
Pour la valeur approximative c'est normal, car quand tu exécutes ton programme , celui-ci n'est plus dans la RAM, et du coup ça affiche un peu moins que la réalité, je crois.
Sinon on pourrait peut-être trifouiller un peu le code hexa pour que la valeur soit enregistrée dans le registre hl (je sais pas si tu fais de l'assembler), et après on pourrait facilement récupérer la valeur en axe sans la variable du tiOS.
J'ai un problème avec les sprites en Grammer...voilà mon code :
:.0:
:ClrDraw
:3C42A581A599423C->Str1 // Un smiley qui sourie, stocké dans la Chaine1
:Tile(08,Str1,31,5,,,
:DispGraph
:Pause 100
:Stop
Bon voilà, l'intérêt est simplement d'afficher un sprite au centre de l'écran (c'est un bon petit début ^^'). Problème : il affiche bien un sprite, mais pas celui que j'avais codé. Après j’ai tout essayé : enlever les virgules à la fin de "Tile(", enlevé et déplacé le "8" (qui permet d'indiquer que le sprite est codé en hexa), écrit le sprite directement dans "Tile("....rien à faire, ça change pas grand chose
Ton code fonctionne très bien, par contre je n'arrive pas afficher la valeur en Axe. La variable A (du Ti-OS) est bien modifiée (même si la valeur semble approximative mais ça me suffira) mais le code du tuto pour afficher une vraie variable ne fonctionne pas :
Provoque une erreur ERR:INVALID DIM. J'ai rarement vu ça en Axe...
- Edité par mogolecho le 19 août 2013 à 13:40:08
Lol, tu es en train de récupérer la valeur de la variable A de l'OS, ce qui n'a strictement rien à voir avec le registre A.
Il faut donc ajouter au code asm :
B_CALL _SetXXOP1
B_CALL _StoX
Soit en hexadécimal :
EF8C47EFD14A
(Code non testé) Le nombre voulu devrait être dans la variable X TI-OS.
EDIT : Ou sinon :
LD L,A
LD H,0
Soit en hexadécimal : 6F2600. Le résultat est donc dans HL.
****Fant0me**** a écrit:
Bonjour!
J'ai un problème avec les sprites en Grammer...voilà mon code :
:.0:
:ClrDraw
:3C42A581A599423C->Str1 // Un smiley qui sourie, stocké dans la Chaine1
:Tile(08,Str1,31,5,,,
:DispGraph
:Pause 100
:Stop
Bon voilà, l'intérêt est simplement d'afficher un sprite au centre de l'écran (c'est un bon petit début ^^'). Problème : il affiche bien un sprite, mais pas celui que j'avais codé. Après j’ai tout essayé : enlever les virgules à la fin de "Tile(", enlevé et déplacé le "8" (qui permet d'indiquer que le sprite est codé en hexa), écrit le sprite directement dans "Tile("....rien à faire, ça change pas grand chose
Lol, tu es en train de récupérer la valeur de la variable A de l'OS, ce qui n'a strictement rien à voir avec le registre A.
La valeur de la RAM n'est pas enregistrée dans le registre A attention, mais bien dans la variable A du ti OS. Si tu veux, teste le programme!
Ce qu'il faudrait, au contraire, c'est supprimer la partie du code qui enregistre la valeur dans la variable A du ti OS et enregistrer cette valeur dans le registre hl.
Ensuite il suffirait juste de faire en axe:
:Asm(code hexa)→A
Et la valeur serait alors enregistrée dans la variable A de l'axe.
EDIT:
Ton edit n'est pas non plus vraiment la solution car tu récupère ta valeur à partir du registre A et la valeur recherchée n'est pas enregistrée dans ce registre.
Merci de vos réponses Alors, NorbertD, quelle serait la partie hexadécimale à enlever quand tu parles de "la partie du code qui enregistre la valeur dans la variable A du ti OS" ?
En fait, le code que NobertD a donné convertit déjà de HL vers OP2 pour ensuite mettre dans la variable TI-OS A. Donc plutôt que de faire un code immensément longuement inutile, je propose d'utiliser ce qui suit :
EFE542 (B_CALL _MemChk)
Stocke la mémoire RAM restante dans HL. Par exemple, le code assembleur suivant l'affiche :
Ma sœur rencontre un problème avec sa vieille Ti-83 (juste récupérée, c'est une occasion). Les touches CLEAR et VARS ne fonctionnent plus (même en appuyant comme un bourrin). J'ai démonté toute la calculatrice afin d'accéder à la carte mère côté clavier, pour constater que ça ne sont pas des boutons poussoirs mais des capteurs de pression électroniques, imprimés sur la carte, derrière un support en plastique qui donne l'effet de pression. Ces résistances ne me semblent pas abîmées, le circuit l'air en bon état. J'ai tout remonté, toujours le même problème. Savez-vous s'il y a quelque chose à faire pour réparer ces deux touches tout de même bien pratiques ?
Moi j'ai démonté une fois ma ti-89 mais à mon avis ce serait le même système sur tout les ti.
En tout cas sur la mienne le truc est qu'il y a deux courants qui passent à côté sans se toucher et en activant le bouton on les met en contact et le signal passe. (Tu peux le vérifier en touchant les deux courants avec quelquechose qui conduit et regarer s'il y a quelquechose qui se passe.). A mon avis c'est le truc qui met les deux courants en contact qui est abimé. Si tu a le même système alors redémonte la calto (Attention de ne pas perdre de boutons, j'ai de la mauvaise expérience.....) et colle un bout de papier alu sur la partie qui devrait connecter les deux courants.
Bonjour ! J'ai pour projet de faire un jeu de type shut em up sur calculatrice je fait des etape dans le programme et je ne me suis pas encore interressé au graphisme j'ai un vaissaux constitué d'un O et d'un + il tir avec la touche 5 quand le tir (-) arrive au meme coordonnée X que l'obstacle (O) on gagne, le mouvement n'est que horizontale le "vaisseau" est sur la meme ligne que l'ennemi (O), le tir part normalement quand j'appui sur la touche 5 mais une fois sur deux il traverse l'ennemi sans afficher "you win" voici le code de la boucle principale:
:clrhome
:0->K
:0->L
:0->V
:While 1 \\debut de la boucle du jeu
:output(4,14-F,"O") \\affichage de l'ennemis qui se deplace de la doite vers la gauche
:output(4,15-F," ") \\(F s'incremente a chaque tour de boucle)
:getkey->g
:if G !=0 : g->K
:If K=83:Goto 1 \\si la touche 5 est pressée aller a l'etiquette 1
:Goto B
:lbl 1 \\ etiquette du tir
:output(4, 4+V,"-")\\ tir par de la case 4 et se deplace de la gauche vers la droite
:output(4, 3+V," ")
: lbl B
:if 4+V=14-F:goto A0 \\ si la coordonnée du tir est la meme que celle de l'ennemis aller a l'etiquette A0 vous avez gagne
:if 14-F=2: Goto 0 \\ si la coordonnée X du tir est la meme que celle du vaisseau aller a l'etiquette 0 vous avez perdu
:F+1->F
:if K=83: 1+V->V \\ si la touche 5 est pressée la variable V commence a s'incrementer
L'association Goto/Lbl est à bannir si tu veux éviter que ton jeu lague (même si ici ça ne dérange pas trop, ce n'est pas très judicieux): http://tout82.free.fr/forum/sujet.php?sujet=2757
Ton code est étrange: si on appuye sur une autre touche que 5 le missile s'arrête (il faudrait utiliser une variable qui sauvegarde si on a déjà appuyé sur 5, et donc si un missile est envoyé).
De plus on a pas de vaisseau?
Et c'est normal que des fois tu ne puisse pas gagner: si le missile est en case 7 et l'ennemi en case 8, au tour suivant le missile sera en case 8 et l'ennemi en case 7, donc jamais à la même case. Il faut donc tester si les 2 sont à la même case ou si le missile est une case après l'ennemi.
Voici le code corrigé d'après ce que je t'ai dit:
:clrhome
:0->K
:0->L //Puisque tu n'utilise pas cette variable je m'en sert pour savoir si le tir est parti
:0->V
:0->F
:Repeat 14-F=2 or L and (4+V=14-F or 3+V=14-F \\debut de la boucle du jeu //Les boucle infinies sont à éviter si tu peux faire autrement // Tant qu'on a pas perdu (14-F=2) peut aussi s'écrire F=12 // Tant qu'on a pas gagne (L and (4+V=14-F or 3+V=14-F)) peut aussi s'écrire: L(V=10-F or V=11-F
:output(4,14-F,"O \\affichage de l’ennemi qui se déplace de la droite vers la gauche //Fermetures de guillemets/parenthèses facultatives en fin de ligne
:output(4,15-F," \\(F s’incrémente a chaque tour de boucle)
:getkey->K
:If K=83
:1->L //Le tir part
:If L //Équivaut à If L!=0 // Si le tir est parti
:Then
:V+1->V //Le tir se déplace
:output(4,4+V,"-\\ tir par de la case 4 et se déplace de la gauche vers la droite
:output(4, 3+V,"
:End
:F+1->F // L'ennemi se déplace
:End //Fin de la boucle principale
:If 14-F=2 //Si on a perdu // Ca revient à tester If F=12
:Then
:Pause "VOUS AVEZ PERDU
:Else
:Pause "ENNEMI DETRUIT
:End
je n'ai pas testé mais ça devrait marcher comme ça
Continue comme ça.
Si tu as d'autres questions n'hésites pas.
PS: Tu n'as pas précisé ton modèle, mais si tu as une TI 82/82stats/82stats.fr/83 je te conseille ce forum: http://tout82.forumactif.org/forum
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
je crois que c'est un truc dans ce genre....