【问题标题】:Snake Assembly 8086: not moving correctlySnake Assembly 8086:无法正确移动
【发布时间】:2015-06-10 04:01:43
【问题描述】:
.model 小 。数据 ;蛇体所需的变量 head db '@', '$' ; 头部和身体符号 tail db ' ', '$' ; 尾部设置颜色为黑色 蛇长度分贝 3 ; 1-2 身 3 尾 复制蛇长度数据库? ;for循环 sEnd db ? head_col db 40 ;蛇的起始列 head_row db 12 ;蛇的起始行 ;蛇运动算法 ;总是复制前面符号的坐标。 复制科尔数据库? 复制行数据库? 延迟时间 db 1 ;控制键的变量 输入分贝? .stack 100h 。代码 ;延迟时间 延迟过程 mov 啊, 00 整数 1Ah mov bx, dx jmp_delay: 整数 1Ah 子 dx, bx cmp dl,延迟时间 jl jmp_delay ret 延迟结束 ;使蛇头向右走 正确的过程 cmp head_col,79 je resetposl 零: 公司 head_col jmp rightyie 重置位置: mov head_col, 0 对了: mov dl,head_col mov dh,head_row 异或 bh mov 啊, 02h 整数 10 小时 ret 正确的endp 开始游戏过程 mov dh, 12 ; 行 mov dl, 40 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx,偏移头 mov 啊, 09h 整数 21 小时 ret 开始游戏结束 mov cl,head_row mov copy_row,cl mov cl, head_col mov copy_col, 分类 ;打印头 mov dh, head_row mov dl, head_col 异或 bh mov 啊, 02h 整数 10 小时 mov dx,偏移头 mov 啊, 09h 整数 21 小时 主进程 移动斧头,@data mov ds, ax ;设置视频模式 电影, 03h mov 啊, 00h 整数 10 小时 ;清屏 ;只需要一次(因为不需要使用函数) 移动斧头,0600h mov bh, 07h xor cx, cx mov dx, 184fh 整数 10 小时 mov cx, 3200h ; 停止光标闪烁 mov 啊, 01h 整数 10 小时 ;在屏幕中间设置起始头蛇 呼叫开始游戏 ;控制 mov 啊,00h 整数 16 小时 mov 输入,'d' ;改变方向或继续前进 获取输入: mov 啊, 01h 整数 16 小时 jz键 mov 啊,00h 整数 16 小时 mov 输入,al ;控制键 钥匙: ;cmp 输入, 'w' ;je w ;cmp 输入, 's' ;je s ;cmp 输入, 'a' ;je a cmp 输入,'d' 杰德 杰拉克 d: mov cl,head_row mov copy_row,cl mov cl, head_col mov copy_col, 分类 mov dh, head_row mov dl, head_col 异或 bh mov 啊, 02h 整数 10 小时 移动,尾巴 移动 bh, 0 mov bl, 000h mov cx, 1 mov 啊, 09h 整数 10 小时 mov cl,snake_length mov copy_snake_length, cl dec copy_snake_length mov bl,0 印刷体: 移动,head_row mov copy_row,al mov al, head_col mov copy_col, 人 打电话给正确的 ;打印头 ;坐标 mov dh, head_row mov dl, head_col 异或 bh mov 啊, 02h 整数 10 小时 ;印刷 ”@” mov dx,偏移头 mov 啊, 09h 整数 21 小时 ; inc copy_col 更新头部。 公司 copy_col mov al,copy_col mov head_col,al 公司 ;现在循环打印其他字符 cmp bl,copy_snake_length jl打印体 dec head_col jmp 拉克 拉克: 通话延迟 jmp 获取输入 mov 斧头,4c00h 整数 21 小时 主要终端 结束主要

如果您想尝试代码,请按 d 移动字符。

问题是当它到达最后一列时,我的函数正确地假设将 head_col 更改为 0,这样它看起来就像到达了屏幕的末尾。不幸的是,它在第​​ 80 列末尾遗漏了一个字符,然后它继续打印但在下一行。

然后,当它到达第 13 行的末尾时,它不会在第 0 列留下一个字符,但仍会向下移动另一行,并且在 3 继续打印之后,它似乎又回到了原始行,然后当它到达它不再打印任何东西的起点。

【问题讨论】:

  • 如果您的“snake”长度超过一个字符,您将必须为每个字符分配一个屏幕坐标 (x,y)。您可以使用两个数组:一个用于 X 坐标,另一个用于 Y 坐标,第三个数组用于字符本身。

标签: assembly x86-16


【解决方案1】:

问题是当它到达最后一列时,我的函数正确地假设将 head_col 更改为 0,这样它看起来就像到达了屏幕的末尾。不幸的是,它在第​​ 80 列末尾遗漏了一个字符,然后它继续打印但在下一行。

您正在使用 DOS 函数 9 来显示您的蛇,但忘记了 DOS 使光标前进。您不应输入第 80 列。把79的限制改成78,看问题是否消失。或者使用 BIOS 功能 9 显示蛇头。您已经将它用于蛇尾。

【讨论】:

  • 是的,有点这样做,将其更改为 78,但如果我这样做会有点臭:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2021-11-03
  • 2012-11-28
相关资源
最近更新 更多