在Assembly中向左或向右移动char

时间:2015-02-14 16:00:01

标签: assembly x86 masm irvine32

我正在组装一个简单的游戏,目前我只是试图向左或向右移动玩家图标(在这种情况下它是一个字符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

1 个答案:

答案 0 :(得分:4)

您的代码存在一些问题:

1)数字不是字符

right byte 2; moves player right
left byte 1; moves player left

rightleft现在保留纯数字1和2.但是,ReadKeyAL中返回按下的 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会破坏此结果(ALEAX的一部分)。 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'这将退出程序。按下并重复循环。