|
2048 скрипт на языке пилота |
|
|
FREEON |
19.5.2018, 17:28
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1318
Пользователь №: 18.346
Возраст: 25
|
Цитата(DarkMaster @ 19.5.2018, 11:04) grid - это массив со всеми числами.
Lua - это лишь набор синтаксиса. Функции все те же самые пилотовские остаются.
Все ровно непонятно наверное lua работает напрямую со страницей html кодом. в любом случае это нето что мне нужно. Я хотел бы запилить скрипт который сканирует сетку(финд image или color) просчытывает лучшие варианты и делает ход и затем снова делает анализ просчитывает и ходит. На самом деле 2048 является базой для многих игр. Главно создать сетку 4х4 и просчитать возможные комбинации при смещении влево, все возможные лучшие комбинации вправо, вверх или вниз, желательно на несколько ходов вперед что бы собрать больший уровень цифры(камня) и преоритеть на пустые ячейки и затем отправить лучший вариант для выполнения. к примеру сетка имеет такой вид: 0 0 1 0 0 0 1 0 2 0 0 3 0 0 0 0 анализируем направление хода: затем идет анализ что будет при смещении влево. одинаковые цифры сумируються и смещаються до стенки. И затем модулируем возможность относительно каждого хода. еще важно учитывать что каждый ход в случайной пустой клетке появляется камень цифра в любой свободной ячейке, то есть 0 просчете на несколько ходов меняем на 1 если создовая глубину хода например поле может иметь вид вправо | влево | вниз | вверх 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 2 1 2 3 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 2 3 1 1 | 1 1 2 3 | 1 1 1 1 | 1 1 1 1 1 1 1 1 | 1 1 1 1 | 2 1 2 3 | 1 1 1 1 и затем просчитываем глубину, для каждого хода во всех направлениях то есть модулируем 16 возможных вариантов хода относительно по 4 направления для каждого варианта текущей глубины
|
|
|
|
FREEON |
19.5.2018, 22:35
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1318
Пользователь №: 18.346
Возраст: 25
|
Цитата(DarkMaster @ 19.5.2018, 21:16) Я хз что есть 2048, если честно. Судя по коду это вообще консольная реализация самой игры.
Да, это консольная реализация. Хз как в пилоте это выполнить, т.к. там нужен io.input, тем не менее прекрасно работает в интерпретаторе луа.
(IMG: style_emoticons/default/sad.gif) эххх плохо. Ну если в поисковик вбить бот 2048 то там половина мусора про то как заработать биткойн при помощи этой игры. Но мне это не нужно так как мне кажеться на развод похоже, а вот скрипт реально помог бы набивать очки и брать призовые места в миниигре (IMG: style_emoticons/default/mellow.gif)
|
|
|
|
FREEON |
11.6.2018, 12:03
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1318
Пользователь №: 18.346
Возраст: 25
|
Вот нарыл есчо один код на Lua связанный с игрой 2048. Помогите пожалуйста разобраться, что здесь описано. (IMG: style_emoticons/default/unsure.gif) lua
Код -- 2048 -- Clone by Richard (Rich73) -- Hacked together 10/04/2014
g = { } tiles = { } tiles[1] = {" ", 1} tiles[2] = {" 2 ", 2} tiles[3] = {" 4 ", 4} tiles[4] = {" 8 ", 8} tiles[5] = {" 16 ", 16} tiles[6] = {" 32 ", 32} tiles[7] = {" 64 ", 64} tiles[8] = {"128 ", 128} tiles[9] = {"256 ", 256} tiles[10] = {"512 ", 512} tiles[11] = {"1024", 1024} tiles[12] = {"2048", 2048} bg = "icon" size = 4 score = 0 hiscore = 0
function createBoard() for i=1, size do g[i] = { } for j=1, size do g[i][j] = 0 end end for j=1, 2 do local x, y = findEmptyPos() g[y][x] = 1 end end
function getRandomPos() return math.random(size), math.random(size) end
function findEmptyPos() while true do x, y = getRandomPos() if g[y][x] == 0 then return x, y end end end
function isFull() local full = true for i=1, size do for j=1, size do if g[i][j] == 0 then full = false end end end return full end
function canMove() if not isFull() then return true end local pr = nil for i=1, size do local k = 1 while k <= size do if k~=size and g[i][k] == g[i][k+1] or false then break end if pr and g[i][k] == pr[k] or false then break end k = k + 1 end if k ~= size+1 then return true end pr = g[i] end return false end
function moveLeft() for i=1, size do for j=2, size do local k = j while k > 1 do if g[i][k] == 0 then break elseif g[i][k] == g[i][k-1] then g[i][k-1] = g[i][k] + 1 g[i][k] = 0 score = score + math.pow(2,g[i][k-1]) k = k-1 elseif g[i][k-1] == 0 then g[i][k-1] = g[i][k] g[i][k] = 0 else break end k = k-1 end end end end
function moveUp() for j=1, size do for i=2, size do local k = i while k > 1 do if g[k][j] == 0 then break elseif g[k][j] == g[k-1][j] then g[k-1][j] = g[k][j] + 1 g[k][j] = 0 score = score + math.pow(2,g[k-1][j]) k = k-1 elseif g[k-1][j] == 0 then g[k-1][j] = g[k][j] g[k][j] = 0 else break end k = k-1 end end end end
function moveRight() flipX() moveLeft() flipX() end
function moveDown() flipY() moveUp() flipY() end
function drawBoard() term.setBackgroundColor(colors.black) term.clear() term.setTextColor(colors.white) for x=1, size do for y=1, size do term.setCursorPos(x*5-1,y*4-2) term.setBackgroundColor(tiles[g[y][x]+1][2]) term.write(" ") term.setCursorPos(x*5-1,y*4-1) term.write(tiles[g[y][x]+1][1]) term.setCursorPos(x*5-1,y*4) term.write(" ") end end term.setCursorPos(4,18) term.setBackgroundColor(colors.black) term.write("Score: "..score) drawScores() end
function drawScores() term.setCursorPos(4,18) term.setBackgroundColor(colors.black) term.write(" Score: "..score) term.setCursorPos(4,19) term.write("HiScore: "..hiscore) end
function drawHome() term.clear() im = paintutils.loadImage(bg) paintutils.drawImage(im,2,2) end
function table.reverse(tab) local newtab = { } for i=1, #tab do newtab[#tab+1-i] = tab[i] end return newtab end
function flipX() for i=1, size do g[i] = table.reverse(g[i]) end end
function flipY() g = table.reverse(g) end
function update() drawBoard() if not isFull() then local x, y = findEmptyPos() g[y][x] = 1 end os.sleep(0.075) end
function newGame() if score > hiscore then hiscore = score end score = 0 term.setCursorPos(9,18) term.setBackgroundColor(colors.white) term.setTextColor(colors.black) term.clearLine() term.write("GAME OVER!") term.setCursorPos(8,19) term.clearLine() term.write("New game? y/n") while true do local event, key = os.pullEvent("key") if event=="key" then if key==keys.y then return true end if key==keys.n then return false end end end end
drawHome()
os.sleep(2) while true do createBoard() while canMove() do drawBoard() event, key = os.pullEvent("key") if event == "key" then if key == keys.left then moveLeft() elseif key == keys.right then moveRight() update() elseif key == keys.up then moveUp() update() elseif key == keys.down then moveDown() update() elseif key == keys.q then break end end end drawBoard() if not newGame() then term.setBackgroundColor(colors.black) term.setTextColor(colors.white) term.clear() term.setCursorPos(1,1) break end end
|
|
|
|
FREEON |
21.2.2019, 19:39
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1318
Пользователь №: 18.346
Возраст: 25
|
Переделал под себя для теста(испытаний) скрипта(открыть файл index.html):
2048_AI_master.zip ( 231,32 килобайт )
Кол-во скачиваний: 244Очень долго сканирует поле. (IMG: style_emoticons/default/mad.gif) Код init_arr %image 2 4 8 16 32 64 128 // имена картинок set $path "D:\_UOPilot\_2048\" // путь к картинкам init_arr %coord 434, 39 933, 541 // координаты для findimage
set #stepX (%coord [3] - %coord [1]) / 4 // шаг по X set #stepY (%coord [4] - %coord [2]) / 4 // шаг по Y set #z 0 for #i 1 size(%image) // поиск картинок set #a findimage(%coord [1] %coord [2] %coord [3] %coord [4] ($path%image[#i].bmp) %arr 2 90 -1 3) if #a > 0 for #j 1 size(%arr) set #z #z + 1 init_arr %temp (#z) %arr [#j 1] %arr [#j 2] %image[#i] // добавить в массив координаты и имя картинки end_for end_if end_for
for #i 1 4 // заполнить массив 4*4 нулями init_arr %field (#i) 0 0 0 0 end_for
for #i 1 #z // подсчёт позиции картинки на поле set #x (%temp [#i 1] - %coord [1]) / #stepX + 1 set #y (%temp [#i 2] - %coord [2]) / #stepY + 1 set %field [#y #x] %temp [#i 3] // имя картинки в нужный элемент массива end_for
log clear log mode compact set delimiter ' ' for #i 1 4 // вывод в лог log %field [#i] end_for set delimiter end_script
позиция плитки-1-1 0px; 0px позиция плитки-1-2 0px; 121px позиция плитки-1-3 0px; 243px позиция плитки-1-4 0px; 364px позиция плитки-2-1 121px; 0px позиция плитки-2-2 121px; 121px позиция плитки-2-3 121px; 243px позиция плитки-2-4 121px; 364px позиция плитки-3-1 243px; 0px позиция плитки-3-2 243px; 121px позиция плитки-3-3 243px; 243px позиция плитки-3-4 243px; 364px позиция плитки-4-1 364px; 0px позиция плитки-4-2 364px; 121px позиция плитки-4-3 364px; 243px позиция плитки-4-4 364px; 364px Как бы у каждой плитки свои уникальные цвета: 2 - #eee4da; 4 - #ede0c8; 8 - #f2b179; 16 - #f59563; 32 - #f67c5f; 64 - #f65e3b; 128 - #edcf72; 256 - #edcc61; 512 - #edc850; 1024 - #edc53f; 2048 - #edc22e;
|
|
|
|
FREEON |
21.2.2019, 20:54
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1318
Пользователь №: 18.346
Возраст: 25
|
Цитата(DarkMaster @ 21.2.2019, 20:04) Какой размер картинок? 5*5 будет достаточно.
Если цвета уникальные, то можно попробовать findcolor.
я пробовал 5 на 5 но он тогда уходит в вечное вычесление...не понимаю почему а цвета вот: для 2: 14279661 и 14345454 для 4: 13164781 для 8: 7975410 для 16: 6526453 для 32: 6257910 для 64: 3890934 для 128: 7524333 для 256: 6409453 для 512: 5294317 для 1024: 4179437
|
|
|
|
FREEON |
22.2.2019, 11:53
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1318
Пользователь №: 18.346
Возраст: 25
|
Цитата(cirus @ 22.2.2019, 9:30) код
Код init_arr %number 0 2 4 8 16 32 64 128 // цифры init_arr %number_color 11846093 14345454 13164781 7975410 6526453 6257910 3890934 7524333 // цвета
set #startX 540 // координата X начала поиска set #startY 140 // координата Y начала поиска set #stepX 120 // шаг по Y set #stepY 120 // шаг по Y log clear log mode compact set #endX #startX + #stepX * 4 set #endY #startY + #stepY * 4
set $str_color "" for #i 1 size(%number_color) set $str_color $str_color %number_color [#i] // цвета в одну строку end_for //log $str_color
set #a findcolor (#startX #startY #endX #endY #stepX #stepY ($str_color) %a) // поиск hint #a if #a = 16 for #i 1 4 // заполнить массив 4*4 нулями init_arr %field (#i) 0 0 0 0 end_for
for #i 1 #a // для всех найденных точек set #x (%a[#i 1] - #startX) / #stepX + 1 set #y (%a[#i 2] - #startY) / #stepY + 1 for #j 1 size(%number_color) if %a[#i 3] = %number_color [#j] // если цвет совпадает пишем в массив число, которое находится в клетке set %field [#y #x] %number [#j] break end_if end_for end_for else log Найдено меньше 16 цветов end_if
set delimiter ' ' for #i 1 4 // вывод в лог log %field [#i] end_for set delimiter end_script #startX и #startY это любая точка на левой верхней плитке где не может быть цифры. Я указывал центр плитки чуть выше цифры. Вполне хороший результат сканирования по времени Переделал плитки. Убрал эфекты теней, обводку и радиус, теперь каждая плитка действительно уникальная.
2048_AI_master_newtile.zip ( 230,89 килобайт )
Кол-во скачиваний: 210Код init_arr %number 0 2 4 8 16 32 64 128 256 521 1024 2048 // цифры init_arr %number_color 11846093 13499135 11920639 7975410 6526453 6257910 3890934 7524333 6409453 5294317 55295 65535 // цвета
|
|
|
|
XaЛBa |
5.2.2020, 4:25
|
Neophyte
Сообщений: 32
Регистрация: 12.4.2019 Группа: Пользователи Наличность: 0
Пользователь №: 19.293
|
начал заниматься задачей и который час туплю, делаю блок на смещение массива (для начала на лево), так почемуто одинаковые не складывает а если с лева ноль - то смещает только на одну ячейку, в чем косяк - не пойму Код log clear set delimiter ' ' load_array %test test.txt //загружаю массив для теста log open 1 1 450 300 for #i 1 4 //вывод в лог массива log %test [#i] Исходник end_for
//==cсмещение в ЛЕВО==// for #i 1 4 //строчка for #j 2 4 //ячейка set #jj #j - 1 //левее ячейка while #j > 1 //зациклюсь if %test [#i #j] = 0 //пропущу нули break else //леввая и правая равны if %test [#i #j] = %test [#i #jj] set %test [#i #jj] %test [#i #j] + 1 set %test [#i #j] 0 end_if //левая ноль if %test [#i #jj] = 0 set %test [#i #jj] %test [#i #j] set %test [#i #j] 0 end_if set #j #j - 1 end_if break end_while end_for log %test [#i] шаг в ЛЕВО //что вышло end_for
//==считаем суммы==// set #sum 0 //сумма всех камней set #zero 0 //количество пустых set size(%arr) //обнулю массив for #i 1 4 for #j 1 4 if %test [#i #j] = 0 set #count #count + 1 else set #sum #sum + %test [#i #j] end_if end_for end_for set #zero #count set #sum #sum log #zero Количество пустых #sum Сумма чисел init_arr %arr (1) #zero #sum //потом понадобиться end_script тут я работаю уже через файл и пропусти блок где с финдом создаю массив расположения камней в ячейках. вощем встал в ступор, подскажите где косяк.потом второй момент.С каждым результатом #zero и #sum от каждого смещения выберу максимальный . И вот тут будет вопрос - а как поступить если выйдет что будет 2 одинаковых решения, ну и #zero #sum будут равны, тут я точно незнаю как выбрать вариант
|
|
|
|
DarkMaster |
5.2.2020, 19:38
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
Когда я пользовался AHK он очень сильно уступал по сути дела во всем. AutoIT конструктор который сложно сравнивать. Чего нацепляли к нему то и получили. Больше админская у нее направленность. Хотя комбайн еще тот. На самом деле после подключения Lua очень тяжело все это сравивать, т.к. мы тоже получили комбайн. Мы можем спокойно взаимодействовать с базами данных, сетью, создавать окошки, использовать шифрования, апи мессенджеров и многое другое. Это все спокойно подключается либами и используется. Либы с трушного сайта https://luapower.com/Runtimes luajit terra nginx Deployment bundle terra.binder Standard Libraries glue pp oo events coro errors lpeg Portable OS APIs fs nw socket socketloop thread pthread proc time hidapi Portable UI (WIP) ui terra.layer terra.tr Portable 2D Graphics cairo bitmap color boxblur Native OS APIs winapi winapi.wglpanel winapi.cairopanel objc xlib 2D Geometry path2d affine2d box2d clipper Image Formats giflib libjpeg libpng bmp Unicode utf8 utf8quot ucdn Hashing xxhash blake2 sha2 md5 hmac Compression zlib Serialization cjson expat genx libb64 Networking luasec resolver libcurl rsync Databases mysql Templating mustache Motion tweening easing Spell Checking hunspell Data Structures heap Lua Support Libs amoeba eq opengl luastate cbframe path unixperms dynasm rangelist C Support Libs pixman libmariadb openssl lua-headers shm llvm freetype harfbuzz fribidi libunibreak pcre Development Tools inspect cplayer gfonts hash_benchmark unit testui Web Development webb Terra Standard Libraries terra.low terra.arrayview terra.dynarray terra.hashmap terra.phf terra.linkedlist terra.fixedfreelist terra.arrayfreelist terra.lrucache terra.bitarray terra.utf8 terra.random Terra Support Libs terra.bitmap terra.cairo terra.box2d terra.boxblur mingw64-headers Package Management luapower luapower_db luapower-repos Help needed libsoundio videoinput libexif lz4 libsodium libogg rs232 Unmaintained ui0 tr0 linkedlist lrucache bnet ffi_reflect struct minizip lanes Misc csv dollar font_db fonts-amiri fonts-awesome fonts-dejavuserif fonts-fireflysung fonts-fixedsys fonts-ionicons fonts-material-icons fonts-noto-emoji fonts-open-sans lx resty-core resty-lrucache website xlsxwrite
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Levo222 |
5.2.2020, 20:05
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Цитата(DarkMaster @ 5.2.2020, 23:38) Когда я пользовался AHK он очень сильно уступал по сути дела во всем. AutoIT конструктор который сложно сравнивать. Чего нацепляли к нему то и получили. Больше админская у нее направленность. Хотя комбайн еще тот. На самом деле после подключения Lua очень тяжело все это сравивать, т.к. мы тоже получили комбайн. Мы можем спокойно взаимодействовать с базами данных, сетью, создавать окошки, использовать шифрования, апи мессенджеров и многое другое. Это все спокойно подключается либами и используется. Либы с трушного сайта https://luapower.com/-
Runtimes
luajit terra nginx
Deployment
bundle terra.binder
Standard Libraries
glue pp oo events coro errors lpeg
Portable OS APIs
fs nw socket socketloop thread pthread proc time hidapi
Portable UI (WIP)
ui terra.layer terra.tr
Portable 2D Graphics
cairo bitmap color boxblur
Native OS APIs
winapi winapi.wglpanel winapi.cairopanel objc xlib
2D Geometry
path2d affine2d box2d clipper
Image Formats
giflib libjpeg libpng bmp
Unicode
utf8 utf8quot ucdn
Hashing
xxhash blake2 sha2 md5 hmac
Compression
zlib
Serialization
cjson expat genx libb64
Networking
luasec resolver libcurl rsync
Databases
mysql
Templating
mustache
Motion
tweening easing
Spell Checking
hunspell
Data Structures
heap
Lua Support Libs
amoeba eq opengl luastate cbframe path unixperms dynasm rangelist
C Support Libs
pixman libmariadb openssl lua-headers shm llvm freetype harfbuzz fribidi libunibreak pcre
Development Tools
inspect cplayer gfonts hash_benchmark unit testui
Web Development
webb
Terra Standard Libraries
terra.low terra.arrayview terra.dynarray terra.hashmap terra.phf terra.linkedlist terra.fixedfreelist terra.arrayfreelist terra.lrucache terra.bitarray terra.utf8 terra.random
Terra Support Libs
terra.bitmap terra.cairo terra.box2d terra.boxblur mingw64-headers
Package Management
luapower luapower_db luapower-repos
Help needed
libsoundio videoinput libexif lz4 libsodium libogg rs232
Unmaintained
ui0 tr0 linkedlist lrucache bnet ffi_reflect struct minizip lanes
Misc
csv dollar font_db fonts-amiri fonts-awesome fonts-dejavuserif fonts-fireflysung fonts-fixedsys fonts-ionicons fonts-material-icons fonts-noto-emoji fonts-open-sans lx resty-core resty-lrucache website xlsxwrite Весомо
|
|
|
|
XaЛBa |
7.2.2020, 4:47
|
Neophyte
Сообщений: 32
Регистрация: 12.4.2019 Группа: Пользователи Наличность: 0
Пользователь №: 19.293
|
, чтото начал думать дальше, вот что своялось Код //==cсмещение в ЛЕВО==// for #i 1 4 //строчка for #j 2 4 //ячейка set #jj #j - 1 //левее ячейка while #j > 1 //зациклюсь if %test [#i #j] = 0 //пропущу нули break else if %test [#i #j] = %test [#i #jj] //леввая и правая равны set %test [#i #jj] %test [#i #j] + 1 set %test [#i #j] 0 set #j #j - 1 break end_if if %test [#i #jj] = 0 //левая ноль set %test [#i #jj] %test [#i #j] set %test [#i #j] 0 set #j #j - 1 else break end_if set #j #j - 1 break end_if break end_while end_for log %test [#i] шаг в ЛЕВО //что вышло end_for ...... стало намного лучше, но, банально рушиться все на двух парах, пример 2 2 2 2, выдает как 3 3 0 0 , а должно быть 4 0 0 0
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|