当前位置: 首页 > 知识库问答 >
问题:

蛇形组件8086:未正确移动

丰景同
2023-03-14
.model small
.data

;variables needed for snake body


head db '@', '$' ;head and body symbols
tail db ' ', '$' ;tail part set color to black

snake_length db 3 ; 1-2 body 3 tail
copy_snake_length db ? ;for loop
sEnd db ?

head_col db 40 ;starting col for snake 
head_row db 12 ;starting row for snake

; snake movement algorithm
; always copy the coordinates of the symbol in front.
copy_col db ?
copy_row db ?


delaytime db 1
;variable for control keys
input db ?
.stack 100h
.code

;to delay time
delay proc
    mov ah, 00
    int 1Ah
    mov bx, dx

jmp_delay:
    int 1Ah
    sub dx, bx
    cmp dl, delaytime
    jl jmp_delay
    ret

delay endp

;make snake head go to the right

righty proc
    cmp head_col,79
    je resetposl

    zero: 
    inc head_col
    jmp rightyie

    resetposl:
    mov head_col, 0


    rightyie:
    mov dl,head_col
    mov dh,head_row
    xor bh, bh

    mov ah, 02h
    int 10h
    ret 
righty endp

startgame proc

    mov dh, 12 ;row
   mov dl, 40 ;column
   xor bh, bh
   mov ah, 02h
   int 10h 

    mov dx, offset head
            mov ah, 09h
                int 21h
ret
startgame endp


mov cl, head_row
mov copy_row,cl

mov cl, head_col
mov copy_col, cl

;print head
mov dh, head_row
mov dl, head_col
xor bh, bh
mov ah, 02h
int 10h 
mov dx, offset head
mov ah, 09h
int 21h





main    proc
    mov ax, @data
    mov ds, ax

    ;set video mode
    mov al, 03h 
    mov ah, 00h
    int 10h

    ;clear screen
    ;only need it once (reason no need to use function)
    mov ax, 0600h
    mov bh, 07h
    xor cx, cx
    mov dx, 184fh
    int 10h

    mov cx, 3200h  ;stop cursor blinking
    mov ah, 01h
    int 10h

;set start head snake in the middle of the screen
    call startgame


;control
mov ah,00h
int 16h
mov input, 'd'

;to change direction or to keep on going
getinput:
mov ah, 01h
int 16h
jz key
mov ah,00h
int 16h
mov input,al

;control keys
key:
;cmp input, 'w'
;je w 
;cmp input, 's'
;je s 
;cmp input, 'a'
;je a 

cmp input, 'd'
je d

jne rak


d:

    mov cl, head_row
    mov copy_row,cl
    mov cl, head_col
    mov copy_col, cl

    mov dh, head_row
    mov dl, head_col
    xor bh, bh
    mov ah, 02h
    int 10h     

    mov al, tail
    mov bh, 0
    mov bl, 000h
    mov cx, 1
    mov ah, 09h
    int 10h

mov cl, snake_length
mov copy_snake_length, cl
dec copy_snake_length

mov bl,0

printbody:
mov al, head_row
mov copy_row,al
mov al, head_col
mov copy_col, al

call righty

;print head
;coordinates
    mov dh, head_row
    mov dl, head_col
    xor bh, bh
    mov ah, 02h
    int 10h 
;printing "@"
    mov dx, offset head
    mov ah, 09h
    int 21h

; inc copy_col to update the head.
inc copy_col
mov al,copy_col
mov head_col,al

inc bl
; now loop to print other characters
cmp bl,copy_snake_length

jl printbody
dec head_col
jmp rak






rak: 
call delay
jmp getinput


mov ax, 4c00h
int 21h
main endp
end main

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

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

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

共有1个答案

龙正初
2023-03-14

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

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

 类似资料:
  • 假设我必须生成20个随机坐标,20个行号和20个列号。 有没有办法显示我存储在数组中的所有数字?尝试使用偏移,但没有成功。

  • java.lang.IllegalStateException:迁移未正确处理data_table 应为:TableInfo{name=“data_table”,columns=url=column{name=“url”,type=“text”,notnull=false,primarykeyposition=0}..... 找到:TableInfo{name='data_table',colum

  • 我在使用OpenGL使颜色正常工作时遇到问题。我正确地绘制了形状,它们看起来很好,但当我调用glColor4d(r,g,b,a)时,它并没有正确地使用RGB应该指定的颜色,而是绘制了不同但相似的颜色。例如,大多数绿色绘制为完全黄色或完全绿色,任何灰色绘制为纯白。 在这个随机颜色值的短列表中,所有颜色值都绘制为实心FFFFFF白色,即使它们都不应为白色。 我用来绘制矩形的代码:

  • 我试图创建一个堆叠条形图与chartjs。我有时间差异的时间序列,这意味着一些序列可以在一段时间内有价值,但其他序列没有价值。出于这个原因,我选择直接将x值包含在数据集中,而不是作为标签数组,但是图表不能正确渲染。 这是我的代码: 我认为问题在于x轴堆叠。 这里有一个JSFiddle来说明这个问题。 https://jsfiddle.net/1kLyyjfp/

  • 我有致命的异常:java.lang.RuntimeException:计算数据库实时数据时出现异常。在崩溃报告中 为什么TableInfo中的所有内容都是空的 谁能帮我一下,我真的不知道我做错了什么或者是不是一个bug。

  • 问题内容: 我是新手,不胜感激。 在这段代码中,我要把一张卡片面朝上,如果发现它们不匹配,我希望它们再次面朝下。 此刻正在发生的事情:1.单击第一张卡片时翻转2.单击第二张卡片时,发生以下两种情况中的任何一种(a)如果它们相同,它们都停留在我想要的状态(b)如果它们并不相同,我根本看不到第二张卡,因为第二张卡会立即重新显示卡的背面(以及我的方法中定义的上一张卡的背面)。 我以为放入睡眠计时器可能会