most of the time it returns the right answer, but sometimes it doesn't.
Here is the code:
var dirx = [1, 0, -1, 0]
var diry = [0, 1, 0, -1]
func retrace():
var incx = currentx
var incy = currenty
var cdir = 0
var tracpos = 0
var tracdirs = [[]]
var tracposx = []
var tracposy = []
tracposx.append(incx)
tracposy.append(incy)
for i in range(4):
if get_location(incx + dirx[i], incy + diry[i]):
tracdirs[tracpos].append(i)
cdir = tracdirs.back().back()
while tracdirs.size() > 0:
if haveKey:
if incx == doorx[currKey - 1] and incy == doory[doorsOpen]:
return tracdirs.front().back()
else:
if incx == keyx[currKey] and incy == keyy[currKey]:
return tracdirs.front().back()
var fnddoor = false
for i in range(doorsOpen, 1210):
if doorx[i] == incx and doory[i] == incy:
fnddoor = true
if fnddoor:
var nopass = true
while nopass and tracdirs.size() > 1:
incx = tracposx.back()
incy = tracposy.back()
if tracdirs.back().size() > 1:
var non = tracdirs.back().pop_back()
cdir = tracdirs.back().back()
nopass = false
else:
var non = tracdirs.pop_back()
non = tracposx.pop_back()
non = tracposy.pop_back()
incx = tracposx.back()
incy = tracposy.back()
if tracdirs.size() == 1:
if tracdirs[0].size() == 1:
return tracdirs[0][0]
else:
incx = tracposx.back()
incy = tracposy.back()
var non = tracdirs[0].pop_back()
cdir = tracdirs[0].back()
incx += dirx[cdir]
incy += diry[cdir]
if haveKey:
if incx == doorx[currKey - 1] and incy == doory[doorsOpen]:
return tracdirs.front().back()
else:
if incx == keyx[currKey] and incy == keyy[currKey]:
return tracdirs.front().back()
var cntd = 0
var alt = 0
for i in range(4):
if (get_location(incx + dirx[i], incy + diry[i])) and i != (cdir + 2) % 4:
cntd += 1
alt = i
match cntd:
0:
var nopass = true
while nopass and tracdirs.size() > 1:
if tracdirs.back().size() > 1:
var non = tracdirs.back().pop_back()
cdir = tracdirs.back().back()
incx = tracposx.back()
incy = tracposy.back()
nopass = false
else:
var non = tracdirs.pop_back()
non = tracposx.pop_back()
non = tracposy.pop_back()
incx = tracposx.back()
incy = tracposy.back()
if tracdirs[0].size() == 1:
return tracdirs[0][0]
else:
incx = tracposx.back()
incy = tracposy.back()
var non = tracdirs[0].pop_back()
cdir = tracdirs[0].back()
1:
cdir = alt
2:
tracposx.append(incx)
tracposy.append(incy)
tracdirs.append([])
for i in range(4):
if get_location(incx + dirx[i], incy + diry[i]) and i != (cdir + 2) % 4:
tracdirs.back().append(i)
cdir = alt
3:
print("miss")
return -2