【minecraft】自动挖矿机器人

对于使用的介绍 请看AB站视频~
传送门:
A站:http://www.acfun.tv/v/ac664839
B站:http://www.bilibili.tv/video/av570910/
游戏存档:http://pan.baidu.com/share/link?shareid=491979&uk=3524964609

这里是对代码的介绍、解释
先贴出全部代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
n = 50
l = 2
r = 8
delta = 5
function dig(k)
  if k == 1 then
    turtle.dig()
  end
  if k == 2 then
    turtle.digUp()
  end
  if k == 3 then
    turtle.digDown()
  end
end

function go(k)
  if k == 1 then
    if (turtle.forward() == false) then
      if (turtle.getFuelLevel() == 0) then
        turtle.refuel(1)    
      else
        turtle.dig(k)
      end
      go(k)
    end
  end
  if k == 2 then
    if (turtle.up() == false) then
      if (turtle.getFuelLevel() == 0) then
        turtle.refuel(1)
      else
        turtle.digUp()
      end
      go(k)
    end
  end
  if k == 3 then
    if (turtle.down() == false) then
      if (turtle.getFuelLevel() == 0) then
        turtle.refuel(1)        
      else
        turtle.digDown()
      end
      go(k)
    end
  end
  if k == 4 then
    if (turtle.back() == false) then
      if (turtle.getFuelLevel() == 0) then
        turtle.refuel(1)
      else
        turtle.turnLeft()
        turtle.turnLeft()
        turtle.dig()
        turtle.turnLeft()
        turtle.turnLeft()
      end
      go(k)
    end
  end
end

function check(k)
  if k == 1 then
    for i = l, r do
      turtle.select(i)
      if turtle.compare() then
        turtle.select(1)
        return true
      end
    end
  end
  if k == 2 then
    for i = l, r do
      turtle.select(i)
      if turtle.compareUp() then
        turtle.select(1)
        return true
      end
    end
  end
  if k == 3 then
    for i = l, r do
      turtle.select(i)
      if turtle.compareDown() then
        turtle.select(1)
        return true
      end
    end
  end
  turtle.select(1)
  return false
end

function dfs(b)
  if b == 1 then
    for i = 1, 3 do
      if check(i) then
        dig(i)
        go(i)
        dfs(1)
        go(5 - i)
      end
    end  
    turtle.turnLeft()
    if check(1) then
      dig(1)
      go(1)
      dfs(1)
      go(4)
    end
 
    turtle.turnLeft()
    turtle.turnLeft()
    if check(1) then
      dig(1)
      go(1)
      dfs(1)
      go(4)
    end
    turtle.turnLeft()
  else
    if check(1) then
      dig(1)
      go(1)
      dfs(1)
      go(4)
    end
  end
end
local f = io.open("disk/data", "r")
be = tonumber(f:read())
f:close()
print("len:")
len = tonumber(io.read())
for k = be + 1, be + len do
  tot = k * delta
  for i = 1, tot do
    go(1)
    turtle.digUp()
  end
  turtle.turnRight()
  b = false
  for i = 1, n do
    if check(2) then
      b = true
    end
    turtle.digUp()
    if b == true then
      turtle.turnLeft()
      dfs(0)
      go(2)
      dfs(0)
      turtle.turnRight()
      turtle.turnRight()
      if check(2) then
        dig(2)
        go(2)
        dfs(1)
        go(3)
      end
      dfs(0)
      go(3)
      dfs(0)
      turtle.turnLeft()
    end
    if check(3) then
      dig(3)
      go(3)
      dfs(1)
      go(2)
    end
    b = false
    if check(1) then
      b = true
    end
    turtle.dig()
    go(1)
  end
  print("success")
  print(k)
  for i = 1, n do
    go(4)
  end
  turtle.turnLeft()
  for i = 1, tot do
     go(4)
  end
  for i = l, r do
    turtle.select(i)
    turtle.dropDown(turtle.getItemCount(i) - 1)
  end
  for i = r + 1, 16 do
    turtle.select(i)
    turtle.dropDown(64)
  end
  turtle.select(1)
  local f = io.open("disk/data", "w")
  f:write(k)
  f:close()
end

首先 对于一只机器人 挖出的都是形如未命名
的平面矿道 len为输入的 其余为程序内部全局变量
l、r是要匹配的矿物对应于机器人内部的l~r格

dig函数:
机器人的挖掘函数 只是为了好写。。
参数为方向1为前 2为上 3为下 4为后 下同
(dig函数没有后这个方向)
go函数:
机器人的行走函数 主要为了防止行走失败即无燃料时的自动补充
参数为方向
check函数:
检查某个方向是否有匹配矿物
参数为方向
dfs函数:
检查到某个方向有矿物后开始进行深搜 参数用于剪枝 减少不必要检查

然后数主程序部分
首先从数据库中读取上次挖到第几个矿道(len) 这个数据
输入len 为要挖几个矿道
然后就是各种模拟
最后返回后把矿物回收
除了匹配矿物留一个 燃料全部留下 其余都回收
输出”success i”i为挖到第几个矿道
写入data
继续执行下一个矿道的挖矿

这里的实现还是有几个不好的地方:
1.没要燃料的话会死在外面
2.走出更新区域会死在外面
3.如果go时遇到生物 虽然如果生物走开后可以正常运行 但是这可能浪费时间

对于1、2问题 是比较好解决的 只要记录机器人坐标 判断要死的时候往回走就行了
但是要记录这个坐标最好写turn函数 不过我没写。。 所以就没有去实现

对于3问题 其实可以弄一个中控服务器 负责管理机器人 包括战斗机器人 这样就可以适时的派出杀掉那些生物~

然后就会呈现出世界和谐繁荣共同发展的景象~\(≧▽≦)/~

如果如果引入中控电脑 就可以动态管理机器人 多点挖矿 也可以转移矿区 等等

不过很不好的是 机器人不能给机器人写程序 虽然cc引入了合成台后功能是有所增强
如果机器人能给机器人写程序 并且能支持实时保存运行情况 那就非常完美了~
可以做各种blabla的事=v= youknow.

【minecraft】自动挖矿机器人》上有5条评论

  1. 抱走留名,另外,貌似用上了上个代码《三维迷宫》中的核心探测代码的变体,嗯,貌似是这样的。
    另外,大触提到的turn函数,是不是也就用三维数组来记录数据就好了,然后配合getItemCount来统计燃料数,与数组的回程步数对比,假如相差不大,就返回。

    至于中控,其实有无线连接这种东东,应该会比较好弄的吧,只是麻烦的还是坐标问题,就不知道海龟能不能直接Get当前的MC坐标,假如可以,就犀利了。
    那么中控就超级简单了,直接写个函数,GoTo(x,y,z)直接到指定位置
    (*^__^*)

    • A1:turn函数什么的 我也忘了干嘛的了233 可以实现就好了
      A2:好像是可以拿到坐标的 吧。。好像有个gps的函数还是什么的 可以看看computercreaft的维基

      • 恩恩,是的,确实有个gps,那个相当的犀利。
        其实我一直在想一个问题,貌似机器人与PC都可以读写文件,那么,假如,使用一个文件来指挥各种操作,不是就完全不需要无线网卡了么?

发表评论