我正在组装一个简单的游戏,目前我只是试图向左或向右移动玩家图标(在这种情况下它是一个字符X),这取决于数字1或2是否被击中键盘。目前我只有两个,如果通过递减或递增X坐标值来向左或向右移动我的X.我正在使用Irvine 32库来进行像Gotoxy这样的过程来获取坐标值。截至目前,我的程序在正确的起始位置显示x,但出于某种原因,当我点击1或2时,x向上移动一个空格而不是向左或向右移动。我无法在书中找到它,我在互联网上找到的东西不在我的装配知识范围内。就目前而言,我只想向左或向右移动我的字符。稍后我会做出相应的触发器,但是现在这是一个非常奇怪的问题。任何帮助,将不胜感激。 下面是我的汇编代码:
TITLE Matrix Rain
; Description:Dodge falling numbers to reach the final level
; Authors: John , Killian
; Revision date:2/11/2015
INCLUDE Irvine32.inc
.data
player byte 'X'; Player Character
direction byte ?; Direction the player moves
startY byte 24; Starting Y position
startX byte 39; Starting X position
breakLoop byte 9 ; base case to break
right byte 2; moves player right
left byte 1; moves player left
.code
main PROC
;Player Starting Point
mov dh , startY; column 24
mov dl,startX ; row 39
call Gotoxy; places cursor in the middle of the bottom part of the console window
mov al, player; Copies player character to the AL register to be printed
call WriteChar; Prints player to screen console
call Crlf
;Player Starting point
XOR al,al; Zeroes al out
call ReadKey;Reads keyboard
mov eax, 3000
call delay
_if1: cmp al , left
je THEN1
jmp ENDIF1
THEN1:
inc startX
mov dl, startX
call Gotoxy
call Clrscr
mov al, player
call WriteChar
XOR al,al
ENDIF1:
_if2: cmp al , right
je THEN2
jmp ENDIF2
THEN2:
dec startX
mov dl,startX
call Gotoxy
call Clrscr
mov al, player
call WriteChar
XOR al,al
ENDIF2:
exit
main ENDP
END main
答案 0 :(得分:4)
您的代码存在一些问题:
1)数字不是字符
right byte 2; moves player right
left byte 1; moves player left
right
和left
现在保留纯数字1和2.但是,ReadKey
在AL
中返回按下的 ASCII代码键。您可以查看关键字 1 和 2 的代码参考,或者您可以写:
right byte '2'; moves player right
left byte '1'; moves player left
2)注册表不适合永久保留值
虽然您初始化DH
,但当您到达call Gotoxy
时,它会被更改。在致电mov dh, startY
之前插入Gotoxy
:
inc startX
mov dl, startX
mov dh, startY
call Gotoxy
下一期:
call ReadKey ; Reads keyboard
mov eax, 3000
call delay
ReadKey
返回AL
中按下的键的ASCII码,但mov eax, 3000
会破坏此结果(AL
是EAX
的一部分)。 RTFM并将块更改为:
LookForKey:
mov eax,50 ; sleep, to allow OS to time slice
call Delay ; (otherwise, some key presses are lost)
call ReadKey ; look for keyboard input
jz LookForKey ; no key pressed yet
3)Clrscr
更改当前光标位置
对Clrscr
的调用会破坏Gotoxy
的效果。在Gotoxy
之后删除对该函数的调用,最好删除开发阶段的所有调用。
我建议立即实施循环:
cmp al, '3'
jne LookForKey
exit
当' 3'这将退出程序。按下并重复循环。