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:不正确移动