蛇形组件8086:移动不正确


.型号小数据;蛇体所需的变量head数据库'@','$';头部和身体符号tail数据库","$";尾部设置颜色为黑色蛇长db 3;1-2体3尾copy_snake_length数据库;for循环sEnd db?head_col数据库40;蛇的起跑线head_row db 12;蛇的起始行;蛇形运动算法;始终复制前面符号的坐标。copy_col数据库?复制数据库?延迟时间db 1;控制键的变量输入db?.stack 100h密码;延迟时间延迟过程mov啊,00int 1Ahmov bx,dxjmp_delay:int 1Ahsub-dx,bxcmp dl,延迟时间jl jmp延迟ret延迟端;使蛇头向右移动正当程序cmp head_col,79je resetposl零:inc-head_col公司jmp rightyieresetposl:mov head_col,0rightyie:mov dl,head_colmov dh,head_rowxor bh,bhmov啊,02hint 10小时ret右端启动游戏进程mov dh,12岁;一行mov dl,40;柱xor bh,bhmov啊,02hint 10小时mov dx,偏移磁头mov啊,09hint 21小时ret开始游戏结束mov cl,head_rowmov copy_row,clmov cl,head_colmov copy_col,cl;打印头mov dh,head_rowmov dl,head_colxor bh,bhmov啊,02hint 10小时mov dx,偏移磁头mov啊,09hint 21小时主程序mov ax,@数据mov ds,ax;设置视频模式mov al,03hmov啊,00hint 10小时;清除屏幕;只需要一次(原因不需要使用函数)mov ax,0600hmov bh,07hxor cx,cxmov dx,184fhint 10小时mov cx,3200h;停止光标闪烁mov啊,01hint 10小时;在屏幕中间设置开始头蛇呼叫开始游戏;控制mov啊,00hint 16小时mov输入,'d';改变方向或继续前进getinput:mov啊,01hint 16小时jz键mov啊,00hint 16小时mov输入,al;控制键密钥:;cmp输入,'w';周;cmp输入,'s';je;cmp输入,'a';je acmp输入,'d'je djne rakd:mov cl,head_rowmov copy_row,clmov cl,head_colmov copy_col,clmov dh,head_rowmov dl,head_colxor bh,bhmov啊,02hint 10小时mov al,尾mov bh,0mov bl,000hmov cx,1mov啊,09hint 10小时mov cl,蛇形长度mov copy_snake_length,cldec copy_snake_lengthmov bl,0打印体:mov al,head_rowmov copy_row,almov al,head_colmov copy_col,al呼叫权;打印头;坐标mov dh,head_rowmov dl,head_colxor bh,bhmov啊,02hint 10小时;打印"@"mov dx,偏移磁头mov啊,09hint 21小时;inc-copy_col来更新头部。inc-copy_col公司mov al,copy_colmov head_colinc-bl公司;现在循环打印其他字符cmp bl,copy_snake_lengthjl打印体dec head_coljmp-rakrak:呼叫延迟jmp getinputmov ax,4c00hint 21小时主端末端主管

如果你想试试这个代码,按d移动字符。

问题是,当它到达最后一列时,我的函数正确地假设将head_col更改为0,这样它看起来就像到达了屏幕的末尾。不幸的是,它在第80行末尾遗漏了一个字符,然后继续打印,但在下一行。

然后,当它到达第13行的末尾时,它没有在第0列留下一个字符,但仍然向下移动到另一行,在3继续打印后,它似乎回到了原始行,然后当它到达起点时,它不再打印任何内容。

问题是,当它到达最后一列时,我的函数正确地假设将head_col更改为0,这样它看起来就像到达了屏幕的末尾。不幸的是,它在第80行末尾遗漏了一个字符,然后继续打印,但在下一行。

你正在使用DOS功能9来显示你的蛇,但忘记了DOS会移动光标。您不应该输入第80列。将限制79改为78,看看问题是否消失。或者,使用BIOS功能9来显示蛇头。你已经用它来对付蛇尾了。

最新更新