Accueil > > > MICRO-ORGANISME CONTRE BARDACK :D
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
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
;-------------------------------------------------------------
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|