⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 go.asm

📁 一个汇编写的Win32围棋程序.测试版本.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;		dec	ecx
;		jnz	@XX2
;		
;		;从六线开始设成负值

		;中间5*5的点上设负值
		mov	edi, MMradio.mem
		add	edi, 21*8*9
		add	edi, 8*9
		mov	@Edi, edi
		mov	eax, 0FFFCFFFCh
		mov	edx, 7
		mov	ecx, 7
@YY1:
		mov	[edi]+4, eax
		add	edi, 8
		dec	ecx
		jnz	@YY1
		dec	edx
		jz	@YY2
		mov	ecx, 5
		mov	edi, @Edi
		add	edi, 21*8
		mov	@Edi, edi
		jmp	@YY1

		;
		;
		mov	edi, MMradio.mem	;
		add	edi, 21*8*13		;
		add	edi, 8*11		;
		mov	@Edi, edi		;
		mov	eax, 0000000h		;
		mov	edx, 6			;
		mov	ecx, 6			;
 @YY11:						;
		mov	[edi]+4, eax		;
		add	edi, 8			;
		dec	ecx			;
		jnz	@YY11			;
		dec	edx			;
		jz	@YY2			;
		mov	ecx, 6			;
		mov	edi, @Edi		;
		add	edi, 21*8		;
		mov	@Edi, edi		;
		jmp	@YY1			;

@YY2:
		;
		mov	eax, @FirstQipan

		add	eax, MemQiPanStep
		mov	@SecondQipan, eax

		;MessageHex @SecondQipan	;delthis
		;MessageHex @FirstQipan	;delthis

		invoke	_MRM_CopyQipan, @FirstQipan, @SecondQipan

		mov	MMradio.status, MMS_RUNNING
		ret
_InitMakeRadioMove	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_InitAllCanPutList	proc
		;初始化所有可着点之列表
		;维护部分放在界面程序中
		;是否会引发数据同步的问题
		invoke	GlobalAlloc, GPTR, 1600
		.if	eax == NULL
			Message	'“初始化所有可着点之列表”模块申请内存失败!'
			ret
		.endif
		mov	esi, eax
		mov	lpCanPutList, eax

		;可着点有361个;
		;add	esi, dwCPLCount
		;mov	[esi], dword ptr 361
		mov	dword ptr dwCPLCount, 361

		mov	edi, eax	;edi放数据的位置
		mov	esi, 22 *8	;esi为相对位移数据
		mov	ecx, 19		;ecx为X计数
		mov	eax, 19		;eax为Y计数
@@:
		mov	[edi],esi
		add	esi, 8
		add	edi, 4
		sub	ecx, 1
		.if	ecx == 0
			;
			sub	eax, 1
			.if	eax == 0
				ret
			.elseif
				mov	ecx, 19
				add	esi, 16
				jmp	@B
			.endif
		.elseif
			jmp	@B

		.endif
		ret
_InitAllCanPutList	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_UnloadAllCanPutList	proc
		;
		;
		invoke	GlobalFree, lpCanPutList
		ret
_UnloadAllCanPutList	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
StoneValue	equ	128
MRMLineStep	equ	21 * 8

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
;StoneValue	equ	128
;MRMLineStep	equ	21 * 8
_MRMiCount	word	100
_MRMiZiShu	word	0
_MRMdwEsi	dword	300 dup (?)
.code
;--------------------------------------------------------------------
_MRMTiZi	proc	_Esi
		;将此点及相邻的同色棋子
		;清零及设其辐射值
		;其辐射点的辐射值?
		local	@Esi
		local	@Color:word

		mov	esi, _Esi
		mov	@Esi, esi
		mov	dx, [esi]
		mov	@Color, dx
		xor	eax, eax
		mov	word ptr _MRMiZiShu, 0
		mov	edi, offset _MRMdwEsi

		.if	dx == BlackStone
			mov	ecx, 0FFE00060h
		.elseif	dx == WhiteStone
			mov	ecx, 00060FFE0h
		.endif

		mov	[esi], eax
		mov	[esi] + 4, ecx
@Next:
		;下一路
		mov	esi, @Esi
		add	esi, MRMLineStep
		mov	dx, [esi]
		.if	dx == @Color
			mov	[edi], esi
			add	edi, 4
			add	word ptr _MRMiZiShu, 1	;数目加1
			mov	[esi], eax
			mov	[esi] + 4, ecx
		.endif

		;上一路
		mov	esi, @Esi
		sub	esi, MRMLineStep
		mov	dx, [esi]
		.if	dx == @Color
			mov	[edi], esi
			add	edi, 4
			add	word ptr _MRMiZiShu, 1	;数目加1
			mov	[esi], eax
			mov	[esi] + 4, ecx
		.endif

		;左一路
		mov	esi, @Esi
		sub	esi, 8
		mov	dx, [esi]
		.if	dx == @Color
			mov	[edi], esi
			add	edi, 4
			add	word ptr _MRMiZiShu, 1	;数目加1
			mov	[esi], eax
			mov	[esi] + 4, ecx
		.endif

		;右一路
		mov	esi, @Esi
		add	esi, 8
		mov	dx, [esi]
		.if	dx == @Color
			mov	[edi], esi
			add	edi, 4
			add	word ptr _MRMiZiShu, 1	;数目加1
			mov	[esi], eax
			mov	[esi] + 4, ecx
		.endif

		.if	word ptr _MRMiZiShu != 0
			sub	edi, 4
			mov	esi, [edi]
			mov	@Esi, esi
			sub	word ptr _MRMiZiShu, 1
			jmp	@Next
			;
		.endif

		ret
_MRMTiZi	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;.data
;StoneValue	equ	128
;MRMLineStep	equ	21 * 8
;_MRMiCount	word	100
;_MRMiZiShu	word	0
;_MRMdwEsi	dword	300 dup<?>
;.code
;--------------------------------------------------------------------
_MRMYouQi	proc	_Esi, _Color
		;看此点是否有气
		;返回零表示此子无气;如有气,返回1
		local	@Color:word	;当前点色
		local	@Esi		;当前点
		;
		push	esi
		mov	esi, _Esi
		add	word ptr _MRMiCount, 1
		.if	CARRY?
			mov	word ptr _MRMiCount, 100h
		.endif
		mov	word ptr _MRMiZiShu, 0
		mov	eax, _Color
		mov	@Color, ax
		mov	@Esi, esi
		mov	edi, offset _MRMdwEsi
		mov	dx, _MRMiCount
		;当前情况为:word ptr @Color为原点颜色
		;esi为当前点
		;edi为未处理完点之列表
		;word ptr _MRMiZiShu为未处理完点之个数
		;word ptr _MRMiCount为当前标记值
		;dx为当前标记值
@Next:
		;处理下一路
		add	esi, MRMLineStep
		mov	ax, [esi]	;取颜色值
		.if	ax == 0		;如为空,则直接返回
			mov	eax, 1
			pop	esi
			ret
		.elseif	ax == @Color	;如为相同颜色,则标记后存起
			mov	bx, [esi] + 2
			.if	bx != dx		;如此轮没有经过
				mov	[esi] + 2, dx	;设经过标记
				mov	[edi], esi	;保存此点
				add	edi, 4		;游标向前
				add	word ptr _MRMiZiShu, 1	;数目加1
			.endif
			;其它不用处理
		.endif
		
		;处理上一路
		mov	esi, @Esi
		sub	esi, MRMLineStep
		mov	ax, [esi]	;取颜色值
		.if	ax == 0		;如为空,则直接返回
			mov	eax, 1
			pop	esi
			ret
		.elseif	ax == @Color	;如为相同颜色,则标记后存起
			mov	bx, [esi] + 2
			.if	bx != dx		;如此轮没有经过
				mov	[esi] + 2, dx	;设经过标记
				mov	[edi], esi	;保存此点
				add	edi, 4		;游标向前
				add	word ptr _MRMiZiShu, 1	;数目加1
			.endif
			;其它不用处理
		.endif
		
		;处理左一路
		mov	esi, @Esi
		sub	esi, 8
		mov	ax, [esi]	;取颜色值
		.if	ax == 0		;如为空,则直接返回
			mov	eax, 1
			pop	esi
			ret
		.elseif	ax == @Color	;如为相同颜色,则标记后存起
			mov	bx, [esi] + 2
			.if	bx != dx		;如此轮没有经过
				mov	[esi] + 2, dx	;设经过标记
				mov	[edi], esi	;保存此点
				add	edi, 4		;游标向前
				add	word ptr _MRMiZiShu, 1	;数目加1
			.endif
			;其它不用处理
		.endif
		
		;处理右一路
		mov	esi, @Esi
		add	esi, 8
		mov	ax, [esi]	;取颜色值
		.if	ax == 0		;如为空,则直接返回
			mov	eax, 1
			pop	esi
			ret
		.elseif	ax == @Color	;如为相同颜色,则标记后存起
			mov	bx, [esi] + 2
			.if	bx != dx		;如此轮没有经过
				mov	[esi] + 2, dx	;设经过标记
				mov	[edi], esi	;保存此点
				add	edi, 4		;游标向前
				add	word ptr _MRMiZiShu, 1	;数目加1
			.endif
			;其它不用处理
		.endif

		.if	word ptr _MRMiZiShu != 0
			sub	edi, 4
			mov	esi, [edi]
			mov	@Esi, esi
			sub	word ptr _MRMiZiShu, 1
			jmp	@Next
			;
		.endif

		xor	eax, eax
@MRMYQExit:
		pop	esi
		ret
_MRMYouQi	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_MRMDoTheRule	proc	 _Esi, _Color
		;
		local	@OtherColor:word
		;
		mov	esi, _Esi
		mov	ecx, _Color
		mov	[esi], cx	;试下一子

		;得到相反的棋子颜色
		.if	dword ptr _Color == WhiteStone
			mov	@OtherColor, BlackStone
		.elseif	dword ptr _Color == BlackStone
			mov	@OtherColor, WhiteStone
		.endif
		
		;下一路棋子是否对方棋子,如是则数气
		mov	esi, _Esi
		add	esi, MRMLineStep
		mov	cx, [esi]
		.if	cx == @OtherColor
			invoke	_MRMYouQi, esi, @OtherColor
			.if	eax == 0
				invoke	_MRMTiZi, esi
			.endif
		.endif

		;上一路棋子是否对方棋子,如是则数气
		mov	esi, _Esi
		sub	esi, MRMLineStep
		mov	cx, [esi]
		.if	cx == @OtherColor
			invoke	_MRMYouQi, esi, @OtherColor
			.if	eax == 0
				invoke	_MRMTiZi, esi
			.endif
		.endif

		;左一路棋子是否对方棋子,如是则数气
		mov	esi, _Esi
		add	esi, 8
		mov	cx, [esi]
		.if	cx == @OtherColor
			invoke	_MRMYouQi, esi, @OtherColor
			.if	eax == 0
				invoke	_MRMTiZi, esi
			.endif
		.endif

		;右一路棋子是否对方棋子,如是则数气
		mov	esi, _Esi
		sub	esi, 8
		mov	cx, [esi]
		.if	cx == @OtherColor
			invoke	_MRMYouQi, esi, @OtherColor
			.if	eax == 0
				invoke	_MRMTiZi, esi
			.endif
		.endif

		;本身气数是否为零
		mov	esi, _Esi
		invoke	_MRMYouQi, esi, _Color
		.if	eax == 0
			;dothis
		.endif
		
		;mov	esi, _Esi
		;mov	word ptr [esi], 0	;试下一子提回
		;居然不让提回!!!dothis

		ret
_MRMDoTheRule	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data
		ZN	equ	168	;正偏移
		FN	equ	-168	;负偏移


		RPN00	equ	40	;直线取值
		RPN01	equ	28	;        
		RPN02	equ	20	;        
		RPN03	equ	14	;        
		RPN04	equ	12	;        
		RPN05	equ	6	;  
		
		RPN0	equ	64	;曲线取值
		RPN1	equ	33	;        
		RPN2	equ	18	;        
		RPN3	equ	14	;        
		RPN4	equ	12	;        
		RPN5	equ	6	;        

		SHIDI	equ	33
		BuPinTan	equ	000f000fh

	;	RPN00	equ	64	;测试取值
	;	RPN01	equ	32	;        
	;	RPN02	equ	20	;        
	;	RPN03	equ	14	;        
	;	RPN04	equ	12	;        
	;	RPN05	equ	6	;  
	 	
	;	RPN0	equ	64	;测试取值
	;	RPN1	equ	32	;        
	;	RPN2	equ	18	;        
	;	RPN3	equ	13	;        
	;	RPN4	equ	8	;        
	;	RPN5	equ	6	;        

;		RPN0	equ	120	;原始取值
;		RPN1	equ	60	;
;		RPN2	equ	30	;
;		RPN3	equ	15	;
;		RPN4	equ	7	;
;		RPN5	equ	3	;
;
;请将“工程”“管理工程”“编辑工程”中“文件”“设置与语法”“制表符与缩进”改成“10”“10”来看此表;
;按“位置偏移”,“取值加权”来排列;TZFSZ001
;
;当前程序只是通过“影响值”最大的一点来选择着手;
;也可以通过其它几个概念来进行选择:
;如:实地多、影响范围大、及以上的影响值;
;也可对以上几点进行加权来选择;
;
;现各辐射点取值不好,将做成如下(或进一步加大未端取值):
;X	64	32	20	14	12
;64	40	26	16	12
;32	26	16	12
;20	16	12
;16	12
;12
;如何使对内的实地值与对外的实地值都合理,是个问题;
		align	4
PreRadioPath	dd	0	,0	,0	,0
RadioPath		dd	8	,RPN00	,16	,RPN01	,24	,RPN02	,32	,RPN03	,40	,RPN04	,0,0	;右
		dd	-8	,RPN00	,-16	,RPN01	,-24	,RPN02	,-32	,RPN03	,-40	,RPN04	,0,0	;左
		dd	ZN	,RPN00	,ZN*2	,RPN01	,ZN*3	,RPN02	,ZN*4	,RPN03	,ZN*5	,RPN04	,0,0	;下
		dd	FN	,RPN00	,FN*2	,RPN01	,FN*3	,RPN02	,FN*4	,RPN03	,FN*5	,RPN04	,0,0	;上
		;以上为右左上下,直线型的路径;64,32,20,13,8,6


		dd	8	,0	,8-ZN	,RPN2	,8-ZN*2	,RPN3	,8-ZN*3	,RPN4	,8-ZN*4	,RPN5	,0,0	;右一上
		dd	8	,0	,16	,0	,16-ZN	,RPN3	,16-ZN*2	,RPN4	,16-ZN*3	,RPN5	,0,0	;右二上
		dd	8	,0	,16	,0	,24	,0	,24-ZN	,RPN4	,24-ZN*2	,RPN5	,0,0	;右三上
		dd	8	,0	,16	,0	,24	,0	,32	,0	,32-ZN	,RPN5	,0,0	;右四上

		dd	8	,0	,8+ZN	,RPN2	,8+ZN*2	,RPN3	,8+ZN*3	,RPN4	,8+ZN*4	,RPN5	,0,0	;右一下
		dd	8	,0	,16	,0	,16+ZN	,RPN3	,16+ZN*2	,RPN4	,16+ZN*3	,RPN5	,0,0	;右二下
		dd	8	,0	,16	,0	,24	,0	,24+ZN	,RPN4	,24+ZN*2	,RPN5	,0,0	;右三下
		dd	8	,0	,16	,0	,24	,0	,32	,0	,32+ZN	,RPN5	,0,0	;右四下
														 
		dd	FN	,0	,FN-8	,RPN2	,FN-16	,RPN3	,FN-24	,RPN4	,FN-32	,RPN5	,0,0	;上一右
		dd	FN	,0	,FN*2	,0	,FN*2-8	,RPN3	,FN*2-16	,RPN4	,FN*2-24	,RPN5	,0,0	;上二右
		dd	FN	,0	,FN*2	,0	,FN*3	,0	,FN*3-8	,RPN4	,FN*3-16	,RPN5	,0,0	;上三右
		dd	FN	,0	,FN*2	,0	,FN*3	,0	,FN*4	,0	,FN*4-8	,RPN5	,0,0	;上四右

		dd	FN	,0	,FN+8	,RPN2	,FN+16	,RPN3	,FN+24	,RPN4	,FN+32	,RPN5	,0,0	;上一左
		dd	FN	,0	,FN*2	,0	,FN*2+8	,RPN3	,FN*2+16	,RPN4	,FN*2+24	,RPN5	,0,0	;上二左
		dd	FN	,0	,FN*2	,0	,FN*3	,0	,FN*3+8	,RPN4	,FN*3+16	,RPN5	,0,0	;上三左
		dd	FN	,0	,FN*2	,0	,FN*3	,0	,FN*4	,0	,FN*4+8	,RPN5	,0,0	;上四左
														 
		dd	-8	,0	,FN-8	,RPN2	,FN*2-8	,RPN3	,FN*3-8	,RPN4	,FN*4-8	,RPN5	,0,0	;左一上
		dd	-8	,0	,-16	,0	,FN-16	,RPN3	,FN*2-16	,RPN4	,FN*3-16	,RPN5	,0,0	;左二上
		dd	-8	,0	,-16	,0	,-24	,0	,FN-24	,RPN4	,FN*2-24	,RPN5	,0,0	;左三上
		dd	-8	,0	,-16	,0	,-24	,0	,-32	,0	,FN-32	,RPN5	,0,0	;左四上
														 
		dd	-8	,0	,ZN-8	,RPN2	,ZN*2-8	,RPN3	,ZN*3-8	,RPN4	,ZN*4-8	,RPN5	,0,0	;左一下
		dd	-8	,0	,-16	,0	,ZN-16	,RPN3	,ZN*2-16	,RPN4	,ZN*3-16	,RPN5	,0,0	;左二下
		dd	-8	,0	,-16	,0	,-24	,0	,ZN-24	,RPN4	,ZN*2-24	,RPN5	,0,0	;左三下
		dd	-8	,0	,-16	,0	,-24	,0	,-32	,0	,ZN-32	,RPN5	,0,0	;左四下
														 
		dd	ZN	,0	,ZN-8	,RPN2	,ZN-16	,RPN3	,ZN-24	,RPN4	,ZN-32	,RPN5	,0,0	;下一左
		dd	ZN	,0	,ZN*2	,0	,ZN*2-8	,RPN3	,ZN*2-16	,RPN4	,ZN*2-24	,RPN5	,0,0	;下二左
		dd	ZN	,0	,ZN*2	,0	,ZN*3	,0	,ZN*3-8	,RPN4	,ZN*3-16	,RPN5	,0,0	;下三左
		dd	ZN	,0	,ZN*2	,0	,ZN*3	,0	,ZN*4	,0	,ZN*4-8	,RPN5	,0,0	;下四左

		dd	ZN	,0	,ZN+8	,RPN2	,ZN+16	,RPN3	,ZN+24	,RPN4	,ZN+32	,RPN5	,0,0	;下一右
		dd	ZN	,0	,ZN*2	,0	,ZN*2+8	,RPN3	,ZN*2+16	,RPN4	,ZN*2+24	,RPN5	,0,0	;下二右
		dd	ZN	,0	,ZN*2	,0	,ZN*3	,0	,ZN*3+8	,RPN4	,ZN*3+16	,RPN5	,0,0	;下三右
		dd	ZN	,0	,ZN*2	,0	,ZN*3	,0	,ZN*4	,0	,ZN*4+8	,RPN5	,0,0	;下四右
		dd	0	,0	,0	,0

;RadioPath		dd	8	,RPN0	,16	,RPN1	,24	,RPN2	,32	,RPN3	,40	,RPN4	,0,0	;右
;		dd	-8	,RPN0	,-16	,RPN1	,-24	,RPN2	,-32	,RPN3	,-40	,RPN4	,0,0	;左
;		dd	ZN	,RPN0	,ZN*2	,RPN1	,ZN*3	,RPN2	,ZN*4	,RPN3	,ZN*5	,RPN4	,0,0	;下
;		dd	FN	,RPN0	,FN*2	,RPN1	,FN*3	,RPN2	,FN*4	,RPN3	,FN*5	,RPN4	,0,0	;上
;
;		dd	8	,0	,8-ZN	,RPN2	,8-ZN*2	,RPN3	,8-ZN*3	,RPN4	,8-ZN*4	,RPN5	,0,0	;右一上
;		dd	8	,0	,16	,0	,16-ZN	,RPN3	,16-ZN*2	,RPN4	,16-ZN*3	,RPN5	,0,0	;右二上

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -