Posté le 17/07/2011 à 22:46 Membre depuis le 25/03/2011, 207 messages
Bonjour/bonsoir,
je suis en train d'essayer de faire un snake en ASM pour ion, le déplacement fonctionne ainsi que le "game over" quant on sort, mais la queu ne s'efface pas malgrès un code qui selon moi devrait le faire (j'ai l'impression que le point effacé est le symétrique du bon point par raport au centre de l'écran mais je ne suis pas sur.

Voici le code:
	.nolist 
#include "ion.inc" 

#define	var_b	saferam1
#define	var_c	var_b+1
#define	longueur_listes	var_c+1
#define	pointeur	longueur_listes+1
	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "PTDEPLAC",0 
 
start: 
	ld	a,45
	ld	(var_b),a
	ld	a,30
	ld	(var_c),a	
	ld	e,251

	ld	a,8
	ld	(longueur_listes),a
	ld	a,7
	ld	(pointeur),a

	ld	hl,listeX
	ld	(hl),38
	inc	hl
	ld	(hl),39
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),41
	inc	hl
	ld	(hl),42
	inc	hl
	ld	(hl),43
	inc	hl
	ld	(hl),44
	inc	hl
	ld	(hl),45

	ld	hl,listeY
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl

boucle:
	ld	a,(var_b)
	cp	1
	jp	z,gameover
	cp	94
	jp	z,gameover
	ld	b,a
	ld	a,(var_c)
	cp	1
	jp	z,gameover
	cp	62
	jp	z,gameover
	ld	c,a
	ld	d,1
	bcall _ipoint



	ld	a,(pointeur);;;;;;;;;;;;;;;;;;;;;;;;;;; début du bout de code sensé effacer le bout de la queu                    
	inc	a
	ld	c,a
	ld	a,(longueur_listes)
	cp	c
	call	z,pointeur_dehors
	ld	a,c
	ld	(pointeur),a
	

	ld	hl,listeX
	ld	b,0
	ld	c,a
	add	hl,bc
	ld	a,(hl)
	ld	d,a

	ld	hl,listeY
	ld	a,(pointeur)
	ld	b,0
	ld	c,a
	add	hl,bc
	ld	a,(hl)
	ld	c,a

	ld	b,d
	ld	d,0


	bcall _ipoint;;;;;;;;;;;;;;;;;;;;;;;;;;;;fin du code sensé effacer le bout de la queu


	ld	hl,listeX
	ld	b,0
	add	hl,bc
	ld	a,(var_b)
	ld	(hl),a

	ld	hl,listeY
	ld	b,0
	add	hl,bc
	ld	a,(var_c)
	ld	(hl),a




	ld	a,$FF 
	out	(1),a
	ld	a,$FE
	out	(1),a
	in	a,(1)

	ld	h,10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ici c'est la vitesse
	call	ralentir
nonfleche:


	cp	254
	jp	z,haut
	cp	253  
	jp	z,gauche
	cp	251
	jp	z,droite
	cp	247
	jp	z,bas

	ld	a,e
	jp	nonfleche

	jp	boucle

gauche:
	ld	a,251
	cp	e
	jp	z,droite

	ld	hl,var_b
	ld	e,253
	dec	(hl)
	jp	boucle
droite:
	ld	a,253
	cp	e
	jp	z,gauche

	ld	hl,var_b
	ld	e,251
	inc	(hl)
	jp	boucle
haut:
	ld	a,247
	cp	e
	jp	z,bas

	ld	hl,var_c
	ld	e,254
	dec	(hl)
	jp	boucle
bas:
	ld	a,254
	cp	e
	jp	z,haut

	ld	hl,var_c
	ld	e,247
	inc	(hl)
	jp	boucle

ralentir:
	dec	h
	ei
	halt
	di
	jp	nz,ralentir
	ret

pointeur_dehors:
	ld	c,0
	ret

gameover:
	bcall _getkey
	ret

listeX:
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

listeY:
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

.end


Merci d'avance
Sandro

PS : le snake utilise la technique du pointeur sur une chaîne dont seule une valeur varie à chaque tour de boucle; le code est sensé suprimer le bout de la queu avant que la suite du programme atribue cet emplacement à la tête.
Posté le 18/07/2011 à 22:28 Membre depuis le 15/03/2005, 3470 messages
C'est assez dur de s'y retrouver sans commentaires...

N'y a-t-il pas moyen de s'en sortir avec les seules positions de la tête et de la queue du serpent ?
Posté le 19/07/2011 à 17:55 Membre depuis le 25/03/2011, 207 messages
Non, à moins de créer à la place une liste des dirrections au lieu des coordonnées, mais ça complique je croi plus qu'autre chose.

Par contre, en essayant de résoudre le problème, j'ai commencé un nouveau code qui est bien plus clair (par contre, pour l'instant, il faut appuyer en permanance sur la bonne flèche) :
	.nolist 
#include "ion.inc"

#define	pointeur	saferam1
#define	longueur	pointeur+1
#define	tempX	longueur+1
#define	tempY	tempX+1

	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "SNAKE",0 
start: 

;  initialisation des var temp
	ld	a,40
	ld	(tempX),a
	ld	a,30
	ld	(tempY),a


;  initialisation de liste X
	ld	hl,listeX
	ld	(hl),40
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),40
	inc	hl
	ld	(hl),40

;  initialisation de listeY
	ld	hl,listeX
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30
	inc	hl
	ld	(hl),30


boucle:

;  incrémentation du pointeur
	ld	a,(longueur)
	ld	b,a
	ld	a,(pointeur)
	cp	b
	call	z,pointeur_max
	inc	a	
	ld	(pointeur),a


;  récupération des coordonnées du point à effacer	: X
	ld	hl,listeX
	ld	a,(pointeur)
	ld	d,0
	ld	e,a
	add	hl,de
	ld	b,(hl)
;  ecrasement de l'ancien X par le nouveau
	ld	a,(tempX)
	ld	(hl),a


;  récupération des coordonnées du point à effacer	: Y
	ld	hl,listeY
	ld	a,(pointeur)
	ld	d,0
	ld	e,a
	add	hl,de
	ld	c,(hl)
;  ecrasement de l'ancien Y par le nouveau
	ld	a,(tempY)
	ld	(hl),a




;  effacement de la queue
	ld	d,0
	bcall _ipoint




;  récupération des coordonnées du point à afficher	: X
	ld	hl,listeX
	ld	a,(pointeur)
	ld	d,0
	ld	e,a
	add	hl,de
	ld	b,(hl)

;  récupération des coordonnées du point à afficher	: Y
	ld	hl,listeY
	ld	a,(pointeur)
	ld	d,0
	ld	e,a
	add	hl,de
	ld	c,(hl)

;  affichage de la tête
	ld	d,1
	bcall _ipoint

;  déplacement
	bcall _getkey
	cp	2
	call	z,gauche
	cp	1
	call	z,droite
	cp	3
	call	z,haut
	cp	4
	call	z,bas
	
	cp	9
	jp	nz,boucle


	ret





gauche:
	ld	hl,tempX
	dec	(hl)
	ret

droite:
	ld	hl,tempX
	inc	(hl)
	ret

haut:
	ld	hl,tempY
	inc	(hl)
	ret

bas:
	ld	hl,tempY
	dec	(hl)
	ret



pointeur_max:
	ld	a,0
	dec	a
	ret

listeX:
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
listeY
	.db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

.end 


Ce snake, utilise de nouveau la technique du pointeur.


Merci d'avance
Sandro
Posté le 19/07/2011 à 18:01 Membre depuis le 02/02/2009, 672 messages
Salut,

Pourquoi faire :
;  initialisation de liste X 
	ld	hl,listeX 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
	inc	hl 
	ld	(hl),40 
 
;  initialisation de listeY 
	ld	hl,listeX 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 
	inc	hl 
	ld	(hl),30 


Lorsqu'on peut faire :
listeX: 
         .db 40, 40, 40, 40, 40, 40, 40, 40, 40


Si tu ne fais qu'initialiser je trouve que c'est franchement lourd comme méthode.

Posté le 19/07/2011 à 19:31 Membre depuis le 15/03/2005, 3470 messages
J'ai pas trop le temps de regarder mais comme dit Contra c'est optimisable avec deux listes (une constante et l'autre qui change en jouant je suppose). À chaque démarrage il suffit de recopier l'une dans l'autre avec ldir : http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson18.html#ldi
Posté le 19/07/2011 à 19:46 Membre depuis le 25/03/2011, 207 messages
Merci, je ne connaissait pas encorre cette commande.
Posté le 22/07/2011 à 20:33 Membre depuis le 03/06/2011, 520 messages
As-tu fait du progrès ? Je n'ai pas encore eu du temps pour regarder ton code, peut-être ce week-end.

Mais si tu veux utiliser ldir, je crois que c'est mieux comme ci:
	ld	hl,listeX  
	ld	(hl),40  
	ld	de,listeX+1
	ld	bc,MAX_NUM_COORDS-1

Ah, et dans ton code tu as mis:
ld hl,listeX
ld (hl),40
...
; initialisation de listeY
ld hl,listeX ;pas listeY
ld (hl),30
Posté le 02/08/2011 à 18:10 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup, pour la progression, il n'y en a pas eut vue que je n'ai pas pu utilider internet depuis 2 semaines à cause de traveaux sur la ligne.

Sandro
Posté le 03/08/2011 à 18:21 Membre depuis le 03/06/2011, 520 messages
Je me demandais où tu étais smile Tu as donc internet de nouveau ?
Posté le 04/08/2011 à 11:23 Membre depuis le 25/03/2011, 207 messages
Oui