UoKit.com Форумы > Кликер > UO Pilot
Страницы: 1, 2, 3
FREEON
Мужыки нужна помощь. Есть бот для всем известной игры 2048 на языке lua помогите мне его переписать на язык пилота. Хочу переписать его для использования в другой но по алгоритму похожей
Оригинал:
Нажмите для просмотра прикрепленного файла
То к чему хочу прикрутить:
Нажмите для просмотра прикрепленного файла

2048 на AutoIt
2048 на AutoHotkey
Как-то не серьезно нужно срочно на языке пилота запилить
Пример игры для теста скрипта(открыть файл index.html):
Нажмите для просмотра прикрепленного файла
Вверх
DarkMaster
А смысл? Ну используйте луа в пилоте.
Вверх
FREEON
Цитата(DarkMaster @ 19.5.2018, 3:30)

А смысл? Ну используйте луа в пилоте.

Ну как бы это объяснить на языке пилота местами хоть знакомые буквы узнаю, а lua тёмный лес
Не подскажете тогда место где задаются(описываются) числа? Цвет, картинка, или как вообще луа понимает что 2 это не 4 или 8
Вверх
DarkMaster
grid - это массив со всеми числами.

Lua - это лишь набор синтаксиса. Функции все те же самые пилотовские остаются.
Вверх
FREEON
Цитата(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 направления для каждого варианта текущей глубины
Вверх
DarkMaster
Цитата
Все ровно непонятно наверное lua работает напрямую со страницей html кодом.

Я хз что есть 2048, если честно. Судя по коду это вообще консольная реализация самой игры.

Да, это консольная реализация. Хз как в пилоте это выполнить, т.к. там нужен io.input, тем не менее прекрасно работает в интерпретаторе луа.
Вверх
FREEON
Цитата(DarkMaster @ 19.5.2018, 21:16)

Я хз что есть 2048, если честно. Судя по коду это вообще консольная реализация самой игры.

Да, это консольная реализация. Хз как в пилоте это выполнить, т.к. там нужен io.input, тем не менее прекрасно работает в интерпретаторе луа.

эххх плохо.
Ну если в поисковик вбить бот 2048 то там половина мусора про то как заработать биткойн при помощи этой игры. Но мне это не нужно так как мне кажеться на развод похоже, а вот скрипт реально помог бы набивать очки и брать призовые места в миниигре
Вверх
FREEON
Вот нарыл есчо один код на Lua связанный с игрой 2048. Помогите пожалуйста разобраться, что здесь описано.
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
Переделал под себя для теста(испытаний) скрипта(открыть файл index.html):
Нажмите для просмотра прикрепленного файла
Очень долго сканирует поле.
Код

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;
Вверх
DarkMaster
Какой размер картинок? 5*5 будет достаточно.

Если цвета уникальные, то можно попробовать findcolor.
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.