程序设计项目十三
编写左手逃生法则演示程序。参看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