【发布时间】:2017-08-18 09:19:59
【问题描述】:
我目前正在emu8086 中创建一个简单的游戏程序。使用箭头键,我可以在我想要的每个方向上打印星号。问题是有一个要求,如果我已经打印了 5 个星号,则应该移除星号的尾部,这样我的星号主体将在每次打印时保持 5 个。
根据我的研究,主要使用数组,但我还不知道如何在数组中操作它,因为我不知道如何跟踪数组的尾部和位置,以便我能够打印空间以删除尾部。
喜欢:
1. *
2. *
3. *
4. *
5. *
点击一个方向后,它应该看起来像.. 在这种情况下,它只是向下方向.. 其他方向的组合如何?
1.
2.*
3.*
4.*
5.*
6.*
这是我的打印代码
continue:
mov ah, 2 ;print asterisk
mov dl, "*"
int 21h
continue2:
mov ch, 32 ;hide blinking cursor
mov ah, 1
int 10h
mov ah, 00h ;input direction
int 16h
cmp ah, up
je up
cmp ah, left
je left
cmp ah, down
je down
cmp ah, right
je right
【问题讨论】:
-
如何设置下一个星号的位置?
int 21h,2确实在默认的下一个位置(到 STDOUT)打印它,而不是通过某些键输入向上/向下/向右/向左打印。同样是DOS,你为什么不直接写到VRAM,因为你在做“游戏”,在8086 PC XT时代,如果你想写一个游戏,你必须砍掉每个中间人,包括非常慢的 BIOS/DOS 调用。 BTW,你懂 C/C++,所以我可以用 C 的例子来回答吗? -
我正在考虑回答这个问题,但我实际上尝试使用
emu8086,它默默地将mov [di+bx*2],ax编译为mov [di+bx],ax,没有任何警告或错误。我不愿意支持这种低劣的工具(这不是我第一次遇到 emu8086 的一些奇怪问题)。 -
我们实际上需要使用emu8086。它就像一个蛇游戏,但它由用户一个一个打印身体(星号)
-
他们给了我们一个线索,我们可以使用数组,但我很难理解它是如何工作的。
-
另外,当我检查 emu8086 时,我发现第一个“Hello world”示例是通过将数据直接写入视频 RAM 来工作,跳过慢速 BIOS/DOS
int 10h/int 21h服务。也许您应该阅读 DOS 下的 VGA 文本模式视频内存组织,并查看该示例,了解它是如何工作的。虽然要读取键盘状态 BIOSint 16h对于简单的蛇游戏来说是可以的(我只是希望我能正确记住这些中断),但直接从端口 60h(或 61h?)读取键盘会与 BIOS 处理程序发生冲突,你不应该蛇游戏需要它。