我需要一些帮助才能使用emu8086弹出屏幕上的角色。 屏幕尺寸为(80x25字符)。我设法将它对角地移动但它没有反弹。相反它在到达边界后直接在x轴上直行(即第24行)这是我到目前为止所做的。
enter code here
Data_seg segment 'data'
char db 'A'
char2 db ' '
x1 db (1)
y1 db (1)
Data_seg ends
Code_seg segment 'code'
assume CS:Code_seg,DS:Data_seg
main PROC far
mov ax,Data_seg
mov ds,ax
mov cx,40
loop1:
;gotoxy
mov ah,02
mov dl,x1
mov dh,y1
mov bh,0
int 10H
;print a
mov al,char
mov dl,al
mov ah,02H
int 21H
;gotoxy
mov ah,02
mov dl,x1
mov dh,y1
mov bh,0
int 10H
;print " "
mov dl,char2
mov ah,02H
int 21H
inc x1
inc y1
;if(x1<2)||(x1>79)
mov al,x1
cmp al,2
jl ifPart
mov al,x1
cmp al,79
jge ifPart
;if(y1<2)||(y1>79)
y11:
mov al,y1
cmp al,2
jl ifPart2
mov al,y1
cmp al,24
jge ifPart2 ;jge for boundry(24)
jmp endif
ifPart:
dec x1
jmp y11
ifPart2:
dec y1
endif:
loop loop1
Code_seg ends
end main
答案 0 :(得分:3)
您必须在代码中编写弹跳算法/逻辑。目前你的逻辑总是[+ 1,+ 1]并且在到达第24行之后它会开始对它做另外的[0,-1](所以总变化是(+ 1,+ 0)),然后是到达79列它会做额外的[-1,0],所以总变化将是(+ 0,+ 0)。
即,您的代码执行了您在那里编写的内容,代码中没有问题。
要修复你的逻辑,首先尝试用一些简单的语言编写算法(英语有助于,在问SO时),并将其转换为更简单的步骤,直到它们类似于汇编指令,在源代码中将其写为注释,并且用很少的指示来实现每个评论。
首先,您可能想要“移动”向量,并将其添加到[x1,y1],而不是:
inc x1
inc y1
(即,mov al,[moveX] add [x1],al
......和y
类似。)
然后当达到边界时,否定移动矢量的那一部分,所以它将从+1翻转到-1并返回。如果您的起始位置是“内部”,更新后检查边界是否正常(0 || 79触发翻转),如果起始位置也可以在边界上,您应该尝试更新,检测无效位置(-1 || 80),翻转向量,取消无效更新,并进行有效更新。