我正在为学校制作蛇游戏,我需要使用伪随机来创建苹果。我们有一本书,但我不明白它的解释方式。 我希望有人尝试用最简单的方式向我解释它。
书中说我们需要使用基于定时器的方法,并且我们需要使用地址0040:006Ch。
顺便说一句,我正在使用汇编,我很确定我被认为是真正的初学者并且我正在使用 DosBox。
目前我的代码仅使用 wasd 移动“*”,并且我设置了边界。
IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
; Your variables here
; --------------------------
saveal db ' '
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
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
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
书中说我们需要使用基于定时器的方法,并且我们需要使用地址0040:006Ch
线性地址 0000046Ch 处的 BIOS.TimerTick 是一个 32 位变量,在 24 小时内单调递增,之后重置为 0(午夜)。每秒大约有 18 个增量。为了在贪吃蛇游戏中显示苹果,可以使用此计时器作为随机性来源。
程序如下:
; IN () OUT (ax) MOD (cx,dx)
push ds
xor ax, ax
mov ds, ax
mov ax, [046Ch] ; DX:AX is [0,1573040]
mov dx, [046Eh]
mov cx, 80
div cx ; -> AX is quotient [0,19663], DX is remainder [0,79]
mov cl, 100 ; 25 * 4
div cl ; -> AL is quotient [0,196], AH is remainder [0,99]
shr ah, 1
shr ah, 1
mov al, dl
pop ds
ret
参见 典型的贪吃蛇游戏。如何跟踪蛇?有关创建蛇游戏的更多详细信息,特别是寻找使用另一种随机数生成方法的NewFood子例程。