我正在尝试做作业,但我被困在某事上。我们有一个仿真套件,其中包括一些显示套件,如ASCII LCD显示器或七段显示器。
我要做的是在点阵显示输出上创建一个迷宫。 (我做的)。我的任务是在试剂盒上放置一个点,试图在3分钟内自动找到离开迷宫的方法。如果点不能在3分钟内出现,我的程序应该在ASCII LCD显示输出上打印“我无法离开”的消息。
这是迷宫:
还有算法
首先,点必须向右移动。
如果出现障碍物,它必须向上移动。在上升的每一步,点必须检查是否有正确的方向。
如果可用,请向右移动。
如果没有向上和向右,则第三个选择是向下方向。点向下移动并仍然检查每一步是否可用。
最后一个选择是左方向。如果点击中障碍物时无法向下和向右移动,则必须向左移动。向左移动时,每一步都必须检查点是否按照给定顺序可以向上或向下方向。
到目前为止,这是我的代码:
org 100h
;-----Data Section-----;
;#start=Emulation Kit.exe#
MOV DX, 2000h
CALL MAZE_1
MOV DX, 2005h
CALL MAZE_2
MOV DX, 200Ah
CALL MAZE_3
MOV DX, 200Fh
CALL MAZE_4
MOV DX, 2014h
CALL MAZE_5
MOV DX, 2019h
CALL MAZE_6
MOV DX, 201Eh
CALL MAZE_7
MOV DX, 2023h
CALL MAZE_8
MOV DX, 2000h
MOV AL , 00101111b; Dot's position
MOV Maze1[0],AL
OUT DX,AL
;-----Code Section-----;
MOV DI,0
MOVERIGHT:
TEST Maze1[DI+1],00100000b ; checks next bit is obstacle or not
JNZ MOVEUP ; obstacle occurs if AL>0
ADD Maze1[DI+1], 00100000b ; moves next column
SUB Maze1[DI],00100000b ; updates previous column
INC DI
MOV DX,2000h
CALL MAZE_1
LOOP MOVERIGHT
MOVEUP:
TEST Maze1[DI+1],00010000b
JNZ MOVELEFT:
ADD Maze1[DI],00001000b
SUB Maze1[DI], 00010000b
MOV DX,2000h
CALL MAZE_1
LOOP MOVEUP
MOVEDOWN:
TEST Maze1[DI-1],01000000b
JZ MOVELEFT
ADD Maze1[DI],01000000b
SUB Maze1[DI],00100000b
MOV DX,2000h
CALL MAZE_1
LOOP MOVEDOWN
MOVELEFT:
TEST Maze1[DI-1],00100000b
JNZ EXIT
CMP DI,0
JE MOVEDOWN:
ADD Maze1[DI-1],00100000b
SUB Maze1[DI],00100000b
DEC DI
MOV DX,2000h
CALL MAZE_1
LOOP MOVELEFT
EXIT:
ret
Maze1 db 00001111b,01000001b,01011001b,01010001b,01110111b,01110101b,01000001b,01011101b,01001001b,01100110b,01001110b,01000001b,01011101b,01000011b,01110001b, 01000011b,01011101b,01010001b,01000001b,01110111b,01000010b,01011110b,01000001b,01111010b,01000001b, 00100011b,01001101b,01000001b,01001001b,01001011b,01110011b,01000001b,01011101b,01001001b,01001011b,01110010b,01011001b,01000101b,01010001b,00001110b
Posy db 01000000b,00100000b,00010000b,00001000b,00000100b,00000010b,00000001b ; Possibilities on y axis
;;;;;;;;;;;;;;;;;;;
MAZE_1 PROC
MOV CX,5
MOV SI,0
NEXTM1:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM1
RET
MAZE_1 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_2 PROC
MOV CX,5
MOV SI,5
NEXTM2:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM2
RET
MAZE_2 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_3 PROC
MOV CX,5
MOV SI,10
NEXTM3:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM3
RET
MAZE_3 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_4 PROC
MOV CX,5
MOV SI,15
NEXTM4:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM4
RET
MAZE_4 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_5 PROC
MOV CX,5
MOV SI,20
NEXTM5:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM5
RET
MAZE_5 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_6 PROC
MOV CX,5
MOV SI,25
NEXTM6:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM6
RET
MAZE_6 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_7 PROC
MOV CX,5
MOV SI,30
NEXTM7:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM7
RET
MAZE_7 ENDP
;;;;;;;;;;;;;;;;;;
MAZE_8 PROC
MOV CX,5
MOV SI,35
NEXTM8:
MOV AL, Maze1[SI]
OUT DX,AL
INC SI
INC DX
LOOPNE NEXTM8
RET
MAZE_8 ENDP
;;;;;;;;;;;;;;;;;;
我有一些问题。首先,如果出现任何障碍物,我的程序会正常运行等等。但它仅对1行(在x轴上)执行此操作。我该如何为y轴编码?另外我知道它根据算法没有这样做,因为我无法完成它。
其次,我在代码中有一个Posy
数组,但是SI和DI寄存器已满。如何使用BX寄存器迭代数组,有没有办法不使用SI或DI?
第三,有没有简单的方法来完成这项任务?我该怎么办? (我不想要任何代码,但如果有人想尝试它为什么不呢?)因为我必须为8个不同的端口编写这些代码。任何更正或帮助表示赞赏。