regconfi

导航

程序设计项目十三

程序设计项目十三

   

编写左手逃生法则演示程序。参看demo7.gif示例。

   

提示:

(1)地图中只有三种元素:墙、通道、出口。设计地图时,要给不同的元素赋予不同的编码。

(2)什么情况下改变行进的方向。遇到这些情况后根据当前方向决定下一步方向变化的规律是什么。

(3)左手逃生法则简述:在一个有出入口,没有回路的迷宫中,一直保持左手贴着墙壁向前走,总能找到迷宫出口。

代码:

第一次写的时候,数据段保存的数据dw,是按照db格式读取的,导致一直判断下一个坐标的四周可否通行有问题,,,,,,,,

  1 assume cs:code
  2 map segment
  3   db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
  4   db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
  5   db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
  6   db 1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1
  7   db 1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1
  8   db 1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1
  9   db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
 10   db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
 11   db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
 12   db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
 13   db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,2
 14   db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1
 15   db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1
 16   db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
 17   db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
 18   db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
 19   db 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
 20   db 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
 21   db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
 22   db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
 23   db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
 24   db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
 25   db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
 26   db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
 27   db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
 28 map ends
 29 
 30 data segment
 31         dw 1       ;now direction   1,left  2,up  3,right  4,down
 32         dw 0,0,0,0 ;next left,up,right,down ok?
 33 data ends
 34 
 35 stack segment
 36         dw 16 dup (0)
 37 stack ends
 38 
 39 code segment
 40 start:
 41         mov ax,map
 42         mov ds,ax
 43         mov ax,0b800h
 44         mov es,ax
 45         mov ax,stack
 46         mov ss,ax
 47         mov sp,20h
 48 
 49         call clear_screen
 50 gogogo:
 51         call draw_map            ;画地图
 52         mov ax,data               ;修改ds段地址
 53         mov ds,ax
 54         call lefthandrule
 55         jmp over
 56 
 57 lefthandrule:
 58      mov dx,0e4fh
 59     mov di,2398
 60    main:
 61         mov ax,es:[di]
 62         cmp ax,2020h
 63         je find
 64         call draw_now    ;画当前点
 65         call getnext        ;根据当前方向,得到下一个点
 66         call nextsizhou   ;下一个点的四周判断
 67         call ensurenext  ;确定下一个点的方向
 68         call sleep_1s      ;延时,不是一秒
 69         jmp main
 70    find:
 71         ret
 72 
 73 ;根据当前方向的不同,得到在下一个点时,左手边在哪里
 74 ensurenext:                 
 75         mov ax,ds:[0]
 76         cmp ax,1
 77         je nowleft
 78         cmp ax,2
 79         je nowup
 80         cmp ax,3
 81         je nowright
 82     cmp ax,4
 83         je nowdown
 84     okae: 
 85         ret   
 86 
 87    nowleft:
 88     mov ax,ds:[8]
 89     cmp ax,1
 90     je nextdown
 91     mov ax,ds:[2]
 92     cmp ax,1
 93     je nextleft
 94     jmp nextup
 95    nowup:
 96         mov ax,ds:[2]
 97     cmp ax,1
 98     je nextleft
 99     mov ax,ds:[4]
100     cmp ax,1
101     je nextup
102     jmp nextright
103    nowright:
104     mov ax,ds:[4]
105     cmp ax,1
106     je nextup
107     mov ax,ds:[6]
108     cmp ax,1
109     je nextright
110     jmp nextdown
111    nowdown:
112     mov ax,ds:[6]
113     cmp ax,1
114     je nextright
115     mov ax,ds:[8]
116     cmp ax,1
117     je nextdown
118     jmp nextleft
119      
120    nextleft:
121     mov word ptr ds:[0],1
122         jmp okae
123    nextup:
124     mov word ptr ds:[0],2
125         jmp okae
126    nextright:    
127     mov word ptr ds:[0],3
128         jmp okae 
129    nextdown:    
130     mov word ptr ds:[0],4
131     jmp okae
132 
133 getnext:
134         mov ax,ds:[0]
135         cmp ax,1
136         je goleft
137         cmp ax,2
138         je goup
139         cmp ax,3
140         je goright
141     cmp ax,4
142     je godown
143    oka:
144         ret
145 
146    goleft:
147         sub di,2
148         sub dl,1
149         jmp oka
150    goup:
151         sub di,160
152         sub dh,1
153         jmp oka
154    goright:
155         add di,2
156         add dl,1
157     jmp oka
158    godown:
159         add di,160
160         add dh,1
161         jmp oka
162 
163 draw_now:
164         mov ax,ds:[0]
165         cmp ax,1
166         je drawleft
167         cmp ax,2
168         je drawup
169         cmp ax,3
170         je drawright
171         cmp ax,4
172         je drawdown
173   overdn:
174         mov es:[di],bx
175         ret
176 
177   drawleft:
178         mov bx,0611h
179         jmp overdn
180   drawup:
181         mov bx,061eh
182         jmp overdn
183   drawright:
184         mov bx,0610h
185         jmp overdn
186   drawdown:
187         mov bx,061fh
188     jmp overdn
189 
190 nextsizhou:    ;确定下一个点四周的情况
191         call left
192         call up
193         call right
194         call down
195         ret
196 
197 left:
198         push dx
199         push di
200         cmp dl,0
201         je unleft
202         sub di,2
203         mov ax,es:[di]
204         cmp ax,0
205         je cnleft
206     cmp ax,2020h
207     je cnleft
208   unleft:
209         mov word ptr ds:[2],0
210         jmp overleft
211   cnleft:
212         mov word ptr ds:[2],1
213   overleft:
214         pop di
215         pop dx
216         ret
217 
218 up:
219         push dx
220         push di
221         cmp dh,0
222         je unup
223         sub di,160
224         mov ax,es:[di]
225         cmp ax,0
226         je cnup
227     cmp ax,2020h
228     je cnup
229   unup:
230         mov word ptr ds:[4],0
231         jmp overup
232   cnup:
233         mov word ptr ds:[4],1
234   overup:
235         pop di
236         pop dx
237         ret
238 
239 right:
240     push dx
241         push di
242         cmp dl,79
243         je unright
244         add di,2
245         mov ax,es:[di]
246         cmp ax,0
247         je cnright
248     cmp ax,2020h
249     je cnright
250   unright:
251         mov word ptr ds:[6],0
252         jmp overright
253   cnright:
254         mov word ptr ds:[6],1
255   overright:
256         pop di
257         pop dx
258         ret
259 
260 down:
261         push dx
262         push di
263         cmp dh,24
264         je undown
265         add di,160
266         mov ax,es:[di]
267         cmp ax,0
268         je cndown
269     cmp ax,2020h
270     je cndown
271   undown:
272         mov word ptr ds:[8],0
273         jmp overdown
274   cndown:
275         mov word ptr ds:[8],1
276   overdown:
277         pop di
278         pop dx
279         ret
280 
281 draw_map:
282         mov di,0
283         mov si,0
284         mov cx,2000
285      dps0:
286         push cx
287         mov al,ds:[si]
288         cmp al,0
289         je go0
290         cmp al,2
291         je go2
292         mov word ptr es:[di],4020h
293         jmp go0
294      go2:
295         mov word ptr es:[di],2020h
296      go0:
297         inc si
298         add di,2
299         pop cx
300         loop dps0
301         ret
302 
303 sleep_1s:
304         push cx
305         mov cx,4h
306      sp0:
307         push cx
308         mov cx,0ffffh
309      sp1:
310         loop sp1
311         pop cx
312         loop sp0
313         pop cx
314         ret
315 
316 clear_screen:
317         push cx
318         push di
319         mov di,0
320         mov cx,25
321      css0:
322         push cx
323         mov cx,80
324      css1:
325         mov word ptr es:[di],0
326         add di,2
327         loop css1
328         pop cx
329         loop css0
330         pop di
331         pop cx
332         ret
333 
334 over:
335         mov ax,4c00h
336         int 21h
337 code ends
338 end start
339         
hj13.asm

 

posted on 2015-02-11 18:53  regconfi  阅读(233)  评论(0编辑  收藏  举报