#7 汇编挑战(Part.4)水世界
-郭两岁
编辑于 2023年08月06日 18:48
收录于文集
共30篇


作为游戏的最后一关

确实有点难度

把所有的海拔都导入RAM

找到最高的海拔

然后从最上层开始到最下层

一层一层分析能装多少水

找到左边界(从左边开始遇到第一个海拔大于等于该层数的)和右边界(同理)

然后在之间循环,海拔低于这一层的,水量+1

代码有点小乱

因为最后一关了快结束了有点激动

所以写的有一点着急

水世界

代码块
Python
自动换行
复制代码
#reg0计数器reg5总水
label loading
	ram_w input reg4 null	#ram:reg0=input
	add|i 1 reg4 reg4		#reg0=reg0+1
	less_than|j reg4 16 loading
	add|i|j 0 0 reg4
#---------------↑load-----------------
label main
	call null null find_highest
	#reg1为最高值
	label call_loop
	equal|i 0 reg1 end
	call null null calculate_one_layer
	sub|j reg1 1 reg1
	equal|i|j 0 0 call_loop
	label end
	add|i 0 reg5 output
#------------------------------------
label calculate_one_layer
	#reg2:left_edge,reg3:right_edge
	add|i|j 0 0 reg0
	label find_left_loop
	ram_r reg0 null reg4
	big_or_equal reg4 reg1 find_left
	add|i 1 reg0 reg0
	equal|i|j 0 0 find_left_loop
	label find_left
	add|i 0 reg0 reg2
	
	add|i|j 15 0 reg0
	label find_right_loop
	ram_r reg0 null reg4
	big_or_equal reg4 reg1 find_right
	sub|j reg0 1 reg0
	equal|i|j 0 0 find_right_loop
	label find_right
	add|i 0 reg0 reg3
	
	add|i 0 reg2 reg0#计数器为左边界
	label find_water_loop
	ram_r reg0 null reg4
	less_than reg4 reg1 has_water
	equal|i|j 0 0 no_water
	label has_water
	add|i 1 reg5 reg5
	label no_water
	add|i 1 reg0 reg0#计数器步增
	less_than reg3 reg0 enough
	equal|i|j 0 0 find_water_loop
	label enough
	return null null null
	
#-----------------------------------
label find_highest
	ram_r reg0 null reg1
	label back
	add|i 1 reg0 reg0#reg0++
	equal|i 16 reg0 enough#读完结束循环
	ram_r reg0 null reg2
	less_than reg1 reg2 find_bigger
	equal|i|j 0 0 back 
	label find_bigger
	add|i 0 reg2 reg1
	equal|i|j 0 0 back #always
	label enough
return null null null
#-----------------------------------
复制成功


LEG

自定义汇编别名: null:000000(0) add:00000000(0) sub:00000001(1) and:00000010(2) xor:00000101(5) shl:000110(6) shr:000111(7) input:00000111(7) output:00000111(7) ram_r:00010000(16) ram_w:00010001(17) equal:00100000(32) not_equal:00100001(33) less_than:00100010(34) les_or_equal:00100011(35) big_or_equal:00100101(37) pop:00110000(48) push:00110001(49) return:00111000(56) call:00111001(57) j:01000000(64) i:10000000(128) reg0-reg5:00000000-00000101(0-5)


芜湖

完结大撒花

(撒花)