Лабиринт MazeLab
Игра в лабиринт QB64 автоматизирована мной и сама играет
несколько вариантов: ходы по списку MazeCode
или ходы случайные MazeStep или ходы оптимальные MazeLab
и вдобавок MazeRnd синтезирует случайные лабиринты
MAZErnd.bas = случайные
MAZElab.bas = правильно
MAZEkino.bas = смена
MAZEcode.bas = коды
MAZEstep.bas = ходы
MazeBall & DAV & Danilin Solve of Labyrinth = https://qb64phoenix.com/forum/showthread.php?tid=3063
Новейшая программа MazeLab решает лабиринты
задавая следующий ход зависящий от хода предыдущего
и от вида препятствия пещеры: стена или угол
Если препятствие без угла тогда выбор направления случайный
перпендикулярно и начальное направление случайное
и из тупика выходит обратно плюс есть время и контроль
Кодировка направления дальновидная 0 > / 1 < / 2 V / 3 ^
для выбора случайного направления вида 2 + Int(Rnd * 2)
показывает вероятность выигрыша 2 в степени свободных ходов
и вероятность 1/64 реально трудная
Причём случайные ходы могли создать ходов шифр не подряд
Создан внутренний массив и каждое перемещение до стены
проверяют 4 * 4 = 16 условий и встроена мини карта массива
плюс возможно настроить ходы назад если стена
Программировал буквально 1 день введя контрольные точки
Начальный лабиринт 7-й уменьшается до 1-го и далее 10-й
Ранние версии программы добавлю в тему позже
где давно у меня шар оставляет следы на поле
Возможно создавать свои лабиринты и решать задав номер
и наверняка возможны случайные лабиринты пещеры
Весело смотреть как программа заходит не в ту дверь
сразу или на крайних очевидных ходах
и лабиринты из книг ещё не проверял
На другие языки проще перевести мой алгоритм массива с мини картой
В принципе реально проверять массив
если проходили угол 3-жды значит тупик стартовать заново
Версия MazeRnd синтезирует случайный лабиринт каждый раз
и в принципе легко настроить повторение лабиринта несколько раз
если вместо обнуления массивов добавлять в конец и не учитывать
Версия для Эксцель Excel программируется легко наверняка
Принципы похожи на XONIX
https://qb64phoenix.com/forum/showthread.php?tid=519
XONIX https://kenokeno.ucoz.ru/blog/xonix/2022-10-14-90
Автоматизация лабиринта MazeRND
Реально шарик летает безцельно
и звезда пересекается случайно
Автор программы зашифровал лабиринт в строку
'x is wall & b is ball & y is star
If puzzle=11 Then
puz$="": grid=8
puz$=puz$+"xxxxxxxx"
puz$=puz$+"x xb x"
puz$=puz$+"x yx x"
puz$=puz$+"x xx x"
puz$=puz$+"x x"
puz$=puz$+"x x"
puz$=puz$+"x x"
puz$=puz$+"xxxxxxxx"
End If
Стартуем переменные и строим стенки пустого лабирита
где delta - направление движения 0 > / 1 < / 2 V / 3 ^
Dim d(22, 22), m(22, 22): m$="": all=0: Randomize Timer
delta=Int(Rnd*4): puz$="": grid=Int(Rnd*7)+8: f=grid
For a=1 To f: m(1, a)=1: m(f, a)=1: Next
For a=2 To f-1: m(a, 1)=1: m(a, f)=1:
For b=2 To f-1: m(a,b)=0
Next: Next
Заполняем 20% стен и ставится звезда и шарик
и суммируется строка puz$
or i=1 To .2*f^2 : m(Rnd*f, Rnd*f)=1: Next
m(Rnd*(f-3)+2, Rnd*(f-3)+2)=2 ' y
m(Rnd*(f-3)+2, Rnd*(f-3)+2)=3 ' b
For a=1 To f: For b=1 To f ': Print m(a,b);
If m(a,b)=1 Then m$=m$+"x"
If m(a,b)=0 Then m$=m$+" "
If m(a,b)=2 Then m$=m$+"y"
If m(a,b)=3 Then m$=m$+"b"
Next: Next: puz$=m$
Чтобы дальше разобрать puz$ в малый лабиринт слева
Locate 5, 1: For ii=1 To grid-0: For jj=1 To grid
If Mid$(puz$, (ii-1)*grid+jj, 1)="b" Then yy=ii+1: xx=jj: jj=jj+1: ky=yy: kx=xx
If Mid$(puz$, (ii-1)*grid+jj, 1)="x" Then d(ii,jj)=1 Else d(ii,jj)=0
Next: Print: Next: 'ky=cY: kx=cX
Locate 4, 1: For qqq=1 To grid-0: For www=1 To grid
l$=Mid$(Str$(d(qqq, www)), 2, 1)
If l$="1" Then Print l$; Else Print " ";
Next: Print
Next: Locate 3+cY, cX: Print "@"
Новый путь выбирают 16 условий и здесь 1 пример
For x=cX+1 To grid+1
'if come to wall... -> | izm x+ cst y
If pdata$(cY, x)="x" Then
ballx=ballx+x2
ay=cY-1: by=cY+1: kx=x-1
If d(ay, kx)=0 Then If d(by, kx)=0 Then delta=2+Int(Rnd*2)
If d(ay, kx)=1 Then If d(by, kx)=0 Then delta=2 ' V
If d(ay, kx)=0 Then If d(by, kx)=1 Then delta=3 ' ^
If d(ay, kx)=1 Then If d(by, kx)=1 Then delta=1 ' <
_Display: GoTo moved
End If
End If
То бишь автоматизация включается когда шарик у стены
На другие языки реально перенести мой малый лабиринт
без оформления графики
Практически игра Змейка в лабиринте
Далее версия кодов ходов и вспомнилась автоматизированная
мной игра 1980-х где персонаж собирает призы избегая врагов
Коды ходов задаются с целью избежать повтора хода
чтобы назад казалось бы не ходить
однако шарик в углу поворачивает не туда и летит назад
ok$ = "": no = Int(Rnd*4): no$ = Str$(no)
sum = 66 + puzzle*8: damax = sum
For jj = 1 To damax: ch = Int(Rnd*2)
If no = 0 And ch = 0 Then da = 2
If no = 0 And ch = 1 Then da = 3
If no = 1 And ch = 0 Then da = 2
If no = 1 And ch = 1 Then da = 3
...
da$ = Str$(da): ok$ = ok$ + Mid$(da$, 2, 1)
no$ = da$: no = da
Next
Чтобы смотрелось веселее начальные уровни 7 и 8
выигрываются подставив внезапно правильные шифры
If puzzle = 7 Then ok$ = "203121302031202203121302031202203121302031202203121302"
If puzzle = 8 Then ok$ = "021213121303031202021213121303031202021213121303031202"
и далее уровни простые 6 5 4 3 2 1 и далее уровень 10 трудный
зато версия MazeKINO меняет авторские уровни случайно
puzzle = 1 + Int(Rnd*10)
Считываем текущий код хода
delta = Val(Mid$(ok$, damax - sum, 1))
без контроля при достижении стенки
и счётчик ходов показывает 2 в степени вариантов поворотов
Даже трудный уровень решают 66000 ... 78000 ходов
MazeLab
Maze game is automated by me and plays
several options itself: moves according to MazeCode list
or random moves MazeStep or optimal moves MazeLab
and in addition MazeRnd synthesizes random mazes
Newest DAV & Danilin MazeLab program solves mazes
by setting next move depending on move of previous one
and depending on type of obstacle in cave: a wall or a corner
If obstacle has no angle then choice of direction is random
perpendicular and initial direction is random
and comes out of dead end back plus there is time and control
Forward-looking direction encoding 0 > / 1 < / 2 V / 3 ^
to choose a random direction of form 2 + Int(Rnd * 2)
shows probability of winning 1/2 ^ of free moves
and probability 1/64 is really difficult
Former version of random moves could create
a cipher of moves not in a row
An internal array has been created and each movement to wall
is checked by 4 * 4 = 16 conditions and a mini array map is built in
plus it is possible to set up moves back if wall
I programmed literally for 1 day by entering control points
Initial 7th maze is reduced to 1st and then 10th
puzzle = 5 ... puzzle = puzzle - 1 ...
If puzzle < puzzlemax Then ... puzzle = 10
I will add early versions of program to topic later
Where has ball been leaving traces on field for a long time
It is possible to create your own mazes and solve them by setting a number
and for sure random cave mazes are possible
It's fun to watch program walk through wrong door
immediately or on most obvious moves
And I haven't checked mazes from books yet
It is easier to translate my algorithm with array & minimap into other languages
In principle it is realistic to check array
if you passed corner of 3rd in row
it means a dead end to start again
MazeRnd version synthesizes a random maze every time
and, in principle, it is easy to set up repetition of maze several times
if instead of zeroing arrays add to end and do not take into account
Excel version is easy to program for sure
Principles are similar to XONIX
https://qb64phoenix.com/forum/showthread.php?tid=519
XONIX https://kenokeno.ucoz.ru/blog/xonix/2022-10-14-90
Automation of MazeRND maze
In reality ball flies aimlessly
and star intersects randomly
author of program encrypted maze into a string
'x is wall & b is ball & y is star
If puzzle=11 Then
puz$="": grid=8
puz$=puz$+"xxxxxxxx"
puz$=puz$+"x xb x"
puz$=puz$+"x yx x"
puz$=puz$+"x xx x"
puz$=puz$+"x x"
puz$=puz$+"x x"
puz$=puz$+"x x"
puz$=puz$+"xxxxxxxx"
End If
We start variables and build walls of an empty maze
where delta is direction of movement 0 > / 1 < / 2 V / 3 ^
Dim d(22, 22), m(22, 22): m$="": all=0: Randomize Timer
delta=Int(Rnd*4): puz$="": grid=Int(Rnd*7)+8: f=grid
For a=1 To f: m(1, a)=1: m(f, a)=1: Next
For a=2 To f-1: m(a, 1)=1: m(a, f)=1:
For b=2 To f-1: m(a,b)=0
Next: Next
We fill 20% of walls and put a star and a ball
and add up string puz$
For i=1 To .2*f^2 : m(Rnd*f, Rnd*f)=1: Next
m(Rnd*(f-3)+2, Rnd*(f-3)+2)=2 ' y
m(Rnd*(f-3)+2, Rnd*(f-3)+2)=3 ' b
For a=1 To f: For b=1 To f ': Print m(a,b);
If m(a,b)=1 Then m$=m$+"x"
If m(a,b)=0 Then m$=m$+" "
If m(a,b)=2 Then m$=m$+"y"
If m(a,b)=3 Then m$=m$+"b"
Next: Next: puz$=m$
To further disassemble puz$ into small maze on left
Locate 5, 1: For ii=1 To grid-0: For jj=1 To grid
If Mid$(puz$, (ii-1)*grid+jj, 1)="b" Then yy=ii+1: xx=jj: jj=jj+1: ky=yy: kx=xx
If Mid$(puz$, (ii-1)*grid+jj, 1)="x" Then d(ii,jj)=1 Else d(ii,jj)=0
Next: Print: Next: 'ky=cY: kx=cX
Locate 4, 1: For qqq=1 To grid-0: For www=1 To grid
l$=Mid$(Str$(d(qqq, www)), 2, 1)
If l$="1" Then Print l$; Else Print " ";
Next: Print
Next: Locate 3+cY, cX: Print "@"
New way is chosen by 16 conditions and here is 1 example
For x=cX+1 To grid+1
'if come to wall... -> | izm x+ cst y
If pdata$(cY, x)="x" Then
ballx=ballx+x2
ay=cY-1: by=cY+1: kx=x-1
If d(ay, kx)=0 Then If d(by, kx)=0 Then delta=2+Int(Rnd*2)
If d(ay, kx)=1 Then If d(by, kx)=0 Then delta=2 ' V
If d(ay, kx)=0 Then If d(by, kx)=1 Then delta=3 ' ^
If d(ay, kx)=1 Then If d(by, kx)=1 Then delta=1 ' <
_Display: GoTo moved
End If
End If
That is automation turns on when ball is against wall
It's really possible to transfer my small maze to other languages
without graphics design
It's practically a Snake game in a Maze
Next version of move codes and automated one came to mind
I'm a 1980s game where a character collects prizes while avoiding enemies
Move codes are set in order to avoid repeating move
so that it would seem not to go back
but ball in corner turns wrong way and flies back
ok$ = "": no = Int(Rnd*4): no$ = Str$(no)
sum = 66 + puzzle*8: damax = sum
For jj = 1 To damax: ch = Int(Rnd*2)
If no = 0 And ch = 0 Then da = 2
If no = 0 And ch = 1 Then da = 3
If no = 1 And ch = 0 Then da = 2
If no = 1 And ch = 1 Then da = 3
...
da$ = Str$(da): ok$ = ok$ + Mid$(da$, 2, 1)
no$ = da$: no = da
Next
To make it look more fun initial levels 7 and 8
they are won by suddenly substituting correct ciphers
If puzzle = 7 Then ok$ = "203121302031202203121302031202203121302031202203121302"
If puzzle = 8 Then ok$ = "021213121303031202021213121303031202021213121303031202"
And then levels are simple 6 5 4 3 2 1 and then level 10 is difficult
but MazeKINO version changes author's levels randomly
puzzle = 1 + Int(Rnd*10)
Reading current step code
delta = Val(Mid$(ok$, damax-sum, 1))
without control when wall
is reached and stroke counter shows 2 to degree of turn options
Even a difficult level is solved with 66000 ... 78000 moves
|