Snake Assembly 8086: not moving correctly

.model small
.data

;variables needed for snake body


head db '@', '$' ;head and body symbols
tail db ' ', '$' ;tail part set color to black

snake_length db 3 ; 1-2 body 3 tail
copy_snake_length db ? ;for loop
sEnd db ?

head_col db 40 ;starting col for snake 
head_row db 12 ;starting row for snake

; snake movement algorithm
; always copy the coordinates of the symbol in front.
copy_col db ?
copy_row db ?


delaytime db 1
;variable for control keys
input db ?
.stack 100h
.code

;to delay time
delay proc
    mov ah, 00
    int 1Ah
    mov bx, dx

jmp_delay:
    int 1Ah
    sub dx, bx
    cmp dl, delaytime
    jl jmp_delay
    ret

delay endp

;make snake head go to the right

righty proc
    cmp head_col,79
    je resetposl

    zero: 
    inc head_col
    jmp rightyie

    resetposl:
    mov head_col, 0


    rightyie:
    mov dl,head_col
    mov dh,head_row
    xor bh, bh

    mov ah, 02h
    int 10h
    ret 
righty endp

startgame proc

    mov dh, 12 ;row
   mov dl, 40 ;column
   xor bh, bh
   mov ah, 02h
   int 10h 

    mov dx, offset head
            mov ah, 09h
                int 21h
ret
startgame endp


mov cl, head_row
mov copy_row,cl

mov cl, head_col
mov copy_col, cl

;print head
mov dh, head_row
mov dl, head_col
xor bh, bh
mov ah, 02h
int 10h 
mov dx, offset head
mov ah, 09h
int 21h





main    proc
    mov ax, @data
    mov ds, ax

    ;set video mode
    mov al, 03h 
    mov ah, 00h
    int 10h

    ;clear screen
    ;only need it once (reason no need to use function)
    mov ax, 0600h
    mov bh, 07h
    xor cx, cx
    mov dx, 184fh
    int 10h

    mov cx, 3200h  ;stop cursor blinking
    mov ah, 01h
    int 10h

;set start head snake in the middle of the screen
    call startgame


;control
mov ah,00h
int 16h
mov input, 'd'

;to change direction or to keep on going
getinput:
mov ah, 01h
int 16h
jz key
mov ah,00h
int 16h
mov input,al

;control keys
key:
;cmp input, 'w'
;je w 
;cmp input, 's'
;je s 
;cmp input, 'a'
;je a 

cmp input, 'd'
je d

jne rak


d:

    mov cl, head_row
    mov copy_row,cl
    mov cl, head_col
    mov copy_col, cl

    mov dh, head_row
    mov dl, head_col
    xor bh, bh
    mov ah, 02h
    int 10h     

    mov al, tail
    mov bh, 0
    mov bl, 000h
    mov cx, 1
    mov ah, 09h
    int 10h

mov cl, snake_length
mov copy_snake_length, cl
dec copy_snake_length

mov bl,0

printbody:
mov al, head_row
mov copy_row,al
mov al, head_col
mov copy_col, al

call righty

;print head
;coordinates
    mov dh, head_row
    mov dl, head_col
    xor bh, bh
    mov ah, 02h
    int 10h 
;printing "@"
    mov dx, offset head
    mov ah, 09h
    int 21h

; inc copy_col to update the head.
inc copy_col
mov al,copy_col
mov head_col,al

inc bl
; now loop to print other characters
cmp bl,copy_snake_length

jl printbody
dec head_col
jmp rak






rak: 
call delay
jmp getinput


mov ax, 4c00h
int 21h
main endp
end main

If you want to try out the code press d to move the character.

The problem is that when it reaches the last column, my function righty suppose to change head_col to 0 so that it looks like it reaches the end of the screen. Unfortunately, it leaves out one character at the end col 80 then it continues to print but in the next row.

Then when it reaches the end at row 13 it doesn't leave a character at col 0 but still goes down another row, and after 3 continues printing, it seems that it goes back to the original row, then when it reaches the starting point it doesn't anymore print anything.


The problem is that when it reaches the last column, my function righty suppose to change head_col to 0 so that it looks like it reaches the end of the screen. Unfortunately, it leaves out one character at the end col 80 then it continues to print but in the next row.

You are using DOS function 9 to display your snake but forget that DOS advances the cursor. You should not enter the 80th column. Change the limit of 79 into 78 and see if the problem disappears. Alternatively use BIOS function 9 to display the snakehead. You already use it for the snaketail.

链接地址: http://www.djcxy.com/p/62702.html

上一篇: 蛇游戏大会:增加体长不工作

下一篇: 蛇装配8086:不正确移动