You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编贪吃蛇开发:数组元素替换与长度扩展问题求助

汇编贪吃蛇游戏的两个问题及修复方案

问题1:移动时星星坐标数组后移失效,星星无法删除

原replace_stars过程逻辑完全错误:错误地将数组中存储的屏幕坐标值当作内存偏移地址写入,导致数据被写到显存区域而非数组本身,完全无法实现元素后移的效果。

修复后的replace_stars过程

proc replace_stars
    mov cx, [st_am]
    dec cx              ; 循环次数为星星数-1,无需处理第一个元素
    mov bx, [st_am]
    dec bx
    shl bx, 1           ; 转换为字节偏移(每个元素占2字节)

replace:
    mov ax, [stars+bx-2]  ; 取前一个元素的坐标值
    mov [stars+bx], ax    ; 将值赋给当前元素,实现后移
    sub bx, 2             ; 偏移量减2,处理前一个位置
    loop replace
  ret
endp replace_stars

修复逻辑:从数组最后一个元素开始,依次用前一个元素的值覆盖当前元素,完成stars[n] = stars[n-1]的整体后移操作。

问题2:吃到苹果后在数组头部添加新坐标

实现思路:先扩容数组长度,再将现有元素整体后移腾出头部空间,最后根据移动方向计算新坐标插入到数组开头。同时需要提前扩展数组的存储空间,避免越界。

关键修改步骤

  1. 扩展stars数组的定义(支持更长蛇身):
stars dw 100 dup(0)  ; 扩大数组容量,避免越界
  1. 以up过程为例,修改吃到苹果的分支逻辑(其他方向对应调整坐标计算):
proc up
    mov di, 80*2
    cmp si, di
    jb not_move_up
    
    cmp si, [app]
    jnz move_up
    ; 吃到苹果,执行蛇身扩容
    inc [st_am]       ; 星星数量加1
    ; 将数组元素整体后移一位
    mov cx, [st_am]
    dec cx
    mov bx, [st_am]
    dec bx
    shl bx, 1
shift_up:
    mov ax, [stars+bx-2]
    mov [stars+bx], ax
    sub bx, 2
    loop shift_up
    ; 计算新头部坐标(向上移动,坐标减80*2)
    mov ax, si
    sub ax, 80*2
    mov [stars], ax   ; 插入到数组头部
    call apple        ; 生成新苹果
    ; 绘制新头部
    mov ah, 156
    mov al, '*'
    mov [es:ax], ax
    jmp not_move_up   ; 跳过常规移动的尾部删除步骤

move_up:
    call delete
    call replace_stars
    ; 更新常规移动的头部坐标
    sub si, 80*2
    mov [stars], si
    mov ah, 156
    mov al, '*'
    mov [es:si], ax
    
not_move_up:
  ret
endp up

其他方向的坐标计算逻辑:

  • 向下移动:add ax, 80*2
  • 向左移动:sub ax, 2
  • 向右移动:add ax, 2

额外注意

吃到苹果时不需要调用delete和replace_stars,因为蛇身长度增加,无需删除尾部元素。


内容的提问来源于stack exchange,提问作者yarden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:54:54