汇编开发贪吃蛇游戏出现多余星号(像素)的问题求助
汇编贪吃蛇游戏BUG求助
我用汇编开发贪吃蛇游戏,当前蛇由3个星号(*)组成,遇到两个问题:
- 当蛇在垂直与水平移动间切换时,屏幕会额外生成一个星号
- 每次向左移动时,同一位置都会重复添加星号
问题截图:
操作前效果:
操作后效果:
多次左移后的效果:
左移3次后:
左移4次后:
我的代码如下:
IDEAL MODEL small STACK 100h DATASEG ; -------------------------- ; Your variables here ; -------------------------- saveal db, ' ' ;used in line 223-233 app dw 0 ;place of the apple st_am dw 3 stars dw 0, 0, 0 ;places of the * CODESEG proc black body: mov [es:si], ax add si, 2 cmp si, 25*80*2 jnz body ret endp black proc up mov di, 80*2 cmp si, di jb not_move_up cmp si, [app] jnz move_up call apple move_up: call delete mov di, [stars+2] mov [stars+4], di mov di, [stars] mov [stars+2], di sub di, 80*2 mov ah, 156 mov al, '*' mov [es:di], ax mov [stars], si sub si, 80*2 mov ah, 156 mov al, '*' mov [es:si], ax not_move_up: ret endp up proc down mov di, (24*80*2)-1 cmp si, di jg not_move_down cmp si, [offset app] jnz move_down call apple move_down: call delete mov di, [stars+2] mov [stars+4], di mov di, [stars] mov [stars+2], di add di, 80*2 mov ah, 156 mov al, '*' mov [es:di], ax mov [stars], si add si, 80*2 mov ah, 156 mov al, '*' mov [es:si], ax not_move_down: ret endp down proc left mov dx, 0 mov bx, si mov ax, si mov si, 80*2 div si mov si, bx cmp dx,0 jz not_move_left cmp si, [offset app] jnz move_left call apple move_left: call delete mov di, [stars+2] mov [stars+4], di mov di, [stars] mov [stars+2], di mov ah, 156 mov al, '*' mov [es:di], ax mov [stars], si sub si, 2 mov ah, 156 mov al, '*' mov [es:si], ax not_move_left: ret endp left proc right mov dx, 0 mov bx, si mov ax, si mov si, 80*2 div si mov si, bx cmp dx,158 jz not_move_right cmp si, [app] jnz move_right call apple move_right: call delete mov di, [stars+2] mov [stars+4], di mov di, [stars] mov [stars+2], di mov ah, 156 mov al, '*' mov [es:di], ax mov [stars], si add si, 2 mov ah, 156 mov al, '*' mov [es:si], ax not_move_right: ret endp right proc apple mov ax, 40h mov es, ax mov ax, [es:6ch] and ax, 0000001111111110b mov di,ax mov [offset app], di mov ax, 0b800h mov es, ax mov al, '@' mov ah, 154 mov [es:di], ax ret endp apple proc delete mov bx, offset stars mov di, [st_am] dec di shl di, 1 mov di, [bx+di] mov ax, 0b800h mov es, ax mov al, ' ' mov ah, 0 mov [es:di], ax ret endp delete start: mov ax, @data mov ds, ax ; -------------------------- ; Your code here ; -------------------------- mov ax, 0b800h mov es, ax mov si,0 mov al, ' ' mov ah, 0 call black mov bx, offset stars mov si, ((12*80+40)*2)-2 mov al, '*' mov ah, 156 mov [es:si], ax mov [bx], si mov si, (12*80+40)*2 mov al, '*' mov ah, 156 mov [es:si], ax mov [bx+2], si mov si, ((12*80+40)*2)+2 mov al, '*' mov ah, 156 mov [es:si], ax mov [bx+4], si mov si, ((12*80+40)*2)-2 call apple yesOrno: mov ah, 1h int 21h mov [byte ptr saveal], al cmp [byte ptr saveal], 'w' jz w cmp [byte ptr saveal], 'a' jz a cmp [byte ptr saveal], 's' jz s cmp [byte ptr saveal], 'd' jz d cmp [byte ptr saveal], 'q' jmp exit w: call up jmp yesOrno s: call down jmp yesOrno a: call left jmp yesOrno d: call right jmp yesOrno exit: mov ax, 4c00h int 21h END start
自行排查后未找到问题原因,特此求助。
内容的提问来源于stack exchange,提问作者yarden
相关产品推荐
相关产品推荐

