bonjour a vous tous
voila je suis débutant en asm, et je doi coder un jeu de combat naval, dont voici les règles :
-le champ de mouillage est de 10 sur 10 en mode video 80*25
-je dois placer trois navires de manière séquentielle, un de 5 case, un de 3, un de 1 seule, soit horizontalement ou verticalement,on cliquant dans le champ de mouillage.
mon problème, c'est que je n'arrive pas a coder , de manière a afficher un navire la ou je clic.
voici mon code source (dsl de la longueur... )
le problème se situe tout a la fin, je l'ai indiqué en commentaire
.model small
.stack 100h
.386
;-------------------------------------------------------------------------
;- LMI3 -
;- Combat naval -
;-------------------------------------------------------------------------
.data
;-------------------------------------------------------------------------
;- Donn,es -
;-------------------------------------------------------------------------
colonne db ? ; variable pour repr,senter les colonnes de pixels
ligne db ? ; variable pour repr,senter les lignes de pixels
carac db ? ; variable pour les caract¦res
couleur db ? ; variable pour la couleur des caract¦res
s db 'S$' ; champ pour les navires
nav db 'Navires$' ; champ 'navire'
pos db 'Position$' ; champ 'position'
vh db 'VH$' ; champ 'vertical' ou 'horizontal'
quitter db 'Quitter$'
suivant db 'Suivant$'
zmess db 'Zone de message$'
malpos db 'Mal positionn,$'
bienpos db 'Bien positionn,$'
.code
;-------------------------------------------------------------------------
;- D,but de la proc,dure -
;-------------------------------------------------------------------------
main proc
MOV AX,@data
MOV DS,AX
; Appels d'interuptions
; ---------------------
CALL video ; apel du mode video 80*25
; Zone de Mouillage
; *****************
; Affichage des coins j'affiche d'abords les coins vide du champ de mouillage
; -------------------
; Coin sup,rieur gauche vide
MOV couleur,01000001b ; pixel rouge sur fond vide
MOV colonne,30 ; je place mon champ de mouillage a la colonne 30
MOV ligne,0 ; je place mon champ de mouillage a la ligne 0
MOV carac,0 ; 0, pour qu'il n'affiche rien
CALL position ; on apelle la proc,dure de positionnement
CALL caractere
; Coin inf,rieur gauche
MOV colonne,30
MOV ligne,11
MOV carac,0
CALL position
CALL caractere
; Coin sup,rieur droit
MOV colonne,41
MOV ligne,0
MOV carac,0
CALL position
CALL caractere
; Coin inf,rieur droit
MOV colonne,41
MOV ligne,11
MOV carac,0
CALL position
CALL caractere
; Affichage des lignes de caract¦res
; ----------------------------------
; Ligne sup,rieure
; j'afiche la ligne indiquant les chiffres 0 1 2 etc.
MOV colonne,31
MOV ligne,0
MOV carac,48
MOV CX,10 ; CX est le "compteur", il d,cr,mente jusqu'a 10
lignesup: ; label pour ma boucle
CALL position
CALL caractere
ADD colonne,1 ; j'avance d'une colonne lors de la boucle
ADD carac,1 ; j'avance d'une ligne lors de la boucle
LOOP lignesup
; Ligne inf,rieure
; affiche la ligne inf,rieure du champ de mouillage
MOV colonne,31
MOV ligne,11
MOV carac,48
MOV CX,10
ligneinf: ; label de ma boucle
CALL position
CALL caractere
ADD colonne,1
ADD carac,1
LOOP ligneinf
; Ligne de gauche
; affiche la ligne sur les cot,s du champ de mouillage A B C
MOV colonne,30
MOV ligne,1
MOV carac,65
MOV CX,10
ligneg: ; label de ma boucle
CALL position
CALL caractere
ADD ligne,1
ADD carac,1
LOOP ligneg
; Ligne de droite
MOV colonne,41
MOV ligne,1
MOV carac,65
MOV CX,10
ligned: ; label de la boucle
CALL position
CALL caractere
ADD ligne,1
ADD carac,1
LOOP ligned
; Champs ; code pour l'affichage des diff,rents champs
; ******
; Champ S
; -------
MOV colonne,25
MOV ligne,13
MOV carac,178
CALL position ; procedure afin de positionner la premi¦re case du champ
MOV DX,offset s ; S = adresse de la chaine
CALL affichage ; apel de la proc,dure d'affichage
ADD ligne,1 ; on descend d'une ligne
MOV CX,3 ; . trois reprises
boucles: ; label de la boucle
CALL position
CALL caractere
ADD ligne,2
LOOP boucles
; Champ Navires
; ------------
; Navire 5 affiche le navire . 5 cases
MOV couleur,01001010b
MOV colonne,30
MOV ligne,13
MOV carac,178
CALL position
MOV DX,offset nav ; nav = adresse de la chaine
CALL affichage
ADD ligne,1
MOV CX,5 ; r,pition . 5
bouclenav5: ; label de la boucle
CALL position
CALL caractere
ADD colonne,1 ; augmente d'une colonne a chaque passage dans la boucle
LOOP bouclenav5
; Navire 3
MOV couleur,01001001b
MOV colonne,30
ADD ligne,2
MOV CX,3
bouclenav3:
CALL position
CALL caractere
ADD colonne,1
LOOP bouclenav3
; Navire 1
MOV couleur,01001100b
MOV colonne,30
ADD ligne,2
CALL position
CALL caractere
; Champ Position
; -------------
MOV colonne,42
MOV ligne,13
CALL position
MOV DX,offset pos
CALL affichage
; Champ VH
; --------
MOV colonne, 25
MOV ligne,20
CALL position
MOV DX,offset vh
CALL affichage
ADD ligne,1
MOV CX,2
bouclevh:
CALL position
CALL caractere
ADD colonne,1
LOOP bouclevh
; Champ Quitter
; -------------
MOV colonne,35
CALL position
CALL caractere
ADD colonne,2
CALL position
MOV DX,offset quitter
CALL affichage
; Champ Suivant
; -------------
MOV colonne,45
CALL position
CALL caractere
ADD colonne,2
CALL position
MOV DX,offset suivant
CALL affichage
; Zone de message
; ---------------
MOV carac,0
MOV couleur,01111000b
MOV colonne,1
MOV ligne,22
CALL position
MOV DX,offset zmess
CALL affichage
ADD ligne,1
MOV CX,60
bouclemess:
CALL position
CALL caractere
ADD colonne,1
LOOP bouclemess
;=========================================================================
MOV colonne,1
MOV ligne,23
CALL position
; Initialisation de la souris
CALL init_souris
; Afficher le curseur de la souris
CALL aff_curseur
; Clic de la souris
; -----------------
@@debut: CALL clic ; comparaison avec la case suivant et quitter
cmp dx,20
jne @@suivant
cmp cx,35
jne @@suivant
call quiter
@@suivant:
cmp dx,20
jne @@debut
cmp cx,45
jne @@debut
@@clicH: CALL clic ; comparaison avec la case H ou V
cmp dx,20
jne @@clicV
cmp cx,25
jne @@clicV
; call horizontalenav5
@@clicV:
cmp dx,20
jne @@clicH
cmp dx,26
jne @@clicH
; call verticalenav5
;--------------------------------------------------------------------------
;- Fin de la proc,dure -
;--------------------------------------------------------------------------
MOV AX,4C00h
INT 21h
main endp
;--------------------------------------------------------------------------
;- Proc,dures secondaires -
;--------------------------------------------------------------------------
video proc
pusha
MOV AH,00h
MOV AL,03h
INT 10h
popa
ret
video endp
position proc
pusha
MOV DL,colonne
MOV DH,ligne
MOV AL,00h
MOV AH,02h
INT 10h
popa
ret
position endp
caractere proc
pusha
MOV CX,1
MOV BH,0
MOV BL,couleur
MOV AL,carac
MOV AH,09h
INT 10h
popa
ret
caractere endp
clavier proc
pusha
MOV AH,00h
INT 16h
popa
ret
clavier endp
affichage proc
pusha
MOV AH,09h
MOV AL,00h
INT 21h
popa
ret
affichage endp
init_souris proc
pusha
MOV AH,00h
MOV AL,00h
INT 33h
popa
ret
init_souris endp
aff_curseur proc
pusha
MOV AH,00h
MOV AL,01h
INT 33h
popa
ret
aff_curseur endp
clic proc
pusha
@@rebond:
mov ax,3
int 33h
cmp bx,0
jne @@rebond
@@attend:
int 33h
cmp bx,0
je @@attend
cmp bx,1
je @@fin
@@fin:
shr cx,3
shr dx,3
popa
ret
clic endp
quiter proc
pusha
mov ax,4c00h
int 21h
popa
ret
quiter endp
horizontalenav5 proc
si on clic sur H, afficher un navire de 5 case horizontalement la ou je clic sans le champ de mouillage
pusha
mov couleur,01001010b
call clic
call position
mov cx,5
bouclenavi5:
call position
add colonne,1
loop bouclenavi5
popa
ret
horizontalenav5 endp
verticalenav5 proc
si on clic sur V, afficher un navire de 5 case verticalement la ou je clic
pusha
mov couleur,01001010b
call clic
mov colonne,dx ; prob
mov ligne,cx ; prob
call position
mov cx,5
bouclenavire5:
call position
add ligne,1
loop bouclenavire5
popa
ret
verticalenav5 endp
end main