gpt4 book ai didi

assembly - 在程序集中向左或向右移动字符

转载 作者:行者123 更新时间:2023-12-01 12:37:20 25 4
gpt4 key购买 nike

我在组装一个简单的游戏,目前我只是想根据点击数字 1 或 2 向左或向右移动玩家图标(在本例中为字符 X)键盘。目前,我只有两个 if then 通过递减或递增 X 坐标值来向左或向右移动 X。我将 Irvine 32 库用于像 Gotoxy 这样的过程来获取坐标值。截至目前,我的程序在正确的起始位置显示 x 但由于某种原因,当我点击 1 或 2 时,x 向上移动一个空间而不是向左或向右移动。自己的书上看不懂,网上找的东西也不在我的汇编知识范围内。就目前而言,我只想向左或向右移动我的字符。稍后我会制作适当的 procs 等,但现在这是一个非常奇怪的问题。任何帮助,将不胜感激。下面是我的汇编代码:

        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) 数字不是字符

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

rightleft 现在保存纯数字 1 和 2。但是,ReadKeyAL 中返回按下的键的 ASCII 码。您可以在引用中查找键 12 的代码,或者您可以编写:

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

2) 寄存器不适合永久保存值

虽然您初始化了DH,但是当您到达调用Gotoxy 时它会被改变。在调用 Gotoxy 之前插入一个 mov dh, startY:

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并将 block 更改为:

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”时退出程序,否则重复循环。

关于assembly - 在程序集中向左或向右移动字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28517388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com