Accueil > > > JEU DU PING
JEU DU PING
Information sur la source
Description
Il s'agit du jeu du Ping. Permet à l'utilisateur de sauveguarder les parties réussies, ce qui permet utlérieurement de consulter les slutions. Sauveguarde aussi la partie courante pour etre rejoué dans le cas ou elle n'a pas été finie.
Source
- ; ASM 2 – Le jeu du Ping
- ;
- ; Auteur : Neoplayer
- ; Date : Mars 2005
- ; Description : Jeu du ping, petit jeu ou le but est
- ; de retourner toute les cases, sauveguarde des solution dans des fichiers.
- ;==========================================================
- .model small
- .stack 100h
- .486
- locals
- jumps
-
- AvanceDeUn MACRO handleEnParam, NbCaract
- mov cx,NbCaract
- lea dx,CaseSolution ;
- mov bx,handleEnParam ; Je place 1 bytes dans le fichier CaseSolution
- mov ah,3fh ;
- int 21h
- ENDM AvanceDeUn
- ;--------------------
- ; |
- ;Placement du curseur|
- ; |
- ;--------------------
- pointeur MACRO X, Y
- mov dl,X
- mov dh,Y
-
- mov bh,0
- mov ah,02h ;appel de l'interruption pour placer mon curseur a la position
- int 10h ;AX AY
- ENDM pointeur
- ;--------------------
- ; |
- ;Affichage de texte |
- ; |
- ;--------------------
- text MACRO txt
- mov ah,09h ; Intérruption affichant du Text
- lea dx,txt
- int 21h
- ENDM text
- ;--------------------
- ; | ;Valeur en entre dans al et ah
- ;Transforme 2 chifs | ;Valeur de sortie dans ax
- ; en 1 Nb |
- ;--------------------
- DeuxChiffreUnNb MACRO
- mov cl,ah
- mov ah,0
- mov dl,10
- mul dl
- add al,cl
-
- ENDM DeuxChiffreUnNb
-
- EcrireDeuxCaract MACRO handleBelin
- pusha
- add aEcrire[0],48
- add aEcrire[1],48
- mov ah,40h
- mov bx,handleBelin
- mov cx,2
- lea dx,aEcrire
- int 21h
- popa
- ENDM EcrireDeuxCaract
-
- EcrireDuTxtEnRouge MACRO LeTexte, PosX, PosY, NbCaract
- mov dl,PosX
- mov dh,PosY
- pointeur PosX PosY
-
- mov cl,0
- mov bx,0
- @@boucle:
- mov al,LeTexte[bx]
- pusha ;Affichage des caractere 1 par 1
- CALL AfficherUneChaineCaraParCaract ;Avec une fonte grise
- popa ;et la couleur du caractere rouge
- inc dl
- pointeur dl dh
- inc bx
- cmp bx,NbCaract
- jne @@boucle
- ENDM EcrireDuTxtEnRouge
-
- Cadre MACRO XA, YA, XB, YB
-
- mov al,blanc
- mov dx,YA
- mov cx,XA
-
- @@BordHaut: ;
- CALL pixel ; Trace la ligne blanche du haut pour l effet 3d
- inc cx ;
- cmp cx,XB ;
- jne @@BordHaut ;
-
- mov al,gris
-
- @@redebut: ; Passe a la ligne et on retrace
- mov cx,XA
- inc dx
- @@debut: ;
- CALL pixel ; Tracage d'une ligne horrizontal
- inc cx ;
- cmp cx,XB ;
- jne @@debut ;
- cmp dx,YB
- jne @@redebut
-
- mov al,noir ; Tracage de la derniere ligne en noir pour un effet 3d
- mov cx,XA
- @@BordBas:
- CALL pixel
- inc cx
- cmp cx,XB
- jne @@BordBas
-
- mov cx,XB
- mov dx,YA
- @@BordDroite: ; Tracage de la ligne de droite pour un effet 3d
- CALL pixel
- inc dx
- cmp dx,YB
- jle @@BordDroite
-
- mov dx,YA
- mov cx,XA
- mov al,blanc
-
- @@BordGauche: ; Tracage de la ligne de gauche pour un effet 3d
- CALL pixel
- inc dx
- cmp dx,YB
- jl @@BordGauche
-
- ENDM Cadre
- ;------------------------------------------------------------------------------------------------
- ; Macro des gestions de fichier
- ;------------------------------------------------------------------------------------------------
- OuvrirFichier MACRO fichier ;
- mov ah,3DH ;
- mov al,2 ; Ouvrir un fichier
- lea dx,fichier ;
- int 21h ;
- ENDM OuvrirFichier
-
-
- CreeFichier MACRO fichier ;
- mov ah,3CH ; Macro qui créé un fichier avec le nom du fichier fournit en param
- mov cx,000000000b ; Elle retourne dans ax le Handle
- lea dx,fichier ;
- int 21h ;
- ENDM CreeFichier ;
- ;------------------------------------------------------------------------------------------------
- ; Procedure et variable a exporter, ou à importer
- ;------------------------------------------------------------------------------------------------
-
- extrn Solution : proc
- extrn tailleDamier :proc
- extrn damier :proc
- extrn clic_souris:proc
- extrn un_coup:proc
- extrn verif_gagner:proc
- extrn fait_le:proc
- extrn initrnd:proc
- extrn random:proc
- extrn v1
- extrn longueur
- extrn largeur
- extrn etat_jeu:proc
- public jeu
- public pion1
- public pion2
- public exit
- ;------------------------------------------------------------------------------------------------
- ; Mes Variables
- ;------------------------------------------------------------------------------------------------
- .data
-
- ;Tout ce qui est pour l'affichage de l'entete en ecrivant direct dans la mem video
- ;------------------------------------------------------------------------------
- Y EQU 5
- X EQU 25
- INI DW 0B800h
- Attribut EQU 0001111b
-
- LARGEUREntete EQU 28
- HAUTEUREntete EQU 5 ; en fait hauteur - 1
- ;-----------------------------------------------------------------------------
-
- efface equ 'A'
-
-
- blanc equ 0Fh
- rouge equ 04h
- bleu equ 01h
- gris equ 07h
- noir equ 08h
-
- tailleCarre equ 28
- TailleCaseSOl equ 6
- Temps_de_Pause equ 2
-
-
-
- CarreAX dw ?
- CarreAY dw ?
-
- CarreBX dw ?
- CarreBY dw ?
-
- cpt2 dw 0
-
- Nb_Coup_Solution dw 0
- Nb_Coup_Part_Cour dw 0
-
- Reprise db "Voulez vous reprendre l'ancienne partie commencer ?",'$'
- appuyerSurUneTouche db "Veuillez appuyer sur une touche pour continuer."
- TailleChaineAppuyer equ 47
- reprendrePartie db " Reprise de la patie en cours, veuillez patienter",'$'
- PasDImage db " Le fichier Image.hal n'a pu etre trouve ",'$'
- YesTxt db "Yes",'$'
- NoTxt db "No",'$'
- SolutionB db "Solution",'$'
- Reprendre db "Reprendre",'$'
- PasDeSol db " Pas de solution presente",'$'
-
- entete DB ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ',187
- DB ' º Neoplayer º'
- DB ' º º'
- DB ' ',204,'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ',185
- DB ' ','º Jeu du Ping º'
- DB ,'ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ'
-
-
- diese db ?
- fichierSol db 'Solution.txt',0
- fichierTemp db 'ping_tem.txt',0
- fichierIma db 'image.hal',0
- recop db 'recop.tmp',0
-
- handle dw ? ;Handle de fichierSol
- handleTemp dw ? ;Handle de fichierTemp
- handleIma dw ? ;Handle de fichierIma
- handleRecop dw ? ;Handle de recopie
-
- CaseClique db 100 dup(0) ; Tablo des clic de la partie ;CaseClique
- CaseSolution db TailleCaseSOl dup('-')
- tabloImage dw 7056 dup(0)
-
- deb_pion1 dw ?
- deb_pion2 dw ?
-
-
- jeu db 100 dup (0)
- aEcrire db 2 dup(0)
- .code
-
- ;----------------------------------------------------------------------------------------------------
- ; Debut du Main
- ;----------------------------------------------------------------------------------------------------
-
- main proc
- mov ax,@data
- mov ds,ax
-
- CALL ImageDansTablo ; Genere les nombres aleatoire + ouvre fichier image.hal
- ; Place tout le fichier dans le tablo tabloImage
-
-
- CALL video
-
- CALL AfficherEnTete
-
- CALL attend
-
-
- OuvrirFichier fichierSol ; J'essaye d'ouvrir le fichier Solution.txt
- jc @@FichierNonExistant ; Je teste le carry flag si il est a 1, c que le fichier existe pas
- ; d ou la necessiter de le créer
- jmp @@FichierExistant
-
- @@FichierNonExistant:
- CreeFichier fichierSol
- @@FichierExistant:
-
- mov handle,ax ; Je sauveguarde le handle
-
-
- CALL pointeurDuFichier ;On pointe sur la fin du fichier pour ne pas effacer ce qui si trouve deja
-
- CALL video ;a remplacer plus tard avec un nettoyage ecran avec le 0b800....
-
- CALL tailleDamier ;Initialisation de variables (avec demande des entre pour lg et la
-
- ;----------------------------------------------------------------------------------------------------------------
- ; J'ouvre le fichier Temporaire de la partie precedente
- ; Je teste si les 2 et 3 eme caractere sont egale a ce qui a été cliqué
- ; Si c egale alors je propose a l'utilisateur de reprendre la partie la ou elle en etait la derniere fois.
- ;----------------------------------------------------------------------------------------------------------------
-
-
- OuvrirFichier fichierTemp ; On essaye d'ouvrir le fichier, si on y arrive pas
- mov handleTemp,bx
-
- jc @@@@FichierNonExistant
- jmp @@SuiteNext
-
- @@@@FichierNonExistant:
- ;On le créée
- CreeFichier fichierTemp
- mov handleTemp,bx
- CALL CreeFichierTemp ;On cree le fichier Temp avec la bonne syntaxe
-
- jmp @@@@ZeDebut
-
-
- @@SuiteNext:
-
- CALL TestSiFichierTemp ; On teste pour savoir si le fichier temporaire contient bien la meme Lo et LA
- ; Renvoi 1 dans DI si c la meme chose, 2 dans les autres cas
-
- cmp di,2
- je @@@@FichierNonExistant
-
-
- CALL ClicBelin
- cmp di,1 ;On reprend la partie si DI = 2
- je @@@@suite
-
- jmp @@@@FichierNonExistant
- @@@@suite:
- CALL videoG
- CALL damier
- pointeur 8 28
- text reprendrePartie
- CALL ReprendreLaPartie
- jmp @@@@@@debut
- @@@@ZeDebut:
-
- CALL videoG
- CALL damier
-
-
- @@@@@@debut:
-
- CALL CadreSolution ;Appel la macro Cadre trace un cadre avec les coordonées fournit en parametre
- CALL AfficherTexteSol
-
- @@@@debut:
- CALL affSouris
-
- CALL Un_Coup
-
- cmp di,1
- jne @@next
- CALL reExist ; On teste pour savoir si il y a bien une solution
- cmp di,1 ; dans le fichier solution
- je @@@@@@next
- pointeur 8 28
-
- text PasDeSol
-
- jmp @@@@debut
- @@@@@@next:
- mov cpt2,0
- CALL LireLeFichierSolution
-
- CALL videoG
- CALL CadreSolution
- CALL AfficherTexteRejoue
-
- push cpt2
- CALL solution
-
- CALL affSouris
-
- CALL clicSouris
-
- CALL videoG
-
- CALL Etat_jeu
- jmp @@@@@@debut
-
- @@next:
-
- ;------------------------ Ecriture dans le fichier Temporaire
- mov bx,v1
- inc CaseClique[bx] ; On incremente de 1 l'endroit ou on a cliquer
- CALL EcrireDansFichierTemp
- ;-----------------------
-
- CALL verif_gagner
- CMP al,1
- Jne @@@@debut
-
- CALL VideMoi
- CALL attend
- CALL video ;nettoye l'ecran et quitte
-
- CALL reExist
- cmp di,0
- je @@OnEcrit
- CALL CompterNbClic ; Dans le fichier solution
- CALL NbClicPartieCourante ; De la partie courante
- mov ax,Nb_Coup_Solution
- mov bx,Nb_Coup_Part_Cour
-
- cmp ax,bx
-
- jl @@@@finito
-
- CALL RemplacerLaSolutionPlusLongue ;On Recoppie tout le fichier sauf la partie que l'on a deja
- ;Puis on Ré-ecrira la solution qui est plus petites
-
- @@OnEcrit:
- CALL EcritureDeEtatJeuSol
-
-
- @@@@finito:
- CALL effaceFichierTmp
- CALL exit
-
-
- main ENDP
-
- exit proc
- Call video
- mov ax,4C00h
- int 21h
-
-
- ret
- exit endp
-
- initSouris proc
- mov AX,00h
- int 33h
- ret
- initSouris endp
-
- pixel PROC
- pusha
- mov ah,0ch ;numéro du service
- mov bx,0000ch
- int 10h
- popa
- ret
- pixel ENDP
-
-
- affSouris proc
- mov ax,01h
- int 33h
- ret
- affSouris endp
-
- videoG PROC
-
- mov al,12h
- mov ah,00h
- int 10h
- ret
-
- videoG ENDP
-
- attend PROC
- mov ah,08h
- int 21h
- ret
- attend ENDP
-
- video proc
- pusha
- MOV AH,00h
- MOV AL,03h
- INT 10h
- popa
- ret
- video endp
-
- pion1 proc
- push cx
- push dx
- mov dx,0
- mov ax,deb_pion1
- mov bx,392
- mul bx
-
- pop dx
- pop cx
- inc cx
- inc dx
-
- mov CarreAX,cx
- mov CarreAY,dx
-
- add cx,tailleCarre
- add dx,tailleCarre
-
- mov CarreBX,cx
- mov CarreBY,dx
-
- mov bx,ax
- mov dx,CarreAY
-
- @@boucle2:
- mov cx,CarreAX
-
- @@boucle:
- mov ax,tabloImage[bx]
- mov ah,0
- shr ax,4
- CALL pixelBis
- inc cx
-
- mov ax,tabloImage[bx]
- shl ax,4
- mov ah,0
- shr ax,4
- CALL pixelBis
- inc bx
- inc cx
- cmp cx,CarreBX
- jne @@boucle
- inc dx
- cmp dx,CarreBY
- jne @@boucle2
-
- ret
- pion1 endp
- pion2 proc
- push cx
- push dx
- mov dx,0
- mov ax,deb_pion2
- mov bx,392
- mul bx
-
- pop dx
- pop cx
- inc cx
- inc dx
-
- mov CarreAX,cx
- mov CarreAY,dx
-
- add cx,tailleCarre
- add dx,tailleCarre
-
- mov CarreBX,cx
- mov CarreBY,dx
-
- mov bx,ax
- mov dx,CarreAY
- @@boucle2:
- mov cx,CarreAX
-
- @@boucle:
- mov ax,tabloImage[bx]
- mov ah,0
- shr ax,4
- CALL pixelBis
- inc cx
-
- mov ax,tabloImage[bx]
- shl ax,4
- mov ah,0
- shr ax,4
- CALL pixelBis
- inc bx
- inc cx
- cmp cx,CarreBX
- jne @@boucle
- inc dx
- cmp dx,CarreBY
- jne @@boucle2
-
- ret
- pion2 endp
- pixelBis PROC
- pusha
- mov ah,0ch ;numéro du service
- mov bx,0
- int 10h
- popa
- ret
- pixelBis ENDP
-
-
- FermerFichier PROC
- mov ah,3eh
- mov bx,handle
- int 21h
- ret
- FermerFichier ENDP
- EcritureDeEtatJeuSol PROC
- CALL PointeurDuFichierTemp
-
- mov aEcrire[0],243
- CALL EcrireUnCaract
- mov ax,longueur
- CALL EcrireLoLa
- EcrireDeuxCaract handle
- mov ax,largeur
- CALL EcrireLoLa
- EcrireDeuxCaract handle
- mov bx,0
- @@boucle:
-
- ;mov aEcrire[0],','-48 ; Permet d'avoir les virgules dans le fichier
- ;CALL EcrireUnCaract ;
-
-
- mov ah,0
- mov al,CaseClique[bx]
- mov dx,0
- mov cx,2
- div cx
- cmp dx,0
- je @@pasclique
- push bx
- mov ax,bx
- mov dx,0
- mov cx,10
- div cx
- mov aEcrire[0],al
- mov aEcrire[1],dl
- EcrireDeuxCaract handle
- pop bx
-
- @@pasclique:
-
- inc bx
- mov ax,longueur
- mul largeur
- cmp bx,ax
- jne @@boucle
-
-
- CALL FermerFichier
- ret
- EcritureDeEtatJeuSol ENDP
- PointeurDuFichierTemp PROC
- mov ah,42h
- mov al,0
- mov bx,HandleTemp
- mov dx,7
- mov cx,0
- int 21h
- ret
- PointeurDuFichierTemp ENDP
-
- pointeurDuFichier PROC
- mov ah,42h
- mov al,2
- mov bx,handle
- mov cx,0
- mov dx,0
- int 21h
- ret
- pointeurDuFichier ENDP
- LireLeFichierSolution PROC
-
- @@ttDebut:
- CALL RemiseAzero
- mov ah,3FH ;
- mov bx,handle ;
- mov cx,2 ; On place les 2 premiers caracteres du fichier dans le tablo caseSolution
- lea dx,caseSolution ;
- int 21h ;
-
- mov al,caseSolution[0]
- cmp al,'#'
- je @@fin
- cmp al,'-'
- je @@fin
- mov ah,caseSolution[1]
- sub al,48
- sub ah,48
- DeuxChiffreUnNb
- CALL RemetreDansTabloJeu
- jmp @@ttdebut
- @@fin:
- ret
- LireLeFichierSolution ENDP
- ; valeur ax passe en parametre
- RemetreDansTabloJeu PROC
- mov bx,cpt2
- mov jeu[bx],al
- inc cpt2
- ret
- RemetreDansTabloJeu ENDP
- EcrireUnCaract PROC
- pusha
- add aEcrire[0],48
- mov ah,40h
- mov bx,handle
- mov cx,1
- lea dx,aEcrire
- int 21h
- popa
- ret
- EcrireUnCaract ENDP
- handleDebut PROC
- mov ah,42h
- mov bx,handle
- mov al,0
- mov cx,0
- mov dx,0
- int 21h
- ret
- handleDebut ENDP
- RemiseAzero PROC
- mov bx,0
- @@boucle:
- mov CaseSolution[bx],'-'
- inc bx
- cmp bx,TailleCaseSOl
- jne @@boucle
- ret
- RemiseAzero ENDP
- CadreSolution PROC
- Cadre 540 320 620 360
- ret
- CadreSolution ENDP
-
- ClicBelin PROC
- @@clic :
-
- CALL clic_souris
- ;pixel va dans cx, dx
- cmp cx,225 ;
- jle @@next ; Bouton Yes
- cmp cx,265 ;
- jge @@next ;
- cmp dx,200 ;
- jle @@next ;
- cmp dx,230 ;
- jge @@next ;
- mov di,1
- jmp @@fin
- @@next:
- cmp cx,355 ;
- jle @@clic ; Bouton No
- cmp cx,395 ;
- jge @@clic ;
- cmp dx,200 ;
- jle @@clic ;
- cmp dx,230 ;
- jge @@clic ;
- mov di,2
-
- @@fin:
- ret
- ClicBelin ENDP
-
- clicSouris PROC
- @@clic :
- mov ax,3 ; Permet de revenir ici si le clic est "hors zone"
- jmp @@rebond
- mov ax,3
-
- @@rebond : ; Attendre que les boutons soient relâchés
- INT 33h
- CMP BX,0
- JNE @@rebond
- @@attend: ; Attente d'un clic gauche ou droit
- INT 33h
- CMP BX,0
-
- JE @@attend
- CMP BX,1
- JE @@st
- jmp @@clic
- ; Test de la zone …
- @@st :
- ;pixel va dans cx, dx
- cmp cx,540 ;
- jle @@clic ; Tant que le clic n est pas dans le quadrillage, refaire
- cmp cx,620 ;
- jge @@clic ;
- cmp dx,320 ; Me permet de ne plus devoir apres tester si le clic est hors zone
- jle @@clic ;
- cmp dx,360 ;
- jge @@clic ;
-
-
- ret
- clicSouris ENDP
- SolutionTxt PROC
- pointeur 68 21
-
- mov cl,0
- mov bx,0
- @@boucle:
- mov al,SolutionB[bx]
- pusha ;Affichage des caractere 1 par 1
- CALL AfficherUneChaineCaraParCaract ;Avec une fonte grise
- popa ;et la couleur du caractere rouge
- inc dl
- pointeur dl dh
- inc bx
- cmp bx,8
- jne @@boucle
- ret
- SolutionTxt ENDP
- AfficherUneChaineCaraParCaract PROC
- mov ah,09H
- mov bh,0
- mov cx,1
- mov bl,11110011b
- int 10h
- ret
- AfficherUneChaineCaraParCaract ENDP
-
- AfficherTexteSol PROC
- EcrireDuTxtEnRouge SolutionB, 69, 21, 8
- ret
- AfficherTexteSol ENDP
-
- AfficherTexteRejoue PROC
- EcrireDuTxtEnRouge Reprendre, 68, 21, 9
- ret
- AfficherTexteRejoue ENDP
- ;---------------------
- ; |
- ;Ecrit dans le fichier|
- ; Temporaire |
- ;---------------------
- EcrireDansFichierTemp PROC
- mov ax,bx
- mov dx,0
- mov cx,10
- div cx
- mov aEcrire[0],al
- mov aEcrire[1],dl
- EcrireDeuxCaract handleTemp
- ret
- EcrireDansFichierTemp ENDP
- ;---------------------
- ; |
- ;Ecrit dans un fichier|
- ; la Longueur et Lar |
- ;---------------------
-
- EcrireLoLa PROC
- mov dx,0
- mov bx,10
- div bx
- mov aEcrire[0],al
- mov aEcrire[1],dl
- ret
- EcrireLoLa ENDP
- ReprendreLaPartie PROC
-
- @@boucle:
- CALL RemiseAzero
- mov ah,3FH ;
- mov bx,handleTemp ;
- mov cx,2 ; On place les 2 premiers caracteres du fichier dans le tablo caseSolution
- lea dx,caseSolution ;
- int 21h ;
-
- cmp caseSolution[0],'-'
- je @@fin
-
- mov al,caseSolution[0] ;
- mov ah,caseSolution[1] ;
- sub al,48 ; On prend les deux premiers chiffres, on ne forme plus qu'un seul nb avec
- sub ah,48 ;
- ;
- DeuxChiffreUnNb ;
- push bx
- mov bx,ax
- inc CaseClique[bx]
- pop bx
- push ax
- CALL Fait_le
- CALL sleep ; On fait un pause de 2 seconde
- CALL sleep
- jmp @@boucle
- @@fin:
-
- ret
- ReprendreLaPartie ENDP
- sleep PROC
- pusha
- mov ah,2ch
- int 21h
- mov al,dh
- cmp al,59
- je @@next
- add al,1 ;Temps de la pause
- jmp @@boucle
- @@next:
- mov al,0
-
- @@boucle:
- push ax
- mov ah,2ch
- int 21h
- pop ax
- cmp al,0
- jne @@mouk
- cmp dh,59
- je @@boucle
-
- @@mouk:
- cmp dh,al
- jb @@boucle
-
- popa
- ret
- sleep ENDP
- Yes PROC
- Cadre 225 200 265 230
- EcrireDuTxtEnRouge YesTxt, 29, 13, 3
- CALL No
- ret
-
- Yes ENDP
- No Proc
- Cadre 355 200 395 230
- EcrireDuTxtEnRouge NoTxt, 46, 13, 2
- ret
- No ENDP
- ;---------------------------------
- ;Renvoi dans DI 1 si il trouve |
- ; et 0 si il trouve rien dans |
- ; le fichier solution |
- ;---------------------------------
- ;En sortie mon handleTemp pointe sur le caractere apres le ##NbLigNbCol
- reExist PROC
- CALL handleDebut
- mov di,0
-
- @@boucle:
- mov diese,'-'
- mov cx,1 ;Je prend le premier caractere
- lea dx,diese
- mov bx,handle ;
- mov ah,3fh ;
- int 21h
- mov di,0
-
- @@boucle2:
- cmp diese,'-'
- je @@fin
- cmp diese,'#'
- jne @@boucle
-
- mov cx,4 ;
- lea dx,CaseSolution ; On Place les 4 premiers caracteres dans le tablo CaseSolution
- mov bx,handle ;
- mov ah,3fh ;
- int 21h
-
- mov al,Casesolution[0] ; On place le premier chifre du fichier dans al
- mov ah,Casesolution[1] ; On place le seconds chifres du fichier dans ah
- sub al,48
- sub ah,48
- DeuxChiffreUnNb ; la macro place dans ax le nombre formé par ces deux chiffres
- cmp ax,longueur
- jne @@boucle
- mov al,Casesolution[2]
- mov ah,Casesolution[3]
- sub al,48
- sub ah,48
- DeuxChiffreUnNb
- cmp ax,largeur
- jne @@boucle
- mov di,1
- @@fin:
- ret
- reExist ENDP
-
- effaceFichierTmp PROC
- mov ah,41h
- lea dx,fichierTemp
- int 21h
- lea dx,recop
- mov ah,41h
- int 21h
- ret
- effaceFichierTmp ENDP
-
- aleatoirePion PROC
- CALL initrnd
- mov ax,1
- mov bx,18
- push ax
- push bx
-
- CALL random
- mov deb_pion1,ax
- @@SiMemeBouton:
- CALL initrnd
- mov ax,1
- mov bx,18
- push ax
- push bx
-
- CALL random
- cmp ax,deb_pion1
- je @@SiMemeBouton
- mov deb_pion2,ax
- ret
- aleatoirePion ENDP
- ImageDansTablo PROC
- CALL AleatoirePion ;Procedure qui genere Deux nombre aléatoire compris entre 1 et 18
- ;Puis qui le stock dans deb_pion1 et deb_pion2
-
- OuvrirFichier fichierIma ; On ouvre le fichier image
- mov handleIma,ax ; On place son Handle dans handleIma
-
-
- mov ah,3FH
- mov bx,handleIma ; On place dans un tablo les 7056 bytes qui composent le fichier
- mov cx,7056 ; image.hal
- lea dx,tabloImage
- int 21h
- ret
- ImageDansTablo ENDP
- ;-------------------------------------------------------------------------------
- ; Procedure utiliser dans le cas ou le fichier est existant
- ; Elle permet de tester si les longueur et largeur entre sont
- ; bien identique a celle se trouvant dans le fichier temporaire
- ; Place dans DI 1 si le fichier temporaire correspond bien a ce que l'on a entre comme valeur
- ; pour la LA et la LA, sinon place dans DI, 2
- ;-------------------------------------------------------------------------------
-
- TestSiFichierTemp PROC
- mov handleTemp,ax
-
- mov ah,3FH ;
- mov bx,handleTemp ;
- mov cx,6 ; On place les 6 premiers caracteres du fichier dans le tablo caseSolution
- lea dx,caseSolution ;
- int 21h ;
- mov al,caseSolution[2]
- mov ah,caseSolution[3]
- sub al,48
- sub ah,48
- DeuxChiffreUnNb
- cmp ax,longueur ;
- jne @@next ;
- mov al,caseSolution[4] ; Si longueur et largueur ne sont pas identiques
- mov ah,caseSolution[5] ; Alors on est dans le cas ou on commence une partie normale
- sub al,48
- sub ah,48
- DeuxChiffreUnNb
- cmp ax,largeur ;
- jne @@next ;
-
- CALL videoG
-
- pointeur 13 5
- text Reprise ;Affiche la question pour savoir ce que l'on veut faire, reprendre ou recommencer
- CALL Yes
- CALL Affsouris
- mov di,1
- jmp @@fin
- @@next:
- mov di,2
- @@fin:
- ret
- TestSiFichierTemp ENDP
- CreeFichierTemp PROC
-
- mov handleTemp,ax
- mov aEcrire[0],'#'-48
- mov aEcrire[1],'#'-48
- EcrireDeuxCaract handleTemp
- mov ax,longueur
- CALL EcrireLoLa
- EcrireDeuxCaract handleTemp
- mov ax,largeur
- CALL EcrireLoLa
- EcrireDeuxCaract handleTemp
-
- ret
- CreeFichierTemp ENDP
- CompterNbClic PROC
- mov Nb_Coup_Solution,0
-
- @@RePartitPourUnTour:
- CALL RemiseAzero
- CALL AvanceDeDeux
- cmp Casesolution[0],'-'
- je @@fin
- cmp Casesolution[0],'#'
- je @@fin
- inc Nb_Coup_Solution
- jmp @@RePartitPourUnTour
-
- @@fin:
-
- mov bx,2
- mov ax,Nb_Coup_Solution
- mov dx,0
- div bx
- push ax
-
-
-
- mov al,1
- mov ah,42h ;
- mov bx,handle ; Ne pas oublier de se replacer la ou j'etais dans le fichier
- pop dx
- mov cx,0 ;
-
- ret
- CompterNbClic ENDP
- AvanceDeDeux PROC
- mov cx,2
- lea dx,CaseSolution ;
- mov bx,handle ; Je place 2 bytes dans le fichier CaseSolution
- mov ah,3fh ;
- int 21h
-
- ret
- AvanceDeDeux ENDP
-
- NbClicPartieCourante PROC
- mov Nb_Coup_Part_Cour,0
- mov ax,Longueur
- mov dx,0
- mul largeur
-
- mov bx,ax
- @@boucle:
- mov ah,0
- mov al,CaseClique[bx]
- mov dx,0
- mov cx,2
- div cx
- cmp dx,0
- je @@suite
- inc Nb_Coup_Part_Cour
- @@suite:
- dec bx
- cmp bx,0
- jg @@boucle
- ret
- NbClicPartieCourante ENDP
- pointSolDeb PROC
- mov ah,42h
- mov al,0
- mov cx,0
- mov dx,0
- mov bx,handle ;On positionne le pointeur du fichier Temporaire tout au debut du fichier
- int 21h
- mov ah,42h
- mov bx,Handlerecop ;On fait la meme chose pour le fichier .tmp
- int 21h
- ret
- pointSolDeb ENDP
- RemplacerLaSolutionPlusLongue PROC
- CreeFichier recop
- mov handleRecop,ax
- CALL pointSolDeb ;On place le handle au debut du fichier Solution
- @@boucle:
- CALL RemiseAzero
- AvanceDeUn handle 1
- cmp CaseSolution[0],'-'
-
- je @@RecopieFini
-
- mov al,CaseSolution[0]
- mov aEcrire,al
- mov ah,40h ;
- mov bx,handleRecop ;
- mov cx,1 ; Tant que on est pas a la fin du fichier, on ecrit le caractere dans le fichier Temp
- lea dx,aEcrire[0] ;
- int 21h ;
-
- jmp @@boucle
-
- @@RecopieFini:
-
- CreeFichier fichierSol ;Apres sauveguarde dans le fichier .tmp, on le recrée pour le vider
- CALL pointSolDeb
- ;-------------------------------------------------------------------------------------------------------
- ;
- ; Maintenant on recopie tout le fichier en analysant a chaque fois ce qu'il y a apres le diese
- ; si c'est identique a LO et LA alors on copie pas
- ; Sinon on recopie
- ;-------------------------------------------------------------------------------------------------------
-
- @@@@boucle:
- CALL RemiseAzero
-
- AvanceDeUn handleRecop 1
- cmp CaseSolution[0],'-'
- je @@fin
- cmp caseSolution[0],'#'
- jne @@@@boucle
- @@Reprendre:
-
- AvanceDeUn handleRecop 4
-
- mov al,caseSolution[0]
- mov ah,caseSolution[1]
- sub al,48
- sub ah,48
- DeuxChiffreUnNb
- cmp ax,longueur ;
- je @@@@boucle ;
- mov al,caseSolution[2] ; Si longueur et largueur ne sont pas identiques
- mov ah,caseSolution[3] ; Alors on est dans le cas ou on commence une partie normale
- sub al,48
- sub ah,48
- DeuxChiffreUnNb
- cmp ax,largeur ;
- je @@@@boucle ;
-
-
- ;--------------------------------------------------------------
- mov aEcrire,'#'-48
- CALL EcrireUnCaract
- mov ah,40h ;
- mov bx,handle ; On ecrit l'indexe
- mov cx,4 ;
- lea dx,CaseSolution
- int 21h
- ;--------------------------------------------------------------
- @@ImprimerDansFichier:
- CALL RemiseAzero
- AvanceDeUn handleRecop 1
- cmp CaseSolution[0],'-'
- je @@fin
- cmp CaseSolution[0],'#'
- je @@Reprendre
-
- mov al,CaseSolution[0]
- mov aEcrire,al
- mov ah,40h ;
- mov bx,handle ;
- mov cx,1 ; Tant que on est pas a la fin du fichier ou a un diese, on ecrit le caractere dans le fichier
- ; Solution
- lea dx,aEcrire ;
- int 21h
- jmp @@ImprimerDansFichier
-
- @@fin:
- CALL effaceFichierTmp
- ret
- RemplacerLaSolutionPlusLongue ENDP
- AfficherEnTete PROC
- PUSHa
- MOV ES,INI
- mov bx,0
- mov si,0
- MOV BX,Y*80*2+X*2
- ; Invariants : DI indice dans le tableau Cadre
- ; SI indice ecran
- SUB DI,DI
- SUB SI,SI
- MOV AH,Attribut
- @@lp1:
- MOV AL,[entete]+DI ; caractere a ecrire
- MOV ES:[BX+SI],AX ; position du caractere
- INC SI ; un caractere = 2 bytes
- INC SI
- INC DI
- ; Test fin de ligne
- CMP SI,LARGEUREntete*2
- JB @@lp1
- ; Passage a la ligne suivante
- SUB SI,SI
- ADD BX,80*2
- ; Test fin du cadre
- CMP DI,(LARGEUREntete+1)*HAUTEUREntete
- JB @@lp1
- mov SI,0
- @@boucle:
- mov bh,Attribut
- mov bl,appuyerSurUneTouche[SI]
- push SI
- mov ax,SI
- mov cx,2
- mul cx
- mov SI,ax
- MOV ES:[2750+SI],BX ; position du caractere
- pop SI
- inc SI
- mov cx,TailleChaineAppuyer
- cmp SI,cx
- jle @@boucle
- POPa
- RET
- AfficherEnTete ENDP
- ;----------------------
- ; |
- ; Procedure qui vide |
- ; le buffer |
- ;----------------------
- VideMoi PROC
- pusha
- mov AX,0C00H
- int 21h
- popa
- ret
- VideMoi ENDP
-
- END main
; ASM 2 – Le jeu du Ping
;
; Auteur : Neoplayer
; Date : Mars 2005
; Description : Jeu du ping, petit jeu ou le but est
; de retourner toute les cases, sauveguarde des solution dans des fichiers.
;==========================================================
.model small
.stack 100h
.486
locals
jumps
AvanceDeUn MACRO handleEnParam, NbCaract
mov cx,NbCaract
lea dx,CaseSolution ;
mov bx,handleEnParam ; Je place 1 bytes dans le fichier CaseSolution
mov ah,3fh ;
int 21h
ENDM AvanceDeUn
;--------------------
; |
;Placement du curseur|
; |
;--------------------
pointeur MACRO X, Y
mov dl,X
mov dh,Y
mov bh,0
mov ah,02h ;appel de l'interruption pour placer mon curseur a la position
int 10h ;AX AY
ENDM pointeur
;--------------------
; |
;Affichage de texte |
; |
;--------------------
text MACRO txt
mov ah,09h ; Intérruption affichant du Text
lea dx,txt
int 21h
ENDM text
;--------------------
; | ;Valeur en entre dans al et ah
;Transforme 2 chifs | ;Valeur de sortie dans ax
; en 1 Nb |
;--------------------
DeuxChiffreUnNb MACRO
mov cl,ah
mov ah,0
mov dl,10
mul dl
add al,cl
ENDM DeuxChiffreUnNb
EcrireDeuxCaract MACRO handleBelin
pusha
add aEcrire[0],48
add aEcrire[1],48
mov ah,40h
mov bx,handleBelin
mov cx,2
lea dx,aEcrire
int 21h
popa
ENDM EcrireDeuxCaract
EcrireDuTxtEnRouge MACRO LeTexte, PosX, PosY, NbCaract
mov dl,PosX
mov dh,PosY
pointeur PosX PosY
mov cl,0
mov bx,0
@@boucle:
mov al,LeTexte[bx]
pusha ;Affichage des caractere 1 par 1
CALL AfficherUneChaineCaraParCaract ;Avec une fonte grise
popa ;et la couleur du caractere rouge
inc dl
pointeur dl dh
inc bx
cmp bx,NbCaract
jne @@boucle
ENDM EcrireDuTxtEnRouge
Cadre MACRO XA, YA, XB, YB
mov al,blanc
mov dx,YA
mov cx,XA
@@BordHaut: ;
CALL pixel ; Trace la ligne blanche du haut pour l effet 3d
inc cx ;
cmp cx,XB ;
jne @@BordHaut ;
mov al,gris
@@redebut: ; Passe a la ligne et on retrace
mov cx,XA
inc dx
@@debut: ;
CALL pixel ; Tracage d'une ligne horrizontal
inc cx ;
cmp cx,XB ;
jne @@debut ;
cmp dx,YB
jne @@redebut
mov al,noir ; Tracage de la derniere ligne en noir pour un effet 3d
mov cx,XA
@@BordBas:
CALL pixel
inc cx
cmp cx,XB
jne @@BordBas
mov cx,XB
mov dx,YA
@@BordDroite: ; Tracage de la ligne de droite pour un effet 3d
CALL pixel
inc dx
cmp dx,YB
jle @@BordDroite
mov dx,YA
mov cx,XA
mov al,blanc
@@BordGauche: ; Tracage de la ligne de gauche pour un effet 3d
CALL pixel
inc dx
cmp dx,YB
jl @@BordGauche
ENDM Cadre
;------------------------------------------------------------------------------------------------
; Macro des gestions de fichier
;------------------------------------------------------------------------------------------------
OuvrirFichier MACRO fichier ;
mov ah,3DH ;
mov al,2 ; Ouvrir un fichier
lea dx,fichier ;
int 21h ;
ENDM OuvrirFichier
CreeFichier MACRO fichier ;
mov ah,3CH ; Macro qui créé un fichier avec le nom du fichier fournit en param
mov cx,000000000b ; Elle retourne dans ax le Handle
lea dx,fichier ;
int 21h ;
ENDM CreeFichier ;
;------------------------------------------------------------------------------------------------
; Procedure et variable a exporter, ou à importer
;------------------------------------------------------------------------------------------------
extrn Solution : proc
extrn tailleDamier :proc
extrn damier :proc
extrn clic_souris:proc
extrn un_coup:proc
extrn verif_gagner:proc
extrn fait_le:proc
extrn initrnd:proc
extrn random:proc
extrn v1
extrn longueur
extrn largeur
extrn etat_jeu:proc
public jeu
public pion1
public pion2
public exit
;------------------------------------------------------------------------------------------------
; Mes Variables
;------------------------------------------------------------------------------------------------
.data
;Tout ce qui est pour l'affichage de l'entete en ecrivant direct dans la mem video
;------------------------------------------------------------------------------
Y EQU 5
X EQU 25
INI DW 0B800h
Attribut EQU 0001111b
LARGEUREntete EQU 28
HAUTEUREntete EQU 5 ; en fait hauteur - 1
;-----------------------------------------------------------------------------
efface equ 'A'
blanc equ 0Fh
rouge equ 04h
bleu equ 01h
gris equ 07h
noir equ 08h
tailleCarre equ 28
TailleCaseSOl equ 6
Temps_de_Pause equ 2
CarreAX dw ?
CarreAY dw ?
CarreBX dw ?
CarreBY dw ?
cpt2 dw 0
Nb_Coup_Solution dw 0
Nb_Coup_Part_Cour dw 0
Reprise db "Voulez vous reprendre l'ancienne partie commencer ?",'$'
appuyerSurUneTouche db "Veuillez appuyer sur une touche pour continuer."
TailleChaineAppuyer equ 47
reprendrePartie db " Reprise de la patie en cours, veuillez patienter",'$'
PasDImage db " Le fichier Image.hal n'a pu etre trouve ",'$'
YesTxt db "Yes",'$'
NoTxt db "No",'$'
SolutionB db "Solution",'$'
Reprendre db "Reprendre",'$'
PasDeSol db " Pas de solution presente",'$'
entete DB ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ',187
DB ' º Neoplayer º'
DB ' º º'
DB ' ',204,'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ',185
DB ' ','º Jeu du Ping º'
DB ,'ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ'
diese db ?
fichierSol db 'Solution.txt',0
fichierTemp db 'ping_tem.txt',0
fichierIma db 'image.hal',0
recop db 'recop.tmp',0
handle dw ? ;Handle de fichierSol
handleTemp dw ? ;Handle de fichierTemp
handleIma dw ? ;Handle de fichierIma
handleRecop dw ? ;Handle de recopie
CaseClique db 100 dup(0) ; Tablo des clic de la partie ;CaseClique
CaseSolution db TailleCaseSOl dup('-')
tabloImage dw 7056 dup(0)
deb_pion1 dw ?
deb_pion2 dw ?
jeu db 100 dup (0)
aEcrire db 2 dup(0)
.code
;----------------------------------------------------------------------------------------------------
; Debut du Main
;----------------------------------------------------------------------------------------------------
main proc
mov ax,@data
mov ds,ax
CALL ImageDansTablo ; Genere les nombres aleatoire + ouvre fichier image.hal
; Place tout le fichier dans le tablo tabloImage
CALL video
CALL AfficherEnTete
CALL attend
OuvrirFichier fichierSol ; J'essaye d'ouvrir le fichier Solution.txt
jc @@FichierNonExistant ; Je teste le carry flag si il est a 1, c que le fichier existe pas
; d ou la necessiter de le créer
jmp @@FichierExistant
@@FichierNonExistant:
CreeFichier fichierSol
@@FichierExistant:
mov handle,ax ; Je sauveguarde le handle
CALL pointeurDuFichier ;On pointe sur la fin du fichier pour ne pas effacer ce qui si trouve deja
CALL video ;a remplacer plus tard avec un nettoyage ecran avec le 0b800....
CALL tailleDamier ;Initialisation de variables (avec demande des entre pour lg et la
;----------------------------------------------------------------------------------------------------------------
; J'ouvre le fichier Temporaire de la partie precedente
; Je teste si les 2 et 3 eme caractere sont egale a ce qui a été cliqué
; Si c egale alors je propose a l'utilisateur de reprendre la partie la ou elle en etait la derniere fois.
;----------------------------------------------------------------------------------------------------------------
OuvrirFichier fichierTemp ; On essaye d'ouvrir le fichier, si on y arrive pas
mov handleTemp,bx
jc @@@@FichierNonExistant
jmp @@SuiteNext
@@@@FichierNonExistant:
;On le créée
CreeFichier fichierTemp
mov handleTemp,bx
CALL CreeFichierTemp ;On cree le fichier Temp avec la bonne syntaxe
jmp @@@@ZeDebut
@@SuiteNext:
CALL TestSiFichierTemp ; On teste pour savoir si le fichier temporaire contient bien la meme Lo et LA
; Renvoi 1 dans DI si c la meme chose, 2 dans les autres cas
cmp di,2
je @@@@FichierNonExistant
CALL ClicBelin
cmp di,1 ;On reprend la partie si DI = 2
je @@@@suite
jmp @@@@FichierNonExistant
@@@@suite:
CALL videoG
CALL damier
pointeur 8 28
text reprendrePartie
CALL ReprendreLaPartie
jmp @@@@@@debut
@@@@ZeDebut:
CALL videoG
CALL damier
@@@@@@debut:
CALL CadreSolution ;Appel la macro Cadre trace un cadre avec les coordonées fournit en parametre
CALL AfficherTexteSol
@@@@debut:
CALL affSouris
CALL Un_Coup
cmp di,1
jne @@next
CALL reExist ; On teste pour savoir si il y a bien une solution
cmp di,1 ; dans le fichier solution
je @@@@@@next
pointeur 8 28
text PasDeSol
jmp @@@@debut
@@@@@@next:
mov cpt2,0
CALL LireLeFichierSolution
CALL videoG
CALL CadreSolution
CALL AfficherTexteRejoue
push cpt2
CALL solution
CALL affSouris
CALL clicSouris
CALL videoG
CALL Etat_jeu
jmp @@@@@@debut
@@next:
;------------------------ Ecriture dans le fichier Temporaire
mov bx,v1
inc CaseClique[bx] ; On incremente de 1 l'endroit ou on a cliquer
CALL EcrireDansFichierTemp
;-----------------------
CALL verif_gagner
CMP al,1
Jne @@@@debut
CALL VideMoi
CALL attend
CALL video ;nettoye l'ecran et quitte
CALL reExist
cmp di,0
je @@OnEcrit
CALL CompterNbClic ; Dans le fichier solution
CALL NbClicPartieCourante ; De la partie courante
mov ax,Nb_Coup_Solution
mov bx,Nb_Coup_Part_Cour
cmp ax,bx
jl @@@@finito
CALL RemplacerLaSolutionPlusLongue ;On Recoppie tout le fichier sauf la partie que l'on a deja
;Puis on Ré-ecrira la solution qui est plus petites
@@OnEcrit:
CALL EcritureDeEtatJeuSol
@@@@finito:
CALL effaceFichierTmp
CALL exit
main ENDP
exit proc
Call video
mov ax,4C00h
int 21h
ret
exit endp
initSouris proc
mov AX,00h
int 33h
ret
initSouris endp
pixel PROC
pusha
mov ah,0ch ;numéro du service
mov bx,0000ch
int 10h
popa
ret
pixel ENDP
affSouris proc
mov ax,01h
int 33h
ret
affSouris endp
videoG PROC
mov al,12h
mov ah,00h
int 10h
ret
videoG ENDP
attend PROC
mov ah,08h
int 21h
ret
attend ENDP
video proc
pusha
MOV AH,00h
MOV AL,03h
INT 10h
popa
ret
video endp
pion1 proc
push cx
push dx
mov dx,0
mov ax,deb_pion1
mov bx,392
mul bx
pop dx
pop cx
inc cx
inc dx
mov CarreAX,cx
mov CarreAY,dx
add cx,tailleCarre
add dx,tailleCarre
mov CarreBX,cx
mov CarreBY,dx
mov bx,ax
mov dx,CarreAY
@@boucle2:
mov cx,CarreAX
@@boucle:
mov ax,tabloImage[bx]
mov ah,0
shr ax,4
CALL pixelBis
inc cx
mov ax,tabloImage[bx]
shl ax,4
mov ah,0
shr ax,4
CALL pixelBis
inc bx
inc cx
cmp cx,CarreBX
jne @@boucle
inc dx
cmp dx,CarreBY
jne @@boucle2
ret
pion1 endp
pion2 proc
push cx
push dx
mov dx,0
mov ax,deb_pion2
mov bx,392
mul bx
pop dx
pop cx
inc cx
inc dx
mov CarreAX,cx
mov CarreAY,dx
add cx,tailleCarre
add dx,tailleCarre
mov CarreBX,cx
mov CarreBY,dx
mov bx,ax
mov dx,CarreAY
@@boucle2:
mov cx,CarreAX
@@boucle:
mov ax,tabloImage[bx]
mov ah,0
shr ax,4
CALL pixelBis
inc cx
mov ax,tabloImage[bx]
shl ax,4
mov ah,0
shr ax,4
CALL pixelBis
inc bx
inc cx
cmp cx,CarreBX
jne @@boucle
inc dx
cmp dx,CarreBY
jne @@boucle2
ret
pion2 endp
pixelBis PROC
pusha
mov ah,0ch ;numéro du service
mov bx,0
int 10h
popa
ret
pixelBis ENDP
FermerFichier PROC
mov ah,3eh
mov bx,handle
int 21h
ret
FermerFichier ENDP
EcritureDeEtatJeuSol PROC
CALL PointeurDuFichierTemp
mov aEcrire[0],243
CALL EcrireUnCaract
mov ax,longueur
CALL EcrireLoLa
EcrireDeuxCaract handle
mov ax,largeur
CALL EcrireLoLa
EcrireDeuxCaract handle
mov bx,0
@@boucle:
;mov aEcrire[0],','-48 ; Permet d'avoir les virgules dans le fichier
;CALL EcrireUnCaract ;
mov ah,0
mov al,CaseClique[bx]
mov dx,0
mov cx,2
div cx
cmp dx,0
je @@pasclique
push bx
mov ax,bx
mov dx,0
mov cx,10
div cx
mov aEcrire[0],al
mov aEcrire[1],dl
EcrireDeuxCaract handle
pop bx
@@pasclique:
inc bx
mov ax,longueur
mul largeur
cmp bx,ax
jne @@boucle
CALL FermerFichier
ret
EcritureDeEtatJeuSol ENDP
PointeurDuFichierTemp PROC
mov ah,42h
mov al,0
mov bx,HandleTemp
mov dx,7
mov cx,0
int 21h
ret
PointeurDuFichierTemp ENDP
pointeurDuFichier PROC
mov ah,42h
mov al,2
mov bx,handle
mov cx,0
mov dx,0
int 21h
ret
pointeurDuFichier ENDP
LireLeFichierSolution PROC
@@ttDebut:
CALL RemiseAzero
mov ah,3FH ;
mov bx,handle ;
mov cx,2 ; On place les 2 premiers caracteres du fichier dans le tablo caseSolution
lea dx,caseSolution ;
int 21h ;
mov al,caseSolution[0]
cmp al,'#'
je @@fin
cmp al,'-'
je @@fin
mov ah,caseSolution[1]
sub al,48
sub ah,48
DeuxChiffreUnNb
CALL RemetreDansTabloJeu
jmp @@ttdebut
@@fin:
ret
LireLeFichierSolution ENDP
; valeur ax passe en parametre
RemetreDansTabloJeu PROC
mov bx,cpt2
mov jeu[bx],al
inc cpt2
ret
RemetreDansTabloJeu ENDP
EcrireUnCaract PROC
pusha
add aEcrire[0],48
mov ah,40h
mov bx,handle
mov cx,1
lea dx,aEcrire
int 21h
popa
ret
EcrireUnCaract ENDP
handleDebut PROC
mov ah,42h
mov bx,handle
mov al,0
mov cx,0
mov dx,0
int 21h
ret
handleDebut ENDP
RemiseAzero PROC
mov bx,0
@@boucle:
mov CaseSolution[bx],'-'
inc bx
cmp bx,TailleCaseSOl
jne @@boucle
ret
RemiseAzero ENDP
CadreSolution PROC
Cadre 540 320 620 360
ret
CadreSolution ENDP
ClicBelin PROC
@@clic :
CALL clic_souris
;pixel va dans cx, dx
cmp cx,225 ;
jle @@next ; Bouton Yes
cmp cx,265 ;
jge @@next ;
cmp dx,200 ;
jle @@next ;
cmp dx,230 ;
jge @@next ;
mov di,1
jmp @@fin
@@next:
cmp cx,355 ;
jle @@clic ; Bouton No
cmp cx,395 ;
jge @@clic ;
cmp dx,200 ;
jle @@clic ;
cmp dx,230 ;
jge @@clic ;
mov di,2
@@fin:
ret
ClicBelin ENDP
clicSouris PROC
@@clic :
mov ax,3 ; Permet de revenir ici si le clic est "hors zone"
jmp @@rebond
mov ax,3
@@rebond : ; Attendre que les boutons soient relâchés
INT 33h
CMP BX,0
JNE @@rebond
@@attend: ; Attente d'un clic gauche ou droit
INT 33h
CMP BX,0
JE @@attend
CMP BX,1
JE @@st
jmp @@clic
; Test de la zone …
@@st :
;pixel va dans cx, dx
cmp cx,540 ;
jle @@clic ; Tant que le clic n est pas dans le quadrillage, refaire
cmp cx,620 ;
jge @@clic ;
cmp dx,320 ; Me permet de ne plus devoir apres tester si le clic est hors zone
jle @@clic ;
cmp dx,360 ;
jge @@clic ;
ret
clicSouris ENDP
SolutionTxt PROC
pointeur 68 21
mov cl,0
mov bx,0
@@boucle:
mov al,SolutionB[bx]
pusha ;Affichage des caractere 1 par 1
CALL AfficherUneChaineCaraParCaract ;Avec une fonte grise
popa ;et la couleur du caractere rouge
inc dl
pointeur dl dh
inc bx
cmp bx,8
jne @@boucle
ret
SolutionTxt ENDP
AfficherUneChaineCaraParCaract PROC
mov ah,09H
mov bh,0
mov cx,1
mov bl,11110011b
int 10h
ret
AfficherUneChaineCaraParCaract ENDP
AfficherTexteSol PROC
EcrireDuTxtEnRouge SolutionB, 69, 21, 8
ret
AfficherTexteSol ENDP
AfficherTexteRejoue PROC
EcrireDuTxtEnRouge Reprendre, 68, 21, 9
ret
AfficherTexteRejoue ENDP
;---------------------
; |
;Ecrit dans le fichier|
; Temporaire |
;---------------------
EcrireDansFichierTemp PROC
mov ax,bx
mov dx,0
mov cx,10
div cx
mov aEcrire[0],al
mov aEcrire[1],dl
EcrireDeuxCaract handleTemp
ret
EcrireDansFichierTemp ENDP
;---------------------
; |
;Ecrit dans un fichier|
; la Longueur et Lar |
;---------------------
EcrireLoLa PROC
mov dx,0
mov bx,10
div bx
mov aEcrire[0],al
mov aEcrire[1],dl
ret
EcrireLoLa ENDP
ReprendreLaPartie PROC
@@boucle:
CALL RemiseAzero
mov ah,3FH ;
mov bx,handleTemp ;
mov cx,2 ; On place les 2 premiers caracteres du fichier dans le tablo caseSolution
lea dx,caseSolution ;
int 21h ;
cmp caseSolution[0],'-'
je @@fin
mov al,caseSolution[0] ;
mov ah,caseSolution[1] ;
sub al,48 ; On prend les deux premiers chiffres, on ne forme plus qu'un seul nb avec
sub ah,48 ;
;
DeuxChiffreUnNb ;
push bx
mov bx,ax
inc CaseClique[bx]
pop bx
push ax
CALL Fait_le
CALL sleep ; On fait un pause de 2 seconde
CALL sleep
jmp @@boucle
@@fin:
ret
ReprendreLaPartie ENDP
sleep PROC
pusha
mov ah,2ch
int 21h
mov al,dh
cmp al,59
je @@next
add al,1 ;Temps de la pause
jmp @@boucle
@@next:
mov al,0
@@boucle:
push ax
mov ah,2ch
int 21h
pop ax
cmp al,0
jne @@mouk
cmp dh,59
je @@boucle
@@mouk:
cmp dh,al
jb @@boucle
popa
ret
sleep ENDP
Yes PROC
Cadre 225 200 265 230
EcrireDuTxtEnRouge YesTxt, 29, 13, 3
CALL No
ret
Yes ENDP
No Proc
Cadre 355 200 395 230
EcrireDuTxtEnRouge NoTxt, 46, 13, 2
ret
No ENDP
;---------------------------------
;Renvoi dans DI 1 si il trouve |
; et 0 si il trouve rien dans |
; le fichier solution |
;---------------------------------
;En sortie mon handleTemp pointe sur le caractere apres le ##NbLigNbCol
reExist PROC
CALL handleDebut
mov di,0
@@boucle:
mov diese,'-'
mov cx,1 ;Je prend le premier caractere
lea dx,diese
mov bx,handle ;
mov ah,3fh ;
int 21h
mov di,0
@@boucle2:
cmp diese,'-'
je @@fin
cmp diese,'#'
jne @@boucle
mov cx,4 ;
lea dx,CaseSolution ; On Place les 4 premiers caracteres dans le tablo CaseSolution
mov bx,handle ;
mov ah,3fh ;
int 21h
mov al,Casesolution[0] ; On place le premier chifre du fichier dans al
mov ah,Casesolution[1] ; On place le seconds chifres du fichier dans ah
sub al,48
sub ah,48
DeuxChiffreUnNb ; la macro place dans ax le nombre formé par ces deux chiffres
cmp ax,longueur
jne @@boucle
mov al,Casesolution[2]
mov ah,Casesolution[3]
sub al,48
sub ah,48
DeuxChiffreUnNb
cmp ax,largeur
jne @@boucle
mov di,1
@@fin:
ret
reExist ENDP
effaceFichierTmp PROC
mov ah,41h
lea dx,fichierTemp
int 21h
lea dx,recop
mov ah,41h
int 21h
ret
effaceFichierTmp ENDP
aleatoirePion PROC
CALL initrnd
mov ax,1
mov bx,18
push ax
push bx
CALL random
mov deb_pion1,ax
@@SiMemeBouton:
CALL initrnd
mov ax,1
mov bx,18
push ax
push bx
CALL random
cmp ax,deb_pion1
je @@SiMemeBouton
mov deb_pion2,ax
ret
aleatoirePion ENDP
ImageDansTablo PROC
CALL AleatoirePion ;Procedure qui genere Deux nombre aléatoire compris entre 1 et 18
;Puis qui le stock dans deb_pion1 et deb_pion2
OuvrirFichier fichierIma ; On ouvre le fichier image
mov handleIma,ax ; On place son Handle dans handleIma
mov ah,3FH
mov bx,handleIma ; On place dans un tablo les 7056 bytes qui composent le fichier
mov cx,7056 ; image.hal
lea dx,tabloImage
int 21h
ret
ImageDansTablo ENDP
;-------------------------------------------------------------------------------
; Procedure utiliser dans le cas ou le fichier est existant
; Elle permet de tester si les longueur et largeur entre sont
; bien identique a celle se trouvant dans le fichier temporaire
; Place dans DI 1 si le fichier temporaire correspond bien a ce que l'on a entre comme valeur
; pour la LA et la LA, sinon place dans DI, 2
;-------------------------------------------------------------------------------
TestSiFichierTemp PROC
mov handleTemp,ax
mov ah,3FH ;
mov bx,handleTemp ;
mov cx,6 ; On place les 6 premiers caracteres du fichier dans le tablo caseSolution
lea dx,caseSolution ;
int 21h ;
mov al,caseSolution[2]
mov ah,caseSolution[3]
sub al,48
sub ah,48
DeuxChiffreUnNb
cmp ax,longueur ;
jne @@next ;
mov al,caseSolution[4] ; Si longueur et largueur ne sont pas identiques
mov ah,caseSolution[5] ; Alors on est dans le cas ou on commence une partie normale
sub al,48
sub ah,48
DeuxChiffreUnNb
cmp ax,largeur ;
jne @@next ;
CALL videoG
pointeur 13 5
text Reprise ;Affiche la question pour savoir ce que l'on veut faire, reprendre ou recommencer
CALL Yes
CALL Affsouris
mov di,1
jmp @@fin
@@next:
mov di,2
@@fin:
ret
TestSiFichierTemp ENDP
CreeFichierTemp PROC
mov handleTemp,ax
mov aEcrire[0],'#'-48
mov aEcrire[1],'#'-48
EcrireDeuxCaract handleTemp
mov ax,longueur
CALL EcrireLoLa
EcrireDeuxCaract handleTemp
mov ax,largeur
CALL EcrireLoLa
EcrireDeuxCaract handleTemp
ret
CreeFichierTemp ENDP
CompterNbClic PROC
mov Nb_Coup_Solution,0
@@RePartitPourUnTour:
CALL RemiseAzero
CALL AvanceDeDeux
cmp Casesolution[0],'-'
je @@fin
cmp Casesolution[0],'#'
je @@fin
inc Nb_Coup_Solution
jmp @@RePartitPourUnTour
@@fin:
mov bx,2
mov ax,Nb_Coup_Solution
mov dx,0
div bx
push ax
mov al,1
mov ah,42h ;
mov bx,handle ; Ne pas oublier de se replacer la ou j'etais dans le fichier
pop dx
mov cx,0 ;
ret
CompterNbClic ENDP
AvanceDeDeux PROC
mov cx,2
lea dx,CaseSolution ;
mov bx,handle ; Je place 2 bytes dans le fichier CaseSolution
mov ah,3fh ;
int 21h
ret
AvanceDeDeux ENDP
NbClicPartieCourante PROC
mov Nb_Coup_Part_Cour,0
mov ax,Longueur
mov dx,0
mul largeur
mov bx,ax
@@boucle:
mov ah,0
mov al,CaseClique[bx]
mov dx,0
mov cx,2
div cx
cmp dx,0
je @@suite
inc Nb_Coup_Part_Cour
@@suite:
dec bx
cmp bx,0
jg @@boucle
ret
NbClicPartieCourante ENDP
pointSolDeb PROC
mov ah,42h
mov al,0
mov cx,0
mov dx,0
mov bx,handle ;On positionne le pointeur du fichier Temporaire tout au debut du fichier
int 21h
mov ah,42h
mov bx,Handlerecop ;On fait la meme chose pour le fichier .tmp
int 21h
ret
pointSolDeb ENDP
RemplacerLaSolutionPlusLongue PROC
CreeFichier recop
mov handleRecop,ax
CALL pointSolDeb ;On place le handle au debut du fichier Solution
@@boucle:
CALL RemiseAzero
AvanceDeUn handle 1
cmp CaseSolution[0],'-'
je @@RecopieFini
mov al,CaseSolution[0]
mov aEcrire,al
mov ah,40h ;
mov bx,handleRecop ;
mov cx,1 ; Tant que on est pas a la fin du fichier, on ecrit le caractere dans le fichier Temp
lea dx,aEcrire[0] ;
int 21h ;
jmp @@boucle
@@RecopieFini:
CreeFichier fichierSol ;Apres sauveguarde dans le fichier .tmp, on le recrée pour le vider
CALL pointSolDeb
;-------------------------------------------------------------------------------------------------------
;
; Maintenant on recopie tout le fichier en analysant a chaque fois ce qu'il y a apres le diese
; si c'est identique a LO et LA alors on copie pas
; Sinon on recopie
;-------------------------------------------------------------------------------------------------------
@@@@boucle:
CALL RemiseAzero
AvanceDeUn handleRecop 1
cmp CaseSolution[0],'-'
je @@fin
cmp caseSolution[0],'#'
jne @@@@boucle
@@Reprendre:
AvanceDeUn handleRecop 4
mov al,caseSolution[0]
mov ah,caseSolution[1]
sub al,48
sub ah,48
DeuxChiffreUnNb
cmp ax,longueur ;
je @@@@boucle ;
mov al,caseSolution[2] ; Si longueur et largueur ne sont pas identiques
mov ah,caseSolution[3] ; Alors on est dans le cas ou on commence une partie normale
sub al,48
sub ah,48
DeuxChiffreUnNb
cmp ax,largeur ;
je @@@@boucle ;
;--------------------------------------------------------------
mov aEcrire,'#'-48
CALL EcrireUnCaract
mov ah,40h ;
mov bx,handle ; On ecrit l'indexe
mov cx,4 ;
lea dx,CaseSolution
int 21h
;--------------------------------------------------------------
@@ImprimerDansFichier:
CALL RemiseAzero
AvanceDeUn handleRecop 1
cmp CaseSolution[0],'-'
je @@fin
cmp CaseSolution[0],'#'
je @@Reprendre
mov al,CaseSolution[0]
mov aEcrire,al
mov ah,40h ;
mov bx,handle ;
mov cx,1 ; Tant que on est pas a la fin du fichier ou a un diese, on ecrit le caractere dans le fichier
; Solution
lea dx,aEcrire ;
int 21h
jmp @@ImprimerDansFichier
@@fin:
CALL effaceFichierTmp
ret
RemplacerLaSolutionPlusLongue ENDP
AfficherEnTete PROC
PUSHa
MOV ES,INI
mov bx,0
mov si,0
MOV BX,Y*80*2+X*2
; Invariants : DI indice dans le tableau Cadre
; SI indice ecran
SUB DI,DI
SUB SI,SI
MOV AH,Attribut
@@lp1:
MOV AL,[entete]+DI ; caractere a ecrire
MOV ES:[BX+SI],AX ; position du caractere
INC SI ; un caractere = 2 bytes
INC SI
INC DI
; Test fin de ligne
CMP SI,LARGEUREntete*2
JB @@lp1
; Passage a la ligne suivante
SUB SI,SI
ADD BX,80*2
; Test fin du cadre
CMP DI,(LARGEUREntete+1)*HAUTEUREntete
JB @@lp1
mov SI,0
@@boucle:
mov bh,Attribut
mov bl,appuyerSurUneTouche[SI]
push SI
mov ax,SI
mov cx,2
mul cx
mov SI,ax
MOV ES:[2750+SI],BX ; position du caractere
pop SI
inc SI
mov cx,TailleChaineAppuyer
cmp SI,cx
jle @@boucle
POPa
RET
AfficherEnTete ENDP
;----------------------
; |
; Procedure qui vide |
; le buffer |
;----------------------
VideMoi PROC
pusha
mov AX,0C00H
int 21h
popa
ret
VideMoi ENDP
END main
Conclusion
je n'ai pas encore trouvé de bug, avertisez moi si vus en voyez un.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
algo pour jeu de shoot en asm [ par cable ]
Bonjourje suis un jeune débutant en programmation en assembleur et je cherche l'algo (voir le code source) d'un jeu de shoot 'em up en scroling horizo
modification de programme [ par GMib ]
Bonjour, j'ai telecharger un jeu et je voudrai le modifier pour qu'il se lance en 640*480 o lieu de 800*600mon ecran ne suporte pas le 800*600 je ne p
Jeu du morpion [ par Prodigy2020 ]
Bonjour, je me présente je suis en 3e année de licence info et j'ai un problème:j'ai à rendre pour dans 2semaines un projet en as
Bot pour jeu sur le net [ par vincent2795 ]
Bonjour, je souhaite créer un bot pour faire des procédure récursive sur un jeu. mon but et de me connecter au jeu, et faire des actions, j' ai des ca
Debug maison dans Dofus [ par skyblack ]
Bonjour, voila je m'intéresse à tous se qui touche l'encodage et pour l'instant le lis énormément vos documents que j'essaie de comprendre n'étant abs
jeu [ par mimouth ]
stp j'ai besoin un programme en c++ de jeu "esikoridor" Esikoridor L'Esikoridor est un jeu simple de la famille des Korridor et autre cul-de-sac. Il
tasm [ par yosrasouaifi ]
salut je trouve la solution de l'exercice ci dessous mais je ne la compris pas si quelqu un veut m aider je donne la solution C URGENT un prog tasm
|
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
|