2015-04-05 31 views
1
 
.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 

如果您想嘗試一下代碼,請按d移動字符。蛇組裝8086:無法正確移動

的問題是,當它到達最後一欄,我用右手的功能想改變head_col爲0,這樣它看起來像它到達屏幕的結束。不幸的是,它忽略了在最後一個字符山坳80然後繼續打印,但下一排。

然後,當它到達第13行的末尾時,它不會在col 0處留下字符,但仍然沿着另一個行向下,並且在3繼續打印後,似乎它會回到原始行,然後當它達到了起點,它不再打印任何東西。

+0

如果你的「蛇」是多於一個字符長,你將不得不assing屏幕座標(x,y)的每個字符。一個是X座標和另一個用於Y座標,和文字本身的第三陣列:你可以用兩個數組做。 – 2015-04-06 19:46:58

回答

1

問題是,當它到達最後一列時,我的函數正確地假設將head_col更改爲0,以便它看起來像到達屏幕的末端。不幸的是,它忽略了在最後一個字符山坳80然後繼續打印,但下一排。

您正在使用DOS功能9來顯示您的蛇,但忘記DOS提前光標。你不應該輸入第80列。將79的限制更改爲78,並查看問題是否消失。或者使用BIOS功能9顯示蛇頭。你已經將它用於snaketail。

+0

啊還挺這樣做,把它改爲78,但如果我這樣做,它有點發臭:( – 2015-04-07 10:13:37