ceci est l'etude (tres simpliste ) de la propagation de bactérie dans un milieu fermé
Projet ESI , Asm n°2
un chti clin d'oeuil a notre ami Bardack =D
Source / Exemple :
.model small
.stack 100h
.486
jumps
locals
extrn random : proc
extrn InitRnd : proc
;==========================================
; donne
;==========================================
.data
asci db 47 ;va etre utilisé pour le compteur de mort ;)-->la faucheuse [init='0']
asci2 db 48 ;deuxieme chiffre du compteur
proximite DW 0 ;Nombre de Micro orga qui sont suceptibles d entourer un congenère
handle dw ? ;Handle utiliser pour la manipulation de fichier
cinq dw 5 ; |
deux dw 2 ; |-> variables utilisées pour les divisions
trente dw 30 ; |
posx dw ? ; Coordonnée en abscisse
posy dw ? ; Coordonnée en Ordonnée
superpose DW 0 ; Boolean , declarant si il y a supperposition ou non
efface dw 0 ;boolean reglant la couleur 1=colorie en noir :)
reproduction dw 0 ;boolean reglant le check reproduction
entoure dw ? ; Boolean , renvoir 0-> pas entouré , 1-> entouré
saverandom dw ? ;Sauvegarde du retours AX (random)
saveEnergie dw ? ;Sauvegarde des Energie , posx , posy
saveposx dw ? ;Sauvegarde de la coordonne en X
saveposy dw ? ;Sauvegarde de la coordonne en Y
cpt dw ? ; compteur
nb_morga dw 30 ;nombre de micro orga initials
nb_Morgarestant dw 30 ;id nb_Morga mais utiliser pour le test de superposition
nb_nouriture dw 576 ; nombre initial de nouriture
tab_orga dw (13000) dup (0) ;tab contenant les infos sur les morga initialisé a zero
lenght_tabOrga dw $-tab_orga ;Longueur du vecteur
tab_nouriture dw (120*40) dup (0) ; tableau contanant les coordonnées de nouritures initialisé a zero
lenght_tabNouriture dw $-tab_nouriture ;Longueur du vecteur
fichier db 'Organismes.txt',0 ; Nom du fichier qui va recevoir les info des Morga
;*******Variables de TXT *********
enplus db " enfant ok$"
mort db " Morts :'($"
titre2 db 'Legende................',10,13
db 'Rouge = Micro-Organisme ...',10,13
db 'Vert = Nouriture .........',10,13,'$'
Intro db ' ',10,13
db ' ',10,13
db ' ',10,13
db ' ********** ************ ****** ****** ************',10,13
db ' *** *** **** ******* ******* ****',10,13
db ' *** *** **** *************** ****',10,13
db ' ********** ************ ***** ***** ************',10,13
db ' ********** ************ ***** ***** ************',10,13
db ' *** *** **** ***** ***** **** ',10,13
db ' *** *** **** ***** ***** **** ',10,13
db ' *** *** ************ ***** ***** ************',10,13
db ' ',10,13
db ' ',10,13
db ' ',10,13
db ' Auteur : Digital snake ',10,13
db ' ------ | ',10,13
db ' | Prof : PBT ',10,13
db ' | Version : 26/03/03 ',10,13
db ' ',10,13
db ' ',10,13
db ' -> Etude de la vie de MicroBacteries <- ',10,13
db ' ',10,13
db ' ',10,13
db ' ',10,13
db ' ',10,13
db ' ',10,13
db ' [Pour quitter appuyer sur la touche Q] ',10,13
db ' ',10,13
db ' ',10,13
db ' ',10,13,'$'
;==========================================
; code
;==========================================
.code
main proc
mov ax,@data
mov ds,ax
;================================ repete 1 foi =================================
call mode_graphique ;on appel le mode video 640*480 ;*
;---------------------- ;*
mov dx,offset Intro ;Affiche l intro a l'ecran ;*
CALL ecrit ;*
CALL clavier ;attente d'une touche au clavier pour commancer ;*
;---------------------- ;*
call mode_graphique ;on appel le mode video 640*480 ;*
call damier ;affichage de la zone de vie des Micro orga ;*
;---------------------- ;*
mov posx,40 ;compteur du nombre de mort ;*
mov posy,27 ;*
CALL curseur ;*
CALL char ;*
call titrelegende ;======================================== ;*
;---------------------- ; ==initialisation tableau micro orga == ;*
;======================================== ;*
mov bx,0 ; donne le morga de départ bx=indice du tab_orga ;*
mov cx,nb_morga ;*
;*
@@bouclecoordonneemorga: ;*
push cx ;*
call donnecoordonneeimorga ;*
add bx,2 ; passe au morga suivant ;*
pop cx ;*
loop @@bouclecoordonneemorga ;*
;========================================= ;*
;---------------------- ; == initialisation tableau micro orga == ;*
;========================================= ;*
mov bx,0 ;indice de départ ;*
mov cx,nb_nouriture ;traitement des 150 premiers nouritures ;*
;*
@@bouclecoordonneenouriture: ;*
push cx ;*
call donnecoordonneeinouriture ;*
add bx,2 ;on passe a la nouriture suivante ;*
pop cx ;*
loop @@bouclecoordonneenouriture ;*
;----------------------
CALL test_si_entoure ;au cas ou initialement un Morga est entouré ;*
;=============================================================================
call dessine_nouriture ;ecran de base , affiche les morga ;*
call dessine_morga ; et les nouritures ;*
;************** ;*
;====================== boucle de jeux =======================================
;************** ;*
CALL InitRnd ;initialisation pour le random
@@debut: ;début de la boucle
mov efface,1 ;booleen 1-> on efface
call dessine_morga ;dessine carre noir
call test_correspondance ;test visant a voir si les coordonnées morga
;sont les meme que celle de la nouriture
call test_reproduction ;on test si les Morga sont aptes a se reproduire
call mouvement ;détermine la nouvelle coordonnée des morga
CALL test_si_entoure ;test si un Morga est entourer par d autres Morga
call add_nouriture ;add de la nouriture et la desine (celle en plus)
mov efface,0 ;booleen 0->on efface pas
call dessine_morga ;dessine carre rouge
call fin_prog ;test si on a appuyer sur Q pour une pause clavier ,->go out
;----------------------
mov ax,nb_morga ;test de sortie du programme (2000 -> on sortirais du vecteur !)
cmp ax,2000
jge fin
;----------------------
JMP @@debut ;Boucle-->on recommance
;=======================================================================
call clavier ;procédure de pause
jmp fin ;goto fin
main endp
;==========================================
;== Procedures ==
;==========================================
test_superposition proc
;on va parcourir le tableau des Micro orga en partant du premier et analyser de
;cette facon les suivant et leur position
;-> si il y a meme position on s'arrangera pour donner de nouvelle coordonnées
;->!!! le BX DOIT etre positionner sur posx !!!
push cx
mov si,bx
mov si,2 ;si est l indice du Morga suivant celui k on analyse
cmp si,bx
JE @@finICI
mov cx,nb_Morgarestant
cmp cx,0
JE @@finICI
@@boucle:
cmp tab_orga[si],0
JNE @@vivant
ADD si,8
JMP @@boucle
@@vivant:
push bx
push si ;au depart les indices sont sur posx
mov ax,tab_orga[bx]
cmp ax,tab_orga[si]
JNE @@suivant
ADD bx,2 ;indice sur posy
ADD si,2
mov ax,tab_orga[bx]
cmp ax,tab_orga[si]
JNE @@suivant
mov superpose,1
@@suivant:
pop si
pop bx
ADD si,8
cmp si,bx
JE @@finICI
LOOP @@boucle
@@finICI: pop cx
RET
test_superposition endp
;-----------------------------------------------------------------------
char proc ;Procédure qui fais un compte du nombre de morts
pusha
cmp asci,57 ;si on est au dessus de 9
JL @@premierchiffre ;->on continue car <9
mov asci,47 ;->remise a zero
CALL char2 ;->on passe au second chiffre
@@premierchiffre:
mov posx,40
mov posy,27
CALL curseur
mov ah,09h ; Affichage
INC asci
mov al,asci ; D'un char correspondant au code ascii
mov bh,0
mov bl,01000011b ; couleur
mov cx,1 ; Un seul caractère
int 10h
popa
ret
char endp
char2 proc
pusha
cmp asci2,57
JL @@premierchiffre
mov asci2,47
@@premierchiffre:
mov posx,39 ;compteur du nombre de mort
mov posy,27
CALL curseur
mov ah,09h ; Affichage
INC asci2
mov al,asci2 ; D'un char correspondant au code ascii
mov bh,0
mov bl,01000011b ; couleur
mov cx,1 ; Un seul caractère
int 10h
popa
ret
char2 endp
;-----------------------------------------------------------------------
test_reproduction proc
pusha
mov bx,0 ;indice positionner sur l age
mov cx,1500
@@Boucle:
push bx
mov ax,tab_orga[bx] ; test si plus de 400 ans
cmp ax,400
JL @@suivant ;si non aller a suivant
ADD bx,6 ;test si Energie + de 400E
mov ax,tab_orga[bx]
cmp ax,400
JL @@suivant ;si non passer a suivant
@@A_maturite:
@@Fils_1: sub dx,dx ;car on fais une div
div deux ;l'énergie du pere est diviser par 2
mov tab_orga[bx],ax ;==1er fils== prend la 1/2 de l energie
mov saveEnergie,ax ;sauvegarde du niveau d energie
SUB bx,6 ;indice remis sur age
mov tab_orga[bx],1 ;Age reinitialisé a 1
ADD bx,2 ;BX surr posx
mov ax,tab_orga[bx]
mov saveposx,ax ;sauvegarde de la derniere posx
ADD bx,2 ;BX sur posy
mov ax,tab_orga[bx]
mov saveposy,ax ;sauvegarde de la derniere posy
ADD bx,2 ;BX sur energie
@@TQ_trouvePasLibre:
mov ax,tab_orga[bx] ;bx sur energie
cmp ax,0
JLE @@libre
add bx,8
JMP @@TQ_trouvePasLibre
@@libre:
mov ax,saveEnergie
mov tab_orga[bx],ax ;Lenergie sera iddentike
sub bx,4 ;bx sur posx
push bx
@@Donne_coordonne_fils:
push 1
push 800
CALL random
cmp eax,96 ;=====1 er cas=======
jge @@suite1
mov ax,saveposx
mov tab_orga[bx],ax ;indice sur posx
sub tab_orga[bx],5 ;decremente d'une case
mov ax,tab_orga[bx]
cmp ax,0
jge @@ok1
mov tab_orga[bx],600 ;cas ou l'on depasse le tab en x -> passage autre bord
@@ok1:
add bx,2 ;indice sur posy
mov ax,saveposy
mov tab_orga[bx],ax
sub tab_orga[bx],5 ;decremente d'une case
mov ax,tab_orga[bx]
cmp ax,0
jge @@fincmp
mov tab_orga[bx],400 ;cas de dépassement
jmp @@fincmp
@@suite1:
cmp eax,200 ;====2 eme cas======
jge @@suite2
add bx,2 ;indice sur posy
mov ax,saveposy
mov tab_orga[bx],ax
sub tab_orga[bx],5 ;decremente d'une case
mov ax,tab_orga[bx]
cmp ax,0
jge @@fincmp
mov tab_orga[bx],400 ;cas de depassement
jmp @@fincmp
@@suite2:
cmp eax,296 ;======3 eme cas=====
jge @@suite3
mov ax,saveposx
mov tab_orga[bx],ax
add tab_orga[bx],5 ;incremente d'une case
mov ax,tab_orga[bx]
cmp ax,600 ; cas du depassement
jle @@ok2
mov tab_orga[bx],0
@@ok2:
add bx,2 ;indice sur posy
mov ax,saveposy
mov tab_orga[bx],ax
sub tab_orga[bx],5 ;decremente d'une case
mov ax,tab_orga[bx]
cmp ax,0 ;cas du depassement
jge @@fincmp
mov tab_orga[bx],400
jmp @@fincmp
@@suite3:
cmp eax,400 ;=====4 eme cas=====
jge @@suite4
mov ax,saveposx
mov tab_orga[bx],ax ;indice sur posx
add tab_orga[bx],5 ;incremente d'une case
mov ax,tab_orga[bx]
cmp ax,600 ;test depassement
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite4:
cmp eax,496 ;========5eme cas=======
jge @@suite5
mov ax,saveposx
mov tab_orga[bx],ax ;indice sur posx
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,600
jle @@ok3
mov tab_orga[bx],0
@@ok3:
add bx,2 ;indice sur posy
mov ax,saveposy
mov tab_orga[bx],ax
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,400 ;test depassement
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite5:
cmp eax,600 ;=====6eme cas===========
jge @@suite6
mov ax,saveposx
mov tab_orga[bx],ax ;indice sur posy
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,400
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite6: ;=======7eme cas===========
cmp eax,696
jge @@suite7
ADD bx,2 ;indice sur posx
mov ax,saveposx
mov tab_orga[bx],ax
sub tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,0
jge @@ok4
mov tab_orga[bx],600
@@ok4:
add bx,2 ;indice sur posy
mov ax,saveposy
mov tab_orga[bx],ax
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,400
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite7:
cmp eax,800 ;===8eme cas================
jg @@probleme
mov ax,saveposx
mov tab_orga[bx],ax ;indice sur posx
sub tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,0
jge @@fincmp
mov tab_orga[bx],600
jmp @@fincmp
@@probleme:
JMP @@Donne_coordonne_fils
@@fincmp: pop bx
mov ax,saveposx
mov posx,ax
mov ax,saveposy
mov posy,ax
mov al,12h
CALL carre
sub bx,2 ;bx sur age
mov tab_orga[bx],1
INC nb_Morga
@@suivant:
pop bx
ADD bx,8 ; Morga suivant (age)
Loop @@boucle
popa
RET
test_reproduction endp
;-----------------------------------------------------------------------
test_correspondance proc
mov bx,6 ;position indice sur morga 1 , energie
mov si,0 ;position indice tab_orga posx initial
mov cx,nb_nouriture
@@boucle2:
push cx
mov cx,nb_Morga
@@boucle1: ;== Parcours Tab_orga et compare chaque Morga
push bx
push si
; == Pour chaque nouriture
mov ax,tab_orga[bx] ;== TEst vivant ou non ? ==
cmp ax,0 ;========Morga=============
Jne @@vivant
INC cx
JMP @@endMorga ;on va a la fin de la premiere boucle
@@vivant:
sub bx,4 ;indice sur posx Morga
mov ax,tab_orga[bx]
cmp ax,tab_nouriture[si] ;si=posx Nouriture
JNE @@endMorga ;=goto fin si posxM != posxN
add bx,2 ;indice sur posy Morga
add si,2 ;indice sur posy Nouriture
mov ax,tab_orga[bx]
cmp ax,tab_nouriture[si]
JNE @@endMorga
@@Correspondance:
add bx,2
ADD tab_orga[bx],30
SUB si,2
MOV tab_nouriture[si],0
@@endMorga:
pop si
pop bx
ADD bx,8 ; indice placer sur Energie Morga suivant
Loop @@boucle1
ADD si,4
Mov bx,6
pop cx
Loop @@boucle2
ret
test_correspondance endp
;-----------------------------------------------------------------------
mouvement proc
mov cx,nb_morga
mov bx,6
@@boucle_mouvement:
mov ax,tab_orga[bx] ;on va tester si on a afaire a un morga vivant
cmp ax,0 ;energie plus de zero
jg @@debutdeplacement ;=vivant on commence les coordonnées nouvelles
add bx,8 ; indice sur morga suivant (energie)
jmp @@boucle_mouvement ;= mort , on passe au morga suivant
mov nb_Morgarestant,1 ;utiliser pour le test de correspondance
@@debutdeplacement:
push 0 ;donne une des 8 cases aux alentours
push 800
call random
push bx ;sauvegarde de l'indice morga (energie)
cmp eax,96 ;=====1 er cas=======
jge @@suite1
sub bx,4 ;indice sur posx
sub tab_orga[bx],5 ;decremente d'une case
mov ax,tab_orga[bx]
cmp ax,0
jge @@ok1
mov tab_orga[bx],600 ;cas ou l'on depasse le tab en x -> passage autre bord
@@ok1:
add bx,2 ;indice sur posy
sub tab_orga[bx],5 ;decremente d'une case
@@oksuperpo1: mov ax,tab_orga[bx]
cmp ax,0
jge @@fincmp
mov tab_orga[bx],400 ;cas de dépassement
jmp @@fincmp
@@suite1:
cmp eax,200 ;====2 eme cas======
jge @@suite2
sub bx,2 ;indice sur posy
sub tab_orga[bx],5 ;decremente d'une case
@@oksuperpo2: mov ax,tab_orga[bx]
cmp ax,0
jge @@fincmp
mov tab_orga[bx],400 ;cas de depassement
jmp @@fincmp
@@suite2:
cmp eax,296 ;======3 eme cas=====
jge @@suite3
sub bx,4 ;indice sur posx
add tab_orga[bx],5 ;incremente d'une case
mov ax,tab_orga[bx]
cmp ax,600 ; cas du depassement
jle @@ok2
mov tab_orga[bx],0
@@ok2:
add bx,2 ;indice sur posy
sub tab_orga[bx],5 ;decremente d'une case
@@oksuperpo3: mov ax,tab_orga[bx]
cmp ax,0 ;cas du depassement
jge @@fincmp
mov tab_orga[bx],400
jmp @@fincmp
@@suite3:
cmp eax,400 ;=====4 eme cas=====
jge @@suite4
sub bx,4 ;indice sur posx
add tab_orga[bx],5 ;incremente d'une case
@@oksuperpo4:mov ax,tab_orga[bx]
cmp ax,600 ;test depassement
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite4:
cmp eax,496 ;========5eme cas=======
jge @@suite5
sub bx,4 ;indice sur posx
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,600
jle @@ok3
mov tab_orga[bx],0
@@ok3:
add bx,2 ;indice sur posy
add tab_orga[bx],5
@@oksuperpo5: mov ax,tab_orga[bx]
cmp ax,400 ;test depassement
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite5:
cmp eax,600 ;=====6eme cas===========
jge @@suite6
sub bx,2 ;indice sur posy
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,400
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite6: ;=======7eme cas===========
cmp eax,696
jge @@suite7
sub bx,4 ;indice sur posx
sub tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,0
jge @@ok4
mov tab_orga[bx],600
@@ok4:
add bx,2 ;indice sur posy
add tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,400
jle @@fincmp
mov tab_orga[bx],0
jmp @@fincmp
@@suite7:
cmp eax,800 ;===8eme cas================
jg @@probleme
sub bx,4 ;indice sur posx
sub tab_orga[bx],5
mov ax,tab_orga[bx]
cmp ax,0
jge @@fincmp
mov tab_orga[bx],600
jmp @@fincmp
@@probleme: pop bx
jmp @@boucle_mouvement
@@fincmp:
pop bx ;indice replacé sur energie de morga traité
dec tab_orga[bx] ;decremente energie
mov ax,tab_orga[bx]
cmp ax,0
JG @@incage
sub bx,6
mov tab_orga[bx],0 ;*
CALL char
JMP @@endnow
@@incage: sub bx,6 ;indice sur l'age
inc tab_orga[bx] ;incremente son age
@@endnow: add bx,14 ;indice sur energie du morga suivant
mov superpose,0
INC nb_Morgarestant
loop @@boucle_mouvement
ret
mouvement endp
;-----------------------------------------------------------------------
test_si_entoure proc
mov bx,6
;lorsque l on rentre dans cette procedure l'indice BX est positionnée sur l Energie du Tab_orga
;in va faloir tester di autour de la case du Morga , il y en a d'autres si il ne sais plus bouger ->il meut
Mov cx,nb_Morga
@@Boucle_traite_TT_orga:
mov ax,tab_orga[bx] ;on va tester si on a afaire a un morga vivant
cmp ax,0 ;energie plus de zero
JNE @@ok
ADD bx,8
JMP @@Boucle_traite_TT_orga
@@ok:
mov proximite,0 ;init de la proximite pour chaque Morga
push bx
push cx
mov cx,nb_Morga
mov si,6 ;indice sur' Energie 1 ER Morga [ici utilisé est SI]
@@Test_tt_les_autres:
mov ax,tab_orga[si] ;on va tester si on a afaire a un morga vivant
cmp ax,0 ;energie plus de zero
JNE @@ok2
ADD si,8
@@ok2:
@@CAS_1: ;test si Morga au Nord a gauche
push bx ;Sauvegarde des Indices ->sur Energie
push si
sub bx,4 ;bx sur posx
mov ax,tab_orga[bx] ;
sub si,4 ;si sur posx
dec ax ;test sur X-1
cmp ax,tab_orga[si]
JNE @@CAS_2
ADD bx,2 ;bx sur posy
ADD si,2 ;si sur posy
mov ax,tab_orga[bx]
dec ax ;test sur Y-1
cmp ax,tab_orga[si]
JNE @@CAS_2
INC proximite
@@CAS_2: ;test si Morga au nord centre
pop si
pop bx ;-->on revient au indice sur Energie
push bx
push si ;-->sauvegarde des indices
sub bx,4 ;bx,si sur posx
sub si,4
mov ax,tab_orga[bx]
cmp ax,tab_orga[si]
JNE @@CAS_3
ADD bx,2 ;bx,si sur posy
ADD si,2
mov ax,tab_orga[bx]
dec ax
cmp ax,tab_orga[si]
JNE @@CAS_3
INC proximite
@@CAS_3: ;test avec la case nord DRoite
pop si
pop bx ;recuperation des indices sur energie
push bx
push si ;-->sauvegarde des indices
sub bx,4 ;indice sur posx
sub si,4
mov ax,tab_orga[bx]
INC ax
cmp tab_orga[si],ax
JNE @@CAS_4
ADD bx,2 ;indice sur posy
ADD si,2
mov ax,tab_orga[bx]
DEC ax
cmp tab_orga[si],ax
JNE @@CAS_4
INC proximite
@@CAS_4: ;test sur la case centre droite
pop si
pop bx ;recuperation des indices sur energie
push bx
push si ;-->sauvegarde des indices
sub bx,4 ;indice sur posx
sub si,4
mov ax,tab_orga[bx]
INC ax
cmp ax,tab_orga[si]
JNE @@CAS_5
ADD bx,2 ;indice sur posy
ADD si,2
mov ax,tab_orga[bx]
cmp ax,tab_orga[si]
JNE @@CAS_5
INC proximite
@@CAS_5: ;test sur case SUD droite
pop si
pop bx ;recuperation des indices sur energie
push bx
push si ;-->sauvegarde des indices
sub bx,4 ;indice sur posx
sub si,4
mov ax,tab_orga[bx]
INC ax
cmp ax,tab_orga[si]
JNE @@CAS_6
ADD bx,2 ;indice sur posy
ADD si,2
mov ax,tab_orga[bx]
INC ax
cmp ax,tab_orga[si]
JNE @@CAS_6
INC proximite
@@CAS_6: ;Test sur case sud centre
pop si
pop bx ;recuperation des indices sur energie
push bx
push si ;-->sauvegarde des indices
SUB bx,4 ;indice sur posx
SUB si,4
mov ax,tab_orga[bx]
cmp ax,tab_orga[si]
JNE @@CAS_7
ADD bx,2 ;indice sur posy
ADD si,2
mov ax,Tab_orga[bx]
INC ax
cmp ax,tab_orga[si]
JNE @@CAS_7
INC proximite
@@CAS_7: ;Test sur case Sud gauche
pop si
pop bx ;recuperation des indices sur energie
push bx
push si ;-->sauvegarde des indices
sub bx,4 ;indice sur posx
sub si,4
mov ax,tab_orga[bx]
DEC ax
cmp ax,tab_orga[si]
JNE @@CAS_8
ADD bx,2 ;indice sur posy
ADD si,2
mov ax,tab_orga[bx]
INC ax
cmp ax,tab_orga[si]
JNE @@CAS_8
INC proximite
@@CAS_8: ;Test sur case gauche
pop si
pop bx ;recuperation des indices sur energie
push bx
push si
sub bx,4
sub si,4
mov ax,tab_orga[bx]
dec ax
cmp ax,tab_orga[si]
JNE @@fin_cas
add bx,2
add si,2
mov ax,tab_orga[bx]
inc ax
JNE @@fin_cas
INC proximite
@@fin_cas:
pop si
pop bx
ADD si,8
LOOP @@Test_tt_les_autres
pop cx
pop bx
@@Test_si_proximite_egal_8:
cmp proximite,8
JNE @@pas_egal
mov tab_orga[bx],0 ;=>si l orga a une proximite de 8
; il dois mourir =>car plus de place pour vivre
@@pas_egal:
ADD bx,8 ;passage au Morga suivant
LOOP @@Boucle_traite_TT_orga
RET
test_si_entoure endp
;-----------------------------------------------------------------------
donnecoordonneeimorga proc ;procedure d'initialisation du tab des morga
mov tab_orga[bx],1 ;age=1 il est donc vivant
push 0
push 119
call random
mul cinq ; appel random ds ax
add bx,2 ;indice en posx
mov tab_orga[bx],ax ;donne nbre aleatoire
push 0
push 79
call random
mul cinq ; appel random ds ax
add bx,2 ;indice en posy
mov tab_orga[bx],ax ;nbre aleatoire ds posy
add bx,2 ;indice en energie
push 150
push 250
CALL random
mov tab_orga[bx],ax ;energie=[150-250] initialisation
ret
donnecoordonneeimorga endp
;-----------------------------------------------------------------------
donnecoordonneeinouriture proc
push 0
push 119
call random
mul cinq
mov tab_nouriture[bx],ax ;indice sur posx ,donne nbre aleatoire
push 0
push 79
call random
mul cinq
add bx,2 ;indice sur posy
mov tab_nouriture[bx],ax ;donne nbre aleatoire
ret
donnecoordonneeinouriture endp
;-----------------------------------------------------------------------
add_nouriture proc ;nb_nouriture+=(nb_nouriture/nb_orga)
pusha
MOV si,0 ;indice sur posx de nouriture
mov ax,nb_Morga
sub dx,dx
DIV trente
MOV cx,ax ;nbre d de nouriture rajoutée
;on va remplir le tableau de nouriture
@@Boucle:
;== seul les cases posx=0 seront comblée ==;
mov ax,tab_nouriture[si]
cmp ax,0
JNE @@okp
push 0
push 120
CALL random
mul cinq
mov tab_nouriture[si],ax ;posx de tab_nouriture
mov posx,ax
push 0
push 80
CALL random
mul cinq
ADD si,2 ;posy de tab_nouriture
mov tab_nouriture[si],ax
mov posy,ax
mov al,02h
CALL carre
ADD si,2 ;posx suivant
JMP @@suivant
@@okp:
INC cx
ADD si,4
@@suivant:
Loop @@Boucle
popa
ret
add_nouriture endp
;------------------------------------------------------------------------
dessine_nouriture proc ;procedure qui va parcourire le vecteur et dessiner
;les cases avec nouritures
mov cx,nb_nouriture
mov si,0
@@boucle1:
mov ax,tab_nouriture[si] ;test pour voir si il y a de la nouriture
cmp ax,1 ;car impossible k il y en ai en posx=0
jge @@ok
add si,4
jmp @@boucle1
@@ok:
mov ax,tab_nouriture[si]
mov posx,ax
add si,2
mov ax,tab_nouriture[si]
mov posy,ax
mov al,02h
call carre
add si,2
loop @@boucle1
ret
dessine_nouriture endp
;-----------------------------------------------------------------------
dessine_morga proc
;== parcours du vecteur tab_orga ==
mov bx,6 ;indice sur energie Morga n°1
mov cx,nb_morga
@@bouclem:
push bx
mov ax,tab_orga[bx] ;== 1/ test si vivant ==
cmp ax,0
jg @@vivant
INC cx
jmp @@finboucle
@@vivant:
sub bx,4 ;indice sur posx
mov ax,tab_orga[bx]
mov posx,ax ;donne la coordonnée
add bx,2 ;indice sur posy
mov ax,tab_orga[bx]
mov posy,ax ;donne la coordonnée
pusha
mov ax,efface ;on va tester si il sagit de colorier
cmp ax,0 ;la case ou se trouve le morga ou de l'effacer
jne @@couleur_noir
@@couleur_rouge:
mov al,04h
jmp @@couleurok
@@couleur_noir:
mov al,00h
@@couleurok:
call carre ;appel procedure pour dessiner le carre
popa
@@finboucle:
pop bx
add bx,8 ;indice sur energie suivant
loop @@bouclem
ret
dessine_morga endp
;--------------------------------------------------------
carre proc
push cx
mov cx,4
inc posy
inc posx
@@bouclecaseok: ;l'utilisation est tres simple,donner les coordonnées
call colorie_caseok2 ;du pixel en haut a gauche(max sup gauche)
inc posy ;avec posx & posy
loop @@bouclecaseok
sub posy,4
pop cx
ret
carre endp
;--************phase_suiv*******************--
colorie_caseok2 proc ;comme on a afaire a une boucle impriqué
push cx ;le chois de ssroutine est plus judicieux
mov cx,4 ;colorie_caseok2 est donc relié a colorie_caseok
@@bouclecase2ok:
call pixel
inc posx
loop @@bouclecase2ok
sub posx,4
pop cx
ret
colorie_caseok2 endp
;-----------------------------------------------------------
damier proc
mov al,07h
mov posx,0
mov posy,0
lignes_horizontales:
mov cx,82
@@boucle2h:
push cx
mov cx,605
@@boucle1h:
call pixel
inc posx
loop @@boucle1h
add posy,5
mov posx,0
pop cx
loop @@boucle2h
mov posx,0
mov posy,0
lignes_vertivales:
mov cx,122
@@boucle2v:
push cx
mov cx,405
@@boucle1v:
call pixel
inc posy
loop @@boucle1v
add posx,5
mov posy,0
pop cx
loop @@boucle2v
ret
damier endp
;-----------------------------------------------------
titrelegende proc
mov posx,5
mov posy,26
call curseur
mov dx,offset titre2
call ecrit
mov posx,41
mov posy,27
call curseur
mov dx,offset mort
call ecrit
ret
titrelegende endp
;-----------------------------------------------------
mode_graphique proc
mov al,12h ; mode graphique 12h->640*480
mov ah,00h
int 10h
ret
mode_graphique endp
;------------------------------------------------------
pixel proc ;procédure permettant l'affichage
pushad ;d'un pixel,selon les coordonnées
mov ah,0ch ;ici posx et posy
; mov al,01h ;01-->bleu
mov bx,0000h
mov cx,posx
mov dx,posy
int 10h
popad
ret
pixel endp
;------------------------------------------------
;***************************************
;*Test si appui sur Q pour quitter *
;***************************************
fin_prog proc
pusha
mov ah,0bh
int 21h
cmp al,0ffh
jne fin_test_q
mov ah,01
int 21h
cmp al,113 ;113 = valeur ascii de la lettre Q
jne fin_test_q
CALL clavier
JMP fin
fin_test_q:
popa
ret
fin_prog endp
;---------------------------------------------------
clavier proc
pusha
mov ah,07h ; attente d'une touche
int 21h
popa
ret
clavier endp
;-------------------------------------------------
curseur proc near ;ssroutine de positionnement du curseur
push ax ;utilisé pour l'affichage
mov dl,byte ptr posx
mov dh,byte ptr posy
mov ax,0200h
int 10h
pop ax
ret
curseur endp
;-------------------------------------------------
ecrit proc ;écriture, va etre utilisé avec un mov dx,offset .nom.
pusha
mov ax,0900h
int 21h
popa
ret
ecrit endp
;--------------------------------------------------
; fin du programme**************************
fin:
; création d'un fichier et ouverture
MOV AH,3CH
MOV CX,0000000b ; attibuts standards
MOV DX,offset fichier
int 21h
MOV handle,AX
; écriture d'un buffer
MOV AH,40h
MOV BX,handle
MOV CX,lenght_tabOrga
mov dx,'0'
ADD tab_orga,dx
MOV DX,offset tab_orga
int 21h
; femeture du fichier
MOV AH,3Eh
MOV BX,handle
int 21h
mov al,03h ;modevideo 03h (texte)
mov ah,00h
int 10h
mov ax,04c00h
int 21h
end main
;-------------------------------------------------------------
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.