IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

[Tetris] Fonction qui contrôle si un bloc peut tomber


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 52
    Points : 36
    Points
    36
    Par défaut [Tetris] Fonction qui contrôle si un bloc peut tomber
    Salut tout le monde

    J'ai un petit souci avec la fonction qui contrôle si un bloc peut tomber. Est-ce que quelqu'un pourrait jeter un coup d’œil car elle ne fonctionne pas.

    Pour ceux qui se demandent où j'en suis, voilà un lien avec mes fichiers. Je dois encore gérer les collisions et enlever une ligne si la ligne est remplie, enfin vous connaissez sûrement le jeu.

    https://1drv.ms/f/s!Atvt3h2Eqlk0qF3E1iIt0Og2m4SR

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    PROC checkfall  ; return eax if 1 not fallin if 0 falling
    	uses edi, esi, ecx, ebx
     
     
    	mov ebx, 0   ;ebx op nul zetten 
     
    	mov eax, [dword ptr current_position]  ;(current postitie +10 doen)
    	add eax, 10					
     
    	mov edi, offset blockarray  ; blockarray laden
    	add edi, eax				;goeie positie in blockarray
     
    	call returnBlockOffset   ;eax de goeie blok laden
    	mov esi, eax 		; in esi de blok steken 
     
    	mov ch, 4
    	checkcolom:
    		mov cl, 4 
    		checkline:
    			mov al, [esi]   ;als block 0 is niks doen
    			jz nextpixel
     
    			mov ah, [edi]    ; als array 0 is niks doen 
    			jz nextpixel
     
    			mov ebx, 1		; als blok en array niet nul zijn dan mag je niet vallen 
    			mov cl, 0
     
    			jmp nextline
     
    			nextpixel:
    				inc edi
    				inc esi
    				dec cl
     
    			nextline:
    				cmp cl, 0
    				jne checkline
    			add edi, 6
    			dec ch
    			jnz checkcolom
     
    	mov eax, ebx
     
    	ret
    ENDP checkfall
     
     
    PROC fall
    	uses ebx 
     
    	call checkfall
    	mov ebx, eax
    	cmp ebx, 1
    	je notfall
     
    	add [dword ptr current_position], 10
    	call returnBlockOffset	
    	call drawblock, eax, [dword ptr current_position]
     
    	notfall:
     
    	ret
     
    ENDP fall

  2. #2
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    salut denzi,

    T'es pas cool avec moi d'écrire des commentaires dans une langue que je ne comprends pas du tout

    Je suis parti du principe que ta fonction returnBlockOffset fonctionne correctement,
    et que tes blocs sont bien constitués de 4x4 octets.

    ce que je corrigerais dans ton programme :
    ligne 30 : jmp nextline
    pourquoi vouloir tester les lignes suivantes ?
    si tu arrives à cette ligne c'est que le bloc ne peut pas aller plus loin,
    donc pourquoi vouloir tester les autres lignes ?
    du coup je la remplacerait par un jmp checkend et et ce checkend: serait placé à la ligne 43

    du coup, tu pourrais virer la ligne 37 (nextline) ainsi que la 38, et remplacer la 39 par une "jnz checkline"

    de plus il y a un problème quand tu sautes à nextline, ton pointeur EDI n'est pas obligé d'être allé sur la dernière case (4eme)
    donc le add edi,6 risque de pointer au mauvais endroit.

    voilà pour ce que j'ai pu voir

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    jai pas lu ton commentaire encore forthman mais entre temp jai arrangé le code le probleme c'est que il montai pas le flag du jz donc il fallais vraiment mettre un cmp devant (ligne 22 et 25) pour le rest jjai changé un peux les nom mais les commentaire sont toujours dans en neerlandais ahahaha je melange les 2 dnas le code comme ta pu le voir je croi anglais et neerlandais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    PROC checkmove  ; return eax if 1 not fallin if 0 falling
    	uses edi, esi, ecx
    	ARG offsetposition: dword
     
    		mov eax, [dword ptr current_position]		;(current postitie +10 doen)
    		add eax, [offsetposition]
     
     
     
    			mov edi, offset blockarray  ; blockarray laden   
    			add edi, eax				;goeie positie in blockarray
     
    			call returnBlockOffset   ;eax de goeie blok laden
    			mov esi, eax 		; in esi de blok steken 
     
    			mov ch, 4
    			checkrow:
    				mov cl, 4 
    				checkpixel:
    					mov al, [esi]   ;als block 0 is niks doen	
    					cmp al, 0
    					jz nextpixel			
    					mov ah, [edi]    ; als array 0 is niks doen 
    					cmp ah, 255		; becaus with 0 bug i think under the memory of the blockarray they are some zeros	
    					je nextpixel
     
    					mov eax, 1		; als blok en array niet nul zijn dan mag je niet vallen 
    					ret
     
    					nextpixel:
    						inc edi
    						inc esi
    						dec cl
    						jnz checkpixel
     
    						add edi, 6
    						dec ch
    						jnz checkrow
     
    	mov eax, 0		
    	ret
    ENDP checkmove
     
     
    PROC fall
    	call checkmove, 10
     
    	cmp eax, 0 
    	jz incpos
    	mov eax, 1
    	ret
     
    	incpos:
    	add [dword ptr current_position], 10
     
    	ret
    ENDP fall

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    effectivement, j'avais zappé le test avant ton saut, mais à ta place j'utiliserais un simple "or" avant le "jz"
    (genre or al,al)
    ton cmp al,255 puis je va effectuer le saut si la valeur de al vaut 255 (tu peux faire un cmp al,0 )

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    merci pour ta reponses mais dabord ce que je veux fair c'est que tous fonctionne pui je vais optimaliser voila un printscreen de ce que ca donne deja
    Nom : tetris.PNG
Affichages : 204
Taille : 42,5 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/10/2011, 18h24
  2. Réponses: 4
    Dernier message: 07/01/2010, 14h41
  3. Réponses: 1
    Dernier message: 04/08/2008, 17h57
  4. Peut-on executer une fonction qui est dans un iframe ??
    Par miloud dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/04/2006, 11h52
  5. 2 fonctions qui tournent en même temps
    Par GOUGOU1 dans le forum C
    Réponses: 7
    Dernier message: 07/12/2002, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo