我正在汇编中制作蛇游戏(非常初级),我被困在苹果应该消失并随机返回其他地方的部分。我正在用时间做随机性。
我做了苹果随机出现一次的过程
proc apple
mov ax, 40h
mov es, ax
mov ax, [es:6ch]
and ax, 0000001111111110b
mov di,ax
mov ax, 0b800h
mov es, ax
mov al, '@'
mov ah, 154
mov [es:di], ax
ret
endp apple
在我写的 ds(dataseg) 中
app dw 0
star dw (12*80+40)*2 ;the place of the snake
老实说,从这里我就停电了。
现在我的整个代码是:
IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
; Your variables here
; --------------------------
saveal db ' '
app dw ;place of the apple
star dw (12*80+40)*2 ;place of the *
st_am dw ;nevermind this
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
mov ah, 0
mov al, ' '
mov [es:si], ax
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
mov ah, 0
mov al, ' '
mov [es:si], ax
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
mov ah, 0
mov al, ' '
mov [es:si], ax
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
mov ah, 0
mov al, ' '
mov [es:si], ax
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 ax, 0b800h
mov es, ax
mov al, '@'
mov ah, 154
mov [es:di], ax
ret
endp apple
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 si, (12*80+40)*2
mov al, '*'
mov ah, 156
mov [es:si], ax
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
您阅读了我对您之前问题的回答关于随机放置苹果的问题吗?
使用如下代码
mov ax, [es:6ch] and ax, 0000001111111110b mov di, ax
你让它变得更加不随机!
我之前提供的过程(对于这个简单的练习来说已经足够了!),在 AL 中生成 X 坐标,在 AH 中生成 Y 坐标。只需将两个值组合成视频内存中的地址,如下
((Y * 80) + X) * 2
:
mov dl, al ; X
mov al, 80
mul ah ; -> AX = (Y * 80)
add al, dl
adc ah, 0 ; -> AX = (Y * 80) + X
add ax, ax ; -> AX = ((Y * 80) + X) * 2
我被困在苹果应该消失并随机回到其他地方的部分。
为了使苹果消失,您需要记住它是在哪里绘制的,因此将其位置存储在某个地方!目前您的 apple 进程不执行此操作。
ShowApple:
call RandomAddress ; -> AX
mov [word ptr AppleAddress], ax
mov di, ax
mov al, '@'
mov ah, 154
mov [es:di], ax
ret
HideApple:
mov di, [word ptr AppleAddress]
mov al, ' '
mov ah, 0
mov [es:di], ax
ret
; IN () OUT (ax) MOD (cx,dx)
RandomAddress:
push ds
xor cx, cx
mov ds, cx
mov ax, [046Ch] ; DX:AX is [0,1573040]
mov dx, [046Eh]
mov cl, 80
div cx ; -> AX is quotient [0,19663], DX is remainder [0,79]
push dx ; (1)
; don't care if it got incremented in the mean time
mov ax, [046Ch] ; DX:AX is [0,1573040]
mov dx, [046Eh]
mov cl, 25
div cx ; -> AX is quotient [0,62921], DX is remainder [0,24]
pop ax ; (1)
mov ah, dl ; -> AX has (X,Y) with AL is column and AH is row
; Convert to an address in video memory following `((Y * 80) + X) * 2`:
mov dl, al
mov al, 80
mul ah
add al, dl
adc ah, 0
add ax, ax
pop ds
ret
参见 典型的贪吃蛇游戏。如何跟踪蛇?有关创建蛇游戏的更多详细信息,特别是寻找使用另一种随机数生成方法的NewFood子例程。