当前位置:网站首页>2048游戏逻辑
2048游戏逻辑
2022-07-05 11:23:00 【全栈程序员站长】
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()
用notepad++来运行lua代码,要运行命令:
cmd /k lua “$(FULL_CURRENT_PATH)” & PAUSE & EXIT
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/109532.html原文链接:https://javaforall.cn
边栏推荐
- About the use of Vray 5.2 (self research notes)
- IPv6与IPv4的区别 网信办等三部推进IPv6规模部署
- [TCP] TCP connection status JSON output on the server
- Wechat nucleic acid detection appointment applet system graduation design completion (7) Interim inspection report
- 【DNS】“Can‘t resolve host“ as non-root user, but works fine as root
- [JS] extract the scores in the string, calculate the average score after summarizing, compare with each score, and output
- [advertising system] parameter server distributed training
- go语言学习笔记-初识Go语言
- R3live series learning (IV) r2live source code reading (2)
- Paradigm in database: first paradigm, second paradigm, third paradigm
猜你喜欢
The ninth Operation Committee meeting of dragon lizard community was successfully held
Detailed explanation of DDR4 hardware schematic design
Wechat nucleic acid detection appointment applet system graduation design completion (6) opening defense ppt
高校毕业求职难?“百日千万”网络招聘活动解决你的难题
【爬虫】wasm遇到的bug
龙蜥社区第九次运营委员会会议顺利召开
How did the situation that NFT trading market mainly uses eth standard for trading come into being?
Evolution of multi-objective sorting model for classified tab commodity flow
CDGA|数据治理不得不坚持的六个原则
Three paradigms of database
随机推荐
Wechat nucleic acid detection appointment applet system graduation design completion (6) opening defense ppt
In the last process before the use of the risk control model, 80% of children's shoes are trampled here
基础篇——REST风格开发
uboot的启动流程:
Beego cross domain problem solution - successful trial
Data type
7.2每日学习4
Dspic33ep clock initialization program
Question and answer 45: application of performance probe monitoring principle node JS probe
pytorch训练进程被中断了
购买小间距LED显示屏的三个建议
Basic part - basic project analysis
Basics - rest style development
SLAM 01. Modeling of human recognition Environment & path
Detailed explanation of DDR4 hardware schematic design
spark调优(一):从hql转向代码
How to introduce devsecops into enterprises?
LSTM applied to MNIST dataset classification (compared with CNN)
What does cross-border e-commerce mean? What do you mainly do? What are the business models?
无密码身份验证如何保障用户隐私安全?