如何让某些东西随机消失然后又随机回到其他地方?

问题描述 投票:0回答:1

我正在组装中制作一个蛇游戏(非常初级水平),我被困在苹果应该消失并随机返回其他地方的部分。我正在用时间做随机性。

我制作了苹果随机出现一次的过程:

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
animation assembly random game-development x86-16
1个回答
0
投票

您阅读了我对您之前问题的回答关于随机放置苹果的问题吗?

使用如下代码

mov ax, [es:6ch]
and ax, 0000001111111110b
mov di, ax

你让它变得更加不随机!
我之前提供的过程(对于这个简单的练习来说已经足够了!),在 AL 中生成 X 坐标,在 AH 中生成 Y 坐标。只需将两个值组合成视频内存中的地址,如下

((Y * 80) + X) * 2
:

xor  dx, dx
mov  dl, al    ; -> DX = X
mov  al, 80
mul  ah        ; -> AX = (Y * 80)
add  ax, dx    ; -> AX = (Y * 80) + X
add  ax, ax    ; -> AX = ((Y * 80) + X) * 2

我被困在苹果应该消失并随机回到其他地方的部分。

为了使苹果消失,您需要记住它是在哪里绘制的,因此将其位置存储在某个地方!目前您的 apple 进程不执行此操作。

ShowApple:
  call RandomAddress         ; -> AX (CX DX)
  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, [word ptr 046Ch]  ; DX:AX is [0,1573040]
  mov  dx, [word ptr 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, [word ptr 046Ch]  ; DX:AX is [0,1573040]
  mov  dx, [word ptr 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`:

  xor  dx, dx
  mov  dl, al                ; -> DX = X
  mov  al, 80
  mul  ah                    ; -> AX = (Y * 80)
  add  ax, dx                ; -> AX = (Y * 80) + X
  add  ax, ax                ; -> AX = ((Y * 80) + X) * 2

  pop  ds
  ret

参见 典型的贪吃蛇游戏。如何跟踪蛇?有关创建蛇游戏的更多详细信息,特别是寻找使用另一种随机数生成方法NewFood子例程。

© www.soinside.com 2019 - 2024. All rights reserved.