Jeu de casse-brique en emu 8086

Description

Pour le jeu que je propose, c’est un jeu de casse-briques aussi. Vous devez, à l’aide d’une raquette, dirigeable de gauche à droite et de droite à gauche que vous pourrez contrôler à l’aide des touches « W » et « X », orienter une balle qui rebondit depuis la raquette vers les briques présentées sous forme de croix (représentant ainsi des obstacles) en les faisant disparaître jusqu’à la dernière pour remporter la manche. je l'est programmer en EMU 8086 . n'hésitez pas de me laisser des commentaires ou des suggestions et merci!!

Source / Exemple :


ORG 100h

CALL lancement
CALL cadre
CALL briques
CALL raquette

game:
; On se positionne en haut de l'ecran a gauche

MOV BX, 0
MOV CH, 1
MOV CL, 2

MOV AX, 142h        ; 142h = 322d
MOV DX, 142h

;ici rebond1, rebond2, rebond3 ,
; rebond4 sont les 4 directions possibles de la balle apres une collision

rebond1:	CALL deplacement
	MOV BX, AX			; AX represente l'ancienne position
	MOV [00h+BX], 0x0F20h    ;Couleur de fond
	
	MOV BX, DX			; DX represente la position actuelle
	MOV AX, [00H + BX]
	MOV [00H + BX], 0xF020h		;On utilise AX pour stocker temporairement 

	CMP AH, 0x0Bh              ; couleur de l'obstacle balle
	JNZ test_raquette_rebond1
	         ; traitement de l'obstacle

	MOV BX, AX				;la couleur de la case pour effectuer un test ulterieurement
	MOV AX, DX

	CALL score
	
	CMP BL, 0x2Dh			; on teste le symbole present       2D
	JZ rebond2
	JMP rebond4

test_raquette_rebond1: MOV BX, [0A0h+BX]                           ; vers haut gauche
                  MOV AX, DX
                  CMP BL, 58h
                  JZ rebond2 

suite_rebond1:

	ADD DX,0xA2h
	
	INC CL
	INC CH
	
	CMP CL,26
	JGE fin_de_jeu

	CMP CH,79
	JGE rebond4
	
	JMP rebond1
	

	
rebond2:	CALL deplacement
	MOV BX, AX
	MOV [00h+BX], 0x0F20    	;Couleur de fond DE LA balle
	
	MOV BX, DX
	MOV AX, [00H + BX]
	MOV [00H + BX], 0xF020h
	
	CMP AH, 0x0Bh              ; couleur de l'obstacle ??
	JNZ test_raquette_rebond2
	         ; traitement de l'obstacle
	         
	MOV BX, AX
	MOV AX, DX
	
	CALL score
	
	CMP BL, 0x2Dh			;on teste le symbole present 2D= '-'
	JZ rebond1
	JMP rebond3
	
test_raquette_rebond2: MOV BX, [0A0h+BX]                   ; vers haut droite
               MOV AX, DX
               CMP BL, 3Dh                       ; 3Dh destination balle apres collision raquette
               JZ rebond2 
	
suite_rebond2:
	SUB DX,0x9Eh
	
	DEC CL
	INC CH
	
	CMP CL,2
	JLE rebond1

	CMP CH,79
	JGE rebond3
	
	JMP rebond2

rebond3:	CALL deplacement
	MOV BX, AX
	MOV [00h+BX], 0x0F20    	;Couleur de fond
	
	MOV BX, DX
	MOV AX, [00H + BX]
	MOV [00H + BX], 0xF020h     
	
	CMP AH, 0x0Bh              ; couleur de l'obstacle ??
	JNZ test_raquette_rebond3
	         ; traitement de l'obstacle
	
	MOV BX, AX
	MOV AX, DX
	
	CMP BH, 0x0Ah
	JNZ suite_rebond3
	CALL score
	
	CMP BL, 0x2Dh			; on teste le symbole present
	JZ rebond4
	
	JMP rebond2 
	
	test_raquette_rebond3: MOV BX, [0A0h+BX]                   ; vers haut droite
               MOV AX, DX
               CMP BL, 3Dh                       ; 3Dh destination balle apres collision raquette
               JZ rebond4 
	
Suite_rebond3:
	SUB DX,0xA2h
	
	
	DEC CL
	DEC CH
	
	
	CMP CL,2
	JLE rebond4

	CMP CH,1
	JLE rebond2
	
	JMP rebond3
	

rebond4:	CALL deplacement
	MOV BX, AX
	MOV [00h+BX], 0x0F20    	;Couleur de fond
	
	MOV BX, DX
	MOV AX, [00H + BX]
	MOV [00H + BX], 0xF020h 
	
	CMP AH, 0x0Bh              ; couleur de l'obstacle ??
	JNZ test_raquette_rebond4
	         ; traitement de l'obstacle
	
	MOV BX, AX
	MOV AX, DX
	
	CMP BH, 0x0Ah
	JNZ suite_rebond4
	CALL score
	
	
	CMP BL, 0x2Dh			;on teste le symbole present
	JZ rebond3
	JMP rebond1         
	
	test_raquette_rebond4: MOV BX, [0A0h+BX]                   ; vers haut droite
               MOV AX, DX
               CMP BL, 58h                       ; 3Dh destination balle apres collision raquette
               JZ rebond3

	
Suite_rebond4:
	ADD DX,0x9eh
	
	INC CL
	DEC CH
	
	CMP CL,26
	JGE fin_de_jeu

	CMP CH,1
	JLE rebond1
	
	JMP rebond4
	
	
	
fin_de_jeu:

CALL vie

CMP ES:[2], 0       ; compare ES:[2] (nbr de vies) avec 0 si = 0 jump at procedure perdue 
	  
JNZ game 

CALL perdue	           ; appelle procedure perdu

RET   ; FIN DU PROGRAMME PRINCIPAL, ON REND LA MAIN AU DOS

;!!!!!!!!!!!!!!!!!!!!   PROCEDURE LANCEMENT  !!!!!!!!!!!!!!!!!!!!!!!!!

lancement PROC

MOV AX, 0B800h  ; On initialise le registre DS a B800h qui correspond au debut de la memoire video
MOV DS, AX

MOV AX, 02000h  ; On initialise le registre ES a 2000h pour stocker des valeurs necessaires au fonctionnement du jeu
MOV ES, AX 

MOV ES:[0], 0   ; score a 0
MOV ES:[2], 3   ; nombre de point de vie a 3
MOV ES:[4], 50  ; position raquette a l'ecran 50 / 160

MOV [00h], 'S'
MOV [02h], 'c'
MOV [04h], 'o'
MOV [06h], 'r'
MOV [08h], 'e'
MOV [0Ah], ':'
MOV [0Eh], '0'
MOV [10h], '0'
MOV [12h], '0'
MOV [14h], '0'
MOV [16h], '0'

MOV [32h], 'V'
MOV [34h], 'i'
MOV [36h], 'e'
MOV [38h], 's'
MOV [3Ch], ':'
MOV [3Eh], '3'

RET

lancement ENDP

; !!!!!!!!!!!!!!!!!!!!!!!!! PROCEDURE CADRE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

cadre PROC

PUSH AX
PUSH BX 
PUSH CX
PUSH DX

; On trace la partie gauche et droite du cadre

MOV AX, 02h
MOV BX, 00h
MOV CX, 23   ; On a 23 lignes
MOV DX, 0A0h

cadre2:
         MOV [0140h + BX], 0x0F49h
         MOV [01DEh + BX], 0x0F49h	
	     ADD BX, 0A0h
	
         LOOP cadre2  ; Si CX != 0, on reboucle
         
         
         

; On trace le haut du cadre

MOV BX, 00h
MOV CX, 80    ; On a 80 colonnes

cadre1: 
         MOV [0A0h + BX], 0x0F5Fh
         ADD BX, 2

         LOOP cadre1  ; Si CX != 0, on reboucle

POP DX
POP CX
POP BX
POP AX  

RET

cadre ENDP

; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  PROCEDURE BRIQUE  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

briques PROC

PUSH AX
PUSH BX 
PUSH CX
PUSH DX

MOV DX, 0A0h
MOV BX, 00h
MOV AX, 02h
MOV CX, 10

MOV [7D0h + BX], 0x0B2Bh			; Equivaut A MOV [7D0h], '+'(creation symbole milieu)

boucle: 
         ADD BX, AX
         MOV [7D0h + BX], 0x0B2Dh		
         SUB BX, AX
	
         SUB BX, AX
         MOV [7D0h + BX], 0x0B2Dh		; Equivaut à MOV [7D0h], '-' 2D = '-' (symbole brique)
         ADD BX, AX
	
         ADD BX, DX
         MOV [7D0h + BX], 0x0B7Ch		; Equivaut à MOV [7D0h], '|'  7C = '|'(symbole brique)
         SUB BX, DX
	
         SUB BX, DX
         MOV [7D0h + BX], 0x0B7Ch
         ADD BX, DX
	
         ADD AX, 2
         ADD DX, 0A0h

         LOOP boucle  ; Si CX != 0, on reboucle

POP DX
POP CX
POP BX
POP AX  

RET

briques ENDP

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PROCEDURE SCORE   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

score PROC

PUSH AX
PUSH BX 
PUSH CX
PUSH DX

       
INC ES:[0]
          
MOV AX, ES:[0]  

MOV DX, 0  
MOV BX, 10000

DIV BX  

ADD AX, 48 

; affichage de ax

MOV [0Eh], AL

MOV AX, DX
MOV DX, 0 
MOV BX, 1000
 
DIV BX  

ADD AX, 48 

; affichage de ax
MOV [10h], AL

MOV AX, DX
MOV DX, 0 
MOV BX, 100
 
DIV BX  

ADD AX, 48 

; affichage de ax
MOV [12h], AL 

MOV AX, DX
MOV DX, 0 
MOV BX, 10
 
DIV BX  

ADD AX, 48 

; affichage de ax
MOV [14h], AL  

ADD DX, 48

; affichage de ax
MOV [16h], DL

POP DX
POP CX
POP BX
POP AX    

RET            
       
score ENDP

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PROCEDURE VIE  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

vie PROC

PUSH AX
PUSH BX 
PUSH CX
PUSH DX
 
DEC ES:[2]
                       ; decremente le nombre de point de vie
MOV AX, ES:[2]  

ADD AX, 48

; affichage de ax
MOV [3Eh], AL                ; 3CH position de l'affichage des points de vie

POP DX
POP CX
POP BX
POP AX    

RET            

vie ENDP

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PROCEDURE PERDUE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

perdue PROC

PUSH AX
PUSH BX 
PUSH CX
PUSH DX
PUSH DS

; Ecriture de la premiere barre (du haut)

MOV DH, 11
MOV DL, 30
MOV BH, 0
MOV AH, 2
int 10h

MOV AX, SEG msg2
MOV DS, AX
MOV DX, OFFSET msg2
MOV AH, 9
int 21h

; Ecriture du texte

MOV DH, 12
MOV DL, 30
MOV BH, 0
MOV AH, 2
int 10h

MOV AX, SEG msg
MOV DS, AX
MOV DX, OFFSET msg
MOV AH, 9
int 21h

; Ecriture de la seconde barre (du bas)
MOV DH, 13
MOV DL, 30
MOV BH, 0
MOV AH, 2
int 10h

MOV AX, SEG msg1
MOV DS, AX
MOV DX, OFFSET msg1
MOV AH, 9
int 21h
                
                
msg1 db " +-----------------+ $"
msg db " |  Manche Perdue  | $"
msg2 db " +-----------------+ $"

POP DS
POP DX 
POP CX
POP BX 
POP AX

RET

perdue ENDP

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PROCEDURE RAQUETTE  !!!!!!!!!!!!!!!!!!!!!!!

raquette PROC 
    
PUSH AX    
PUSH BX
PUSH CX
PUSH DX
   
MOV BX, ES:[4] ; On recupere la position (la colonne) du centre de la raquette
               ; On ajoute F00h (24eme ligne)pour se trouver sur la derniere ligne

MOV [0EFCh + BX], 'X' ; centre - 4
MOV [0EFEh + BX], 'X' ; centre - 2
MOV [0F00h + BX], 'X' ; centre      +BX pour connaitre la position que le joueur a ajoute
MOV [0F02h + BX], 'X' ; centre + 2
MOV [0F04h + BX], 'X' ; centre + 4  

POP DX
POP CX
POP BX
POP AX

RET 
raquette ENDP

;!!!!!!!!!!!!!!!!!!!!!!!!!!!! PROCEDURE EFFACE RAQUETTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

dropraquette PROC 
    
PUSH AX    
PUSH BX
PUSH CX
PUSH DX
   
MOV BX, ES:[4] ; On recupere la position (la colonne) du centre de la raquette
               ; On ajoute F00h pour se trouver sur la derniere ligne

MOV [0EFCh + BX], ' ' ; centre - 4
MOV [0EFEh + BX], ' ' ; centre - 2
MOV [0F00h + BX], ' ' ; centre 
MOV [0F02h + BX], ' ' ; centre + 2
MOV [0F04h + BX], ' ' ; centre + 4  

POP DX
POP CX
POP BX
POP AX

RET 
dropraquette ENDP

                                            
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PROCEDURE DEPLACEMENT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

deplacement PROC

PUSH AX    
PUSH BX
PUSH CX
PUSH DX
 
MOV DX, 0
MOV AX, 0

MOV AH, 6
MOV DL, 255
int 21h

CMP AL, 119
JZ vers_la_gauche

CMP AL, 120
JZ vers_la_droite

JMP fin

vers_la_gauche:
CMP B.ES:[4], 4
JLE fin
CALL dropraquette 
SUB B.ES:[4], 2
JMP suite

vers_la_droite:
CMP B.ES:[4], 160
JZ fin
CALL dropraquette
ADD B.ES:[4], 2         ; ES:[4] POSITION RAQUETTE
JMP suite

suite:	
 CALL raquette

fin:
POP DX
POP CX
POP BX
POP AX

RET 
deplacement ENDP

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (abdelmalek12)