No doubt it's been done before, but here's a quick clone I made of the infamous 2048 game! Got a little bored last night so this is what I managed to hack together. Not perfect code by any means but it seems to work okay… might tidy and comment it later. Feel free to modify/improve/share but if you could give me a little bit of credit that would be awesome. :)/> Video:
https://www.youtube....h?v=UD2SOicH9L4 Source:
http://pastebin.com/ZDQ59nLN Spoiler
-- 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
Icon file for startup
Spoiler
44444444444444444444444
44444444444444444444444
44455545554544445555444
44444545454544445445444
44455545454544445555444
44454445454555545445444
44455545554445445555444
44444444444444444444444
44455555555555555555444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444