View difference between Paste ID: NErvM1HU and r6qVRvvm
SHOW: | | - or go back to the newest paste.
1
-- Turtle Maze Program v2.0
2
3
-- GLOBAL VARIABLES
4
5
local maze =  {}
6
local visited = {}
7
8
local stackTrace = {}
9
local stackTraceCount = 0
10
11
local mazeSize = 50
12
local posX = 25
13
local posY = 0
14
15
local currentDirection = 1 -- {"N", "E", "S", "W"}
16
17
18
-- FUNCTIONS
19
20
function init()
21
22
	for x = 1, mazeSize do
23
		maze[x] = {}
24
		
25
		for y = 1, mazeSize do
26
			maze[x][y] = nil
27
		end
28
	end
29
	
30
	for x = 1, mazeSize do
31
		visited[x] = {}
32
		
33
		for y = 1, mazeSize do
34
			visited[x][y] = 0
35
		end
36
	end
37
	
38
end
39
40
41
function forward()
42
43
	if currentDirection == 1 then
44
		posY = posY + 1
45
	end
46
	if currentDirection == 2 then
47
		posX = posX + 1
48
	end
49
	if currentDirection == 3 then
50
		posY = posY - 1
51
	end
52
	if currentDirection == 4 then
53
		posX = posX - 1
54
	end
55
	
56
	turtle.forward()
57
	
58
	visited[posX][posY] = 1
59
	
60
	saveToStackTrace()
61
end
62
63
64
function win()
65
 
66
	local success, data = turtle.inspect()
67
	
68
	if success then
69
		if data.name == "minecraft:cobblestone" then
70
			return true
71
		end
72
	end
73
	
74
	return false
75
end
76
77
78
function mapPosition()
79
80
	if currentDirection == 1 then
81
		if maze[posX][posY + 1] == nil then -- front
82
			maze[posX][posY + 1] = (turtle.detect() and 1 or 0)
83
		end
84
		if maze[posX - 1][posY] == nil then -- left
85
			turtle.turnLeft()
86
			maze[posX - 1][posY] = (turtle.detect() and 1 or 0)
87
			turtle.turnRight()
88
		end
89
		if maze[posX + 1][posY] == nil then -- right
90
			turtle.turnRight()
91
			maze[posX + 1][posY] = (turtle.detect() and 1 or 0)
92
			turtle.turnLeft()
93
		end
94
		return
95
	end
96
	
97
	if currentDirection == 2 then
98
		if maze[posX + 1][posY] == nil then -- front
99
			maze[posX + 1][posY] = (turtle.detect() and 1 or 0)
100
		end
101
		if maze[posX][posY + 1] == nil then -- left
102
			turtle.turnLeft()
103
			maze[posX][posY + 1] = (turtle.detect() and 1 or 0)
104
			turtle.turnRight()
105
		end
106
		if maze[posX][posY - 1] == nil then -- right
107
			turtle.turnRight()
108
			maze[posX][posY - 1] = (turtle.detect() and 1 or 0)
109
			turtle.turnLeft()
110
		end
111
		return
112
	end
113
	
114
	if currentDirection == 3 then
115
		if maze[posX][posY - 1] == nil then -- front
116
			maze[posX][posY - 1] = (turtle.detect() and 1 or 0)
117
		end
118
		if maze[posX + 1][posY] == nil then -- left
119
			turtle.turnLeft()
120
			maze[posX + 1][posY] = (turtle.detect() and 1 or 0)
121
			turtle.turnRight()
122
		end
123
		if maze[posX - 1][posY] == nil then -- right
124
			turtle.turnRight()
125
			maze[posX - 1][posY] = (turtle.detect() and 1 or 0)
126
			turtle.turnLeft()
127
		end
128
		return
129
	end
130
	
131
	if currentDirection == 4 then
132
		if maze[posX - 1][posY] == nil then -- front
133
			maze[posX - 1][posY] = (turtle.detect() and 1 or 0)
134
		end
135
		if maze[posX][posY - 1] == nil then -- left
136
			turtle.turnLeft()
137
			maze[posX][posY - 1] = (turtle.detect() and 1 or 0)
138
			turtle.turnRight()
139
		end
140
		if maze[posX][posY + 1] == nil then -- right
141
			turtle.turnRight()
142
			maze[posX][posY + 1] = (turtle.detect() and 1 or 0)
143
			turtle.turnLeft()
144
		end
145
		return
146
	end
147
end
148
149
150
function chooseDirection()
151
152
	if not hasPossibleDirection() then
153
		return false
154
	end
155
	
156
	while true do
157
		
158
		local number = math.random(1,4)
159
		
160
		if currentDirection == 1 then
161
			if number == 1 then
162
				if canMove(posX, posY + 1) then
163
					return true
164
				end
165
			end
166
			if number == 2 then
167
				if canMove(posX + 1, posY) then
168
					turtle.turnRight()
169
					currentDirection = 2
170
					return true
171
				end
172
			end
173
			if number == 3 then
174
				if canMove(posX, posY - 1) then
175
					turtle.turnRight()
176
					turtle.turnRight()
177
					currentDirection = 3
178
					return true
179
				end
180
			end
181
			if number == 4 then
182
				if canMove(posX - 1, posY) then
183
					turtle.turnLeft()
184
					currentDirection = 4
185
					return true
186
				end
187
			end
188
		end
189
		
190
		if currentDirection == 2 then
191
			if number == 1 then
192
				if canMove(posX + 1, posY) then
193
					return true
194
				end
195
			end
196
			if number == 2 then
197
				if canMove(posX, posY - 1) then
198
					turtle.turnRight()
199
					currentDirection = 3
200
					return true
201
				end
202
			end
203
			if number == 3 then
204
				if canMove(posX - 1, posY) then
205
					turtle.turnRight()
206
					turtle.turnRight()
207
					currentDirection = 4
208
					return true
209
				end
210
			end
211
			if number == 4 then
212
				if canMove(posX, posY + 1) then
213
					turtle.turnLeft()
214
					currentDirection = 1
215
					return true
216
				end
217
			end
218
		end
219
		
220
		if currentDirection == 3 then
221
			if number == 1 then
222
				if canMove(posX, posY - 1) then
223
					return true
224
				end
225
			end
226
			if number == 2 then
227
				if canMove(posX - 1, posY) then
228
					turtle.turnRight()
229
					currentDirection = 4
230
					return true
231
				end
232
			end
233
			if number == 3 then
234
				if canMove(posX, posY + 1) then
235
					turtle.turnRight()
236
					turtle.turnRight()
237
					currentDirection = 1
238
					return true
239
				end
240
			end
241
			if number == 4 then
242
				if canMove(posX + 1, posY) then
243
					turtle.turnLeft()
244
					currentDirection = 2
245
					return true
246
				end
247
			end
248
		end
249
		
250
		if currentDirection == 4 then
251
			if number == 1 then
252
				if canMove(posX - 1, posY) then
253
					return true
254
				end
255
			end
256
			if number == 2 then
257
				if canMove(posX, posY + 1) then
258
					turtle.turnRight()
259
					currentDirection = 1
260
					return true
261
				end
262
			end
263
			if number == 3 then
264
				if canMove(posX + 1, posY) then
265
					turtle.turnRight()
266
					turtle.turnRight()
267
					currentDirection = 2
268
					return true
269
				end
270
			end
271
			if number == 4 then
272
				if canMove(posX, posY - 1) then
273
					turtle.turnLeft()
274
					currentDirection = 3
275
					return true
276
				end
277
			end
278
		end
279
		
280
	end
281
end
282
283
284
function hasPossibleDirection()
285
286
	if not (canMove(posX, posY + 1)) and not (canMove(posX, posY - 1)) and not (canMove(posX + 1, posY)) and not (canMove(posX - 1, posY)) then
287
		return false
288
	end
289
	return true
290
end
291
292
293
function canMove(x, y)
294
295
	if x == 0 or x == mazeSize + 1 or y == 0 or y == mazeSize + 1 then
296
		return false
297
	end
298
	
299
	if (visited[x][y] == 1) or (maze[x][y] == 1) then
300
		return false
301
	end
302
	
303
	return true
304
end
305
306
307
function goBack()
308
309
	if (stackTrace[stackTraceCount] - currentDirection == 1) or (stackTrace[stackTraceCount] - currentDirection == -3) then
310
		turtle.turnRight()
311
	elseif stackTrace[stackTraceCount] ~= currentDirection then
312
		turtle.turnLeft()
313
	end
314
	
315
	currentDirection = stackTrace[stackTraceCount]
316
	
317
	if currentDirection == 1 then
318
		posY = posY - 1
319
	end
320
	if currentDirection == 2 then
321
		posX = posX - 1
322
	end
323
	if currentDirection == 3 then
324
		posY = posY + 1
325
	end
326
	if currentDirection == 4 then
327
		posX = posX + 1
328
	end
329
	
330
	stackTrace[stackTraceCount] = nil
331
	stackTraceCount = stackTraceCount - 1
332
	
333
	turtle.back()
334
end
335
336
337
function saveToStackTrace() 
338
	
339
	stackTraceCount = stackTraceCount + 1
340
	stackTrace[stackTraceCount] = currentDirection
341
end
342
343
344
-- CODE
345
346
init()
347
348
forward()
349
350
while not win() do
351
352
	mapPosition()
353
	
354
	if not hasPossibleDirection() then
355
	
356
		goBack()
357
	else
358
	
359
		chooseDirection()
360
		forward()
361
	end
362
363
end
364
365
turtle.up()
366
print("FINISHED MODAFAKA")
367
368
sleep(2)
369
370
turtle.down()
371
372
while stackTraceCount > 0 do
373
	goBack()
374
end