064.随机游走

;随机游走模拟
;模拟醉汉随机游走,醉汉的起点在(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值