汇编贪吃蛇开发:数组元素替换与长度扩展问题求助
汇编贪吃蛇游戏的两个问题及修复方案
问题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:吃到苹果后在数组头部添加新坐标
实现思路:先扩容数组长度,再将现有元素整体后移腾出头部空间,最后根据移动方向计算新坐标插入到数组开头。同时需要提前扩展数组的存储空间,避免越界。
关键修改步骤
- 扩展
stars数组的定义(支持更长蛇身):
stars dw 100 dup(0) ; 扩大数组容量,避免越界
- 以
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
相关产品推荐
相关产品推荐

