|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
MICRO-ORGANISME CONTRE BARDACK :D
Information sur la source
Description
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
-
- .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
- ;-------------------------------------------------------------
.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 |