;随机游走模拟
;模拟醉汉随机游走,醉汉的起点在(25,25),并且在周围徘徊
include irvine32.inc
WalkMax = 50
StartX = 25
StartY = 25
;定义结构体
DrunkardWalk STRUCT
path COORD WalkMax DUP(<0,0>)
pathsUsed WORD 0
DrunkardWalk ENDS
DisplayPosition PROTO currX:WORD,currY:WORD
.data
aWalk DrunkardWalk <>
.code
main PROC
mov esi,OFFSET aWalk
call TakeDrunkenWalk
call WaitMsg
exit
main ENDP
;------------------------------------------
TakeDrunkenWalk PROC
LOCAL currX:WORD,currY:WORD ;自定义临时变量
;向随机方向行走(东西南北)
;接收:ESI为DrunkardWalk的结构指针
;返回:结构初始化为随机数 ;这里没有传参数所以需要保存寄存器
;------------------------------------------
pushad
;用OFFSET运算符获取path-----COORD对象数组的地址,将其复制到EDI
mov edi, esi
add edi, OFFSET DrunkardWalk.path
mov ecx, WalkMax ;循环计数器
mov currX, StartX ;当前X的位置
mov currY, StartY ;当前Y的位置
Again:
;把当前位置插入数组
mov ax, currX
mov (COORD PTR [edi]).X,ax
mov ax, currY
mov (COORD PTR [edi]).Y,ax
invoke DisplayPosition,currX,currY
mov eax, 4 ;选择一个方向(0-3)
call RandomRange
.IF eax==0 ;北
dec currY
.ELSEIF eax==1 ;南
inc currY
.ELSEIF eax==2 ;西
dec currX
.ELSE
inc currX ;东
.ENDIF
add edi,TYPE COORD ;指向下一个COORD
loop Again
Finish:
mov (DrunkardWalk PTR [esi]).pathsUsed,WalkMax
popad
ret
TakeDrunkenWalk ENDP
;----------------------------------------------
DisplayPosition PROC currX:WORD,currY:WORD
;显示当前X和Y的位置
;----------------------------------------------
.data
commaStr BYTE ",",0
.code
pushad
movzx eax ,currX ;当前X的位置
call WriteDec
mov edx,OFFSET commaStr
call WriteString
movzx eax ,currY
call WriteDec
call Crlf
popad
ret
DisplayPosition ENDP
END main
064.随机游走
最新推荐文章于 2024-03-26 10:16:57 发布