清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
--[[============================================================================= # FileName: 2048.lua # Desc: lua console 2048 # Author: hanxi # Email: hanxi.info@gmail.com # HomePage: http://www.hanxi.info # Version: 0.0.1 # LastChange: 2014-04-28 11:05:09 # History: =============================================================================]] local function initGrid(m,n) local grid = {} for i=1,m do if not grid[i] then grid[i] = {} end for j=1,n do grid[i][j] = 0 end end return grid end local function printGrid(grid) local celllen = 8 -- 每个格子占用字符数 local gridStrLines = {} table.insert(gridStrLines,"-------------------------------------") for i,row in ipairs(grid) do local line = {} for _,num in ipairs(row) do if num==0 then local pres = "" for tmp=1,celllen do pres = pres .. " " end local s = string.format("%s",pres) table.insert(line,s) else local s = tostring(num) local l = string.len(s) local l = (celllen-l)/2 local prel = math.floor(l) local sufl = math.ceil(l) local pres = "" for tmp=1,prel do pres = pres .. " " end local sufs = pres if sufl>prel then sufs = pres.. " " end local s = string.format("%s%s%s",pres,s,sufs) table.insert(line,s) end end local line = table.concat(line,"|") line = "|" .. line .. "|" table.insert(gridStrLines,line) table.insert(gridStrLines,"-------------------------------------") end local gridStr = table.concat(gridStrLines,"\n") print(gridStr) end local function randomGrid(grid) local m = #grid local n = #grid[1] for i=1,m do for j=1,n do local r = math.random(1,5) local num = 2^r grid[i][j] = num end end end local function getRandomZeroPos(grid) local m = #grid local n = #grid[1] local zeros = {} for i=1,m do for j=1,n do if grid[i][j]==0 then table.insert(zeros,{i=i,j=j}) end end end if #zeros>0 then local r = math.random(1,#zeros) return zeros[r].i,zeros[r].j end end local function randomNum(grid) local i,j = getRandomZeroPos(grid) if i and j then local r = math.random() if r<0.9 then grid[i][j] = 2 else grid[i][j] = 4 end return i,j end end local function moveLeft(grid) print("==============moveLeft===============") local m = #grid local n = #grid[1] for i=1,m do local line = {} for j=1,n do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k=#line for j=1,n do if j<=k then grid[i][j] = line[j] else grid[i][j] = 0 end end for j=1,k-1 do if grid[i][j]==grid[i][j+1] then grid[i][j+1] = grid[i][j] + grid[i][j+1] for x=j,n-1 do grid[i][x] = grid[i][x+1] end grid[i][n] = 0 end end end end local function moveRight(grid) print("==============moveRight==============") local m = #grid local n = #grid[1] for i=1,m do local line = {} for j=n,1,-1 do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k = #line for j=n,1,-1 do if n-j+1<=k then grid[i][j] = line[n-j+1] else grid[i][j] = 0 end end for j=n,n-k+2,-1 do if grid[i][j]==grid[i][j-1] then grid[i][j-1] = grid[i][j] + grid[i][j-1] for x=j,2,-1 do grid[i][x] = grid[i][x-1] end grid[i][1] = 0 end end end end local function moveUp(grid) print("===============moveUp================") local m = #grid local n = #grid[1] for j=1,n do local line = {} for i=1,m do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k = #line for i=1,m do if i<=k then grid[i][j] = line[i] else grid[i][j] = 0 end end for i=1,k-1 do if grid[i][j]==grid[i+1][j] then grid[i+1][j] = grid[i][j] + grid[i+1][j] for x=i,m-1 do grid[x][j] = grid[x+1][j] end grid[m][j] = 0 end end end end local function moveDown(grid) print("==============moveDown===============") local m = #grid local n = #grid[1] for j=1,n do local line = {} for i=m,1,-1 do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k = #line for i=m,1,-1 do if m-i+1<=k then grid[i][j] = line[m-i+1] else grid[i][j] = 0 end end for i=m,m-k+2,-1 do if grid[i][j]==grid[i-1][j] then grid[i-1][j] = grid[i][j] + grid[i-1][j] for x=i,2,-1 do grid[x][j] = grid[x-1][j] end grid[1][j] = 0 end end end end local function canMove(grid) local m = #grid local n = #grid[1] for i=1,m do for j=1,n do if grid[i][j]==0 then return true end if (i<m and j<n) and (grid[i][j]==grid[i][j+1] or grid[i][j]==grid[i+1][j]) then return true end end end return false end local function main() local grid = initGrid(4,4) randomNum(grid) printGrid(grid) io.write("next step 'a'[←],'w'[↑],'s'[↓],'d'[→],'q'[exit] >> ") local input = io.read() while input~="q" do if input=="a" or input=="w" or input=="s" or input=="d" then if input=="a" then moveLeft(grid) elseif input=="w" then moveUp(grid) elseif input=="s" then moveDown(grid) elseif input=="d" then moveRight(grid) end randomNum(grid) printGrid(grid) else print("error input. please input 'a'[←] or 'w'[↑] or 's'[↓] or 'd'[→] or 'q'[exit]") end io.write("next step 'a'[←],'w'[↑],'s'[↓],'d'[→],'q'[exit] >> ") input = io.read() end end main()