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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值