我正在构建乒乓球,我想从两个用户那里获得输入以移动球拍但是当我使用int 16h ah1(以及ah0来检测是否按下了全部按键)时,它一次移动一个角色。 / p>
我找到了一些解决方案,但因为我不是一个天生的英语演讲者,我无法理解它们。
答案 0 :(得分:1)
Int 16/AH=01h用于检查进行击键 虽然Int 16/AH=00h用于获取击键。
请注意,你已经反过来了。
这是一个非常简单的程序,用于轮询按键 A , D 和 Q 。
A 增加第1行的玩家1蓝色字符。
D 增加第2行的玩家2红色字符。
Q 退出程序。
如果同时按下 A 和 D ,两个字符都会递增。
它使用一个简单的Lookup table来为其处理程序分配一个键,以便在程序具有很多功能时避免使用Spaghetti code。
使用更适合您需求的调度方法,提供一般的有效解决方案超出了本问题的范围。
BITS 16
ORG 100h
mov ax, 0003h
int 10h ;Set a known screen mode
mov ax, 0b800h
mov es, ax ;Set ES to access textual video buffer
;Write two 'A's (Blue and red)
mov WORD [es:0000h], 0941h
mov WORD [es:160], 0c41h
;We need BH zero for later
xor bx, bx
_poll_key:
;CHECK FOR A KEY
mov ah, 01h
int 16h
jz _poll_key
;REMOVE THE KEY FROM THE BUFFER
xor ah, ah
int 16h
mov bl, al
call dispatch_key
jmp _poll_key
;
; D I S P A T C H E R
;
;BX = Key to dispatch
dispatch_key:
push bx
sub bx, 'a'
jb _dk_end
cmp bx, 26
jae _dk_end
shl bx, 1
mov bx, WORD [dispatch_table + bx]
test bx, bx
jz _dk_end
call bx
_dk_end:
pop bx
ret
dispatch_table:
;A
dw _key_a
;B
dw 0
;C
dw 0
;D
dw _key_d
;E
dw 0
;F
dw 0
;G
dw 0
;H
dw 0
;I
dw 0
;J
dw 0
;K
dw 0
;L
dw 0
;M
dw 0
;N
dw 0
;O
dw 0
;P
dw 0
;Q
dw _key_q
;R
dw 0
;S
dw 0
;T
dw 0
;U
dw 0
;V
dw 0
;W
dw 0
;X
dw 0
;Y
dw 0
;Z
dw 0
;
; K E Y H A N D L E R S
;
;EXIT
_key_q:
mov ax, 4c00h
int 21h
;INCREMENT PLAYER 2 LETTER
_key_d:
inc BYTE [es:160]
ret
;INCREMENT PLAYER 1 LETTER
_key_a:
inc BYTE [es:0000h]
ret
代码用于NASM,以生成COM文件。