当前位置:网站首页>2048 game logic
2048 game logic
2022-07-05 11:27:00 【Full stack programmer webmaster】
math.randomseed(os.time())
local function printGrid(grid)
local celllen = 8 -- one cell have character count
local gridStrLines = {}
table.insert(gridStrLines,"\n-------------------------------------")
for i,row in ipairs(grid) do
local line = {}
-- format the number in the center of the cell
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 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 score = 0
local win = false
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]
if grid[i][j+1]==2048 then
win = true
end
score = score + 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
return score,win
end
local function moveRight(grid)
print("==============moveRight==============")
local score = 0
local win = false
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]
if grid[i][j-1]==2048 then
win = true
end
score = score + 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
return score,win
end
local function moveUp(grid)
print("===============moveUp================")
local score = 0
local win = false
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]
if grid[i+1][j]==2048 then
win = true
end
score = score + 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
return score,win
end
local function moveDown(grid)
print("==============moveDown===============")
local score = 0
local win = false
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]
if grid[i-1][j]==2048 then
win = true
end
score = score + 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
return score,win
end
local function copyGrid(grid)
local m = #grid
local n = #grid[1]
local tmpGrid = {}
for i=1,m do
if not tmpGrid[i] then
tmpGrid[i] = {}
end
for j=1,n do
tmpGrid[i][j] = grid[i][j]
end
end
return tmpGrid
end
local function getOpList(beforeGrid,grid)
local m = #grid
local n = #grid[1]
local op_list = {}
for i=1,m do
for j=1,n do
if beforeGrid[i][j]~=grid[i][j] then
table.insert(op_list,{
'setnum',i,j,grid[i][j]})
end
end
end
return op_list
end
-- serialize lua table. for save lua table in file
function serialize(t)
local mark={}
local assign={}
local function ser_table(tbl,parent)
mark[tbl]=parent
local tmp={}
for k,v in pairs(tbl) do
local key= type(k)=="number" and "["..k.."]" or k
if type(v)=="table" then
local dotkey= parent..(type(k)=="number" and key or "."..key)
if mark[v] then
table.insert(assign,dotkey.."="..mark[v])
else
table.insert(tmp, key.."="..ser_table(v,dotkey))
end
else
table.insert(tmp, key.."="..v)
end
end
return "{
"..table.concat(tmp,",").."}"
end
return ser_table(t,"ret")..table.concat(assign," ")
end
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
randomNum(grid)
randomNum(grid)
return grid
end
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 grid[i][j]==grid[i+1][j] )
or (j<n and grid[i][j]==grid[i][j+1]) then
return true
end
end
end
return false
end
local ops = {
left = moveLeft,
right = moveRight,
up = moveUp,
down = moveDown,
}
function touch_op(grid,op)
local beforeGrid = copyGrid(grid)
local score,win = ops[op](grid)
randomNum(grid)
printGrid(grid)
local op_list = getOpList(beforeGrid,grid)
return op_list,score,win
end
-------------------------------------------------------------------------------
-- for lua console 2048
-------------------------------------------------------------------------------
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
-- uncomment this. you can in console run command to play console 2048. "$ lua logic.lua"
main()
use notepad++ To run the lua Code , To run the command :
cmd /k lua “$(FULL_CURRENT_PATH)” & PAUSE & EXIT
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/109532.html Link to the original text :https://javaforall.cn
边栏推荐
- 跨境电商是啥意思?主要是做什么的?业务模式有哪些?
- POJ 3176-Cow Bowling(DP||记忆化搜索)
- uboot的启动流程:
- MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!
- Leetcode 185 All employees with the top three highest wages in the Department (July 4, 2022)
- Advanced technology management - what is the physical, mental and mental strength of managers
- 技术管理进阶——什么是管理者之体力、脑力、心力
- [office] eight usages of if function in Excel
- MFC pet store information management system
- 修复动漫1K变8K
猜你喜欢
基础篇——REST风格开发
Oneforall installation and use
NFT 交易市场主要使用 ETH 本位进行交易的局面是如何形成的?
Evolution of multi-objective sorting model for classified tab commodity flow
AutoCAD -- mask command, how to use CAD to locally enlarge drawings
Summary of thread and thread synchronization under window
MySQL 巨坑:update 更新慎用影响行数做判断!!!
基于OpenHarmony的智能金属探测器
如何将 DevSecOps 引入企业?
【爬虫】charles unknown错误
随机推荐
Manage multiple instagram accounts and share anti Association tips
[TCP] TCP connection status JSON output on the server
Deepfake tutorial
龙蜥社区第九次运营委员会会议顺利召开
管理多个Instagram帐户防关联小技巧大分享
MySQL 巨坑:update 更新慎用影响行数做判断!!!
Pytorch training process was interrupted
MFC pet store information management system
-26374 and -26377 errors during coneroller execution
SLAM 01. Modeling of human recognition Environment & path
我用开天平台做了一个城市防疫政策查询系统【开天aPaaS大作战】
CDGA|数据治理不得不坚持的六个原则
Web API配置自定义路由
2048游戏逻辑
C#实现WinForm DataGridView控件支持叠加数据绑定
DDR4硬件原理图设计详解
[LeetCode] Wildcard Matching 外卡匹配
7 themes and 9 technology masters! Dragon Dragon lecture hall hard core live broadcast preview in July, see you tomorrow
【Oracle】使用DataGrip连接Oracle数据库
Dspic33ep clock initialization program