【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.

【题解?】 三维迷宫【coding in minecraft】

从前。。有个逆天的游戏叫minecraft
这个游戏有多逆天。。你懂得- –
尤其是有各种奇葩的mod 各种逆天啊。。。。。
我就在想有没有可以给机器人写程序让他帮你做事的mod。。
结果。。居然还真有!!
这个mod 叫computercraft 有一个叫做turtle的东西
就是机器人 可以执行  行走  判断方块 破坏方块  收集物品 放置物品 控制周围的红石信号 的操作
用的是一个叫lua的脚本语言 果断去玩了一下~~
写了一个程序 用来走三维迷宫的..
效果:

psb (36)

运行3d.lua
psb (37)

路途中..

psb (40)

找到终点后 挖掉钻石块

psb (38)

之后返航~~~

psb (39)

【code】

x = 0
y = 0
z = 0
b = {}
for i = -20, 20 do
  b[i] = {}
  for j = -20, 20 do
    b[i][j] = {};
for k = -20, 20 do
 b[i][j][k] = 0;
end
  end
end
t = {}
  t[0] = {}
  t[0][0] = 0
  t[0][1] = 1
  t[1] = {}
  t[1][0] = 1
  t[1][1] = 0
  t[2] = {}
  t[2][0] = 0
  t[2][1] = -1
  t[3] = {}
  t[3][0] = -1
  t[3][1] = 0
function get()
  print(“Get!”)
end
function abs(a)
  if (a < 0) then return -a
  else return a end
end
function check()
  if (abs(x) > 20 or abs(y)  > 20 or abs(z) > 20 or b[x][y][z] == 1) then return false
  else return true end
end
function dfs(d)
  b[x][y][z] = 1
  if (turtle.detectUp() == false) then
    z = z + 1
if (check() == true) then
 turtle.up(1)
 dfs(d)
 turtle.down(1)
end
z = z – 1
  else
    if (turtle.compareUp() == true) then
 turtle.digUp()
 get()
end
  end
  if (turtle.detectDown() == false) then
    z = z – 1
if (check() == true) then
 turtle.down(1)
 dfs(d)
 turtle.up(1)
end
z = z + 1
  else
    if (turtle.compareDown() == true) then
 turtle.digDown()
 get()
end
  end
  td = d
  local i = 0
  for i = 0, 3 do
    if (turtle.detect() == false) then
 x = x + t[td][0]
 y = y + t[td][1]
 if (check() == true) then
   turtle.forward()
dfs(td)
   turtle.back()
 end
 x = x – t[td][0]
 y = y – t[td][1]
    else
      if (turtle.compare() == true) then
   turtle.dig()
   get()
 end
    end
td = (td + 1) % 4
turtle.turnRight()
  end
end
dfs(0)

============================================================
写得略渣。。就是一个纯搜索

玩过mc应该就能想象这个mod的强大
这个还支持无线控制 可以做各种东西
比如轰炸机什么的= =
挖矿就扔一堆这个机器人去挖就行了
自动种东西 自动收割不再是梦想!!
而且这只是挖矿的 还有旁边带剑的
弄一堆出来组一个杀手团什么的 ~~
基本就没什么不能自动了

还有 它作为可以运行的程序 可以同时访问外面的系统和mc里的世界
是一个极强的通道
可以按照游戏里的各种摆放对你的电脑进行一些改变
比如可以建一颗文件夹树来表示mc里的一个矿洞什么的
【虽然可能有环= =】
或者在你挂mc做别的事的时候弹出一个窗口
距离你500m出现一只野生古力帕
什么的

就感觉这个mod让mc的拓展性极大地增加啊 碉堡了~~~~~