2048增加按钮操作,修复分数计算错误

This commit is contained in:
MrZ626
2021-01-08 01:18:53 +08:00
parent 783c3eced4
commit 96e1253030
3 changed files with 72 additions and 41 deletions

View File

@@ -611,6 +611,12 @@ return{
}, },
mg_2048={ mg_2048={
blind="Blind", blind="Blind",
tapControl="Tap control",
up="",
down="",
left="",
right="",
skip="Skip Round", skip="Skip Round",
reset="Reset", reset="Reset",
}, },

View File

@@ -615,6 +615,12 @@ return{
}, },
mg_2048={ mg_2048={
blind="盲打", blind="盲打",
tapControl="点击操作",
up="",
down="",
left="",
right="",
skip="跳过回合", skip="跳过回合",
reset="重置", reset="重置",
}, },

View File

@@ -1,5 +1,5 @@
local gc=love.graphics local gc=love.graphics
local rectangle=gc.rectangle local setColor,rectangle=gc.setColor,gc.rectangle
local int,abs=math.floor,math.abs local int,abs=math.floor,math.abs
local rnd,min=math.random,math.min local rnd,min=math.random,math.min
@@ -12,6 +12,7 @@ local scene={}
local board local board
local blind local blind
local tapControl
local startTime,time local startTime,time
local state,progress local state,progress
local skipCD,skipUsed local skipCD,skipUsed
@@ -61,6 +62,7 @@ local function airExist()
end end
end end
local function newTile() local function newTile()
--Select position & generate number
nextPos=(nextPos+6)%16+1 nextPos=(nextPos+6)%16+1
local p=nextPos local p=nextPos
while board[p]do while board[p]do
@@ -70,6 +72,11 @@ local function newTile()
prevPos=p prevPos=p
prevSpawnTime=0 prevSpawnTime=0
--Fresh score
score=score+2^nextTile
TEXT.show("+"..2^nextTile,1130+rnd(-60,60),555+rnd(-40,40),30,"score",1.5)
--Generate next number
nextCD=nextCD-1 nextCD=nextCD-1
if nextCD>0 then if nextCD>0 then
nextTile=1 nextTile=1
@@ -78,15 +85,6 @@ local function newTile()
nextCD=rnd(8,12) nextCD=rnd(8,12)
end end
--Fresh score
score=0
for i=1,16 do
if board[i]and board[i]>0 then
score=score+2^board[i]
end
end
TEXT.show("+"..2^nextTile,1130+rnd(-60,60),555+rnd(-40,40),30,"score",1.5)
--Check if board is full --Check if board is full
if airExist()then return end if airExist()then return end
@@ -218,21 +216,24 @@ function scene.sceneInit()
board={} board={}
blind=false blind=false
tapControl=true
startTime,time=0,0 startTime,time=0,0
state=0 state=0
reset() reset()
end end
function scene.mouseDown(x,y,k) function scene.mouseDown(x,y,k)
if k==2 then if tapControl then
skip() if k==2 then
else skip()
local dx,dy=x-640,y-360 else
if abs(dx)<320 and abs(dy)<320 and(abs(dx)>60 or abs(dy)>60)then local dx,dy=x-640,y-360
scene.keyDown(abs(dx)-abs(dy)>0 and if abs(dx)<320 and abs(dy)<320 and(abs(dx)>60 or abs(dy)>60)then
(dx>0 and"right"or"left")or scene.keyDown(abs(dx)-abs(dy)>0 and
(dy>0 and"down"or"up") (dx>0 and"right"or"left")or
) (dy>0 and"down"or"up")
)
end
end end
end end
end end
@@ -264,6 +265,7 @@ function scene.keyDown(key)
elseif key=="space"then skip() elseif key=="space"then skip()
elseif key=="r"then reset() elseif key=="r"then reset()
elseif key=="q"then if state==0 then blind=not blind end elseif key=="q"then if state==0 then blind=not blind end
elseif key=="w"then if state==0 then tapControl=not tapControl end
elseif key=="escape"then SCN.back() elseif key=="escape"then SCN.back()
end end
end end
@@ -279,32 +281,32 @@ end
function scene.draw() function scene.draw()
setFont(40) setFont(40)
gc.setColor(1,1,1) setColor(1,1,1)
gc.print(format("%.3f",time),1026,80) gc.print(format("%.3f",time),1026,80)
--Progress time list --Progress time list
setFont(30) setFont(30)
gc.setColor(.7,.7,.7) setColor(.7,.7,.7)
for i=1,#progress do for i=1,#progress do
gc.print(progress[i],1000,130+32*i) gc.print(progress[i],1000,130+32*i)
end end
--Score --Score
setFont(40) setFont(40)
gc.setColor(1,.7,.7) setColor(1,.7,.7)
mStr(score,1130,490) mStr(score,1130,490)
--Messages --Messages
if state==2 then if state==2 then
--Draw no-setting area --Draw no-setting area
gc.setColor(1,0,0,.3) setColor(1,0,0,.3)
rectangle("fill",15,335,285,250) rectangle("fill",15,335,285,140)
gc.setColor(.9,.9,0)--win setColor(.9,.9,0)--win
elseif state==1 then elseif state==1 then
gc.setColor(.9,.9,.9)--game setColor(.9,.9,.9)--game
elseif state==0 then elseif state==0 then
gc.setColor(.2,.8,.2)--ready setColor(.2,.8,.2)--ready
end end
gc.setLineWidth(10) gc.setLineWidth(10)
rectangle("line",310,30,660,660) rectangle("line",310,30,660,660)
@@ -315,20 +317,20 @@ function scene.draw()
local x,y=1+(i-1)%4,int((i+3)/4) local x,y=1+(i-1)%4,int((i+3)/4)
local N=board[i] local N=board[i]
if i~=prevPos or prevSpawnTime==1 then if i~=prevPos or prevSpawnTime==1 then
gc.setColor(tileColor[N]or COLOR.black) setColor(tileColor[N]or COLOR.black)
rectangle("fill",x*160+163,y*160-117,154,154,15) rectangle("fill",x*160+163,y*160-117,154,154,15)
if N>=0 and not blind or i==prevPos then if N>=0 and not blind or i==prevPos then
gc.setColor(N<3 and COLOR.black or COLOR.W) setColor(N<3 and COLOR.black or COLOR.W)
local fontSize=tileFont[N] local fontSize=tileFont[N]
setFont(fontSize) setFont(fontSize)
mStr(tileName[N],320+(x-.5)*160,40+(y-.5)*160-7*(fontSize/5+1)/2) mStr(tileName[N],320+(x-.5)*160,40+(y-.5)*160-7*(fontSize/5+1)/2)
end end
else else
local c=tileColor[N] local c=tileColor[N]
gc.setColor(c[1],c[2],c[3],prevSpawnTime) setColor(c[1],c[2],c[3],prevSpawnTime)
rectangle("fill",x*160+163,y*160-117,154,154,15) rectangle("fill",x*160+163,y*160-117,154,154,15)
c=N<3 and 0 or 1 c=N<3 and 0 or 1
gc.setColor(c,c,c,prevSpawnTime) setColor(c,c,c,prevSpawnTime)
local fontSize=tileFont[N] local fontSize=tileFont[N]
setFont(fontSize) setFont(fontSize)
mStr(tileName[N],320+(x-.5)*160,40+(y-.5)*160-7*(fontSize/5+1)/2) mStr(tileName[N],320+(x-.5)*160,40+(y-.5)*160-7*(fontSize/5+1)/2)
@@ -337,7 +339,7 @@ function scene.draw()
end end
--Next indicator --Next indicator
gc.setColor(1,1,1) setColor(1,1,1)
if nextCD<=12 then if nextCD<=12 then
for i=1,nextCD do for i=1,nextCD do
rectangle("fill",140+i*16-nextCD*8,170,12,12) rectangle("fill",140+i*16-nextCD*8,170,12,12)
@@ -346,38 +348,55 @@ function scene.draw()
--Next --Next
setFont(40) setFont(40)
mStr("Next",153,185) mStr("Next",155,185)
if nextTile>1 then if nextTile>1 then
gc.setColor(1,.5,.4) setColor(1,.5,.4)
end end
setFont(70) setFont(70)
mStr(tileName[nextTile],153,220) mStr(tileName[nextTile],155,220)
--Skip CoolDown --Skip CoolDown
if skipCD and skipCD>0 then if skipCD and skipCD>0 then
setFont(50) setFont(50)
gc.setColor(1,1,.5) setColor(1,1,.5)
mStr(skipCD,160,600) mStr(skipCD,155,600)
end end
--Skip mark --Skip mark
if skipUsed then if skipUsed then
gc.setColor(1,1,.5) setColor(1,1,.5)
gc.circle("fill",280,675,10) gc.circle("fill",280,675,10)
end end
--New tile position --New tile position
local x,y=1+(prevPos-1)%4,int((prevPos+3)/4) local x,y=1+(prevPos-1)%4,int((prevPos+3)/4)
gc.setLineWidth(8) gc.setLineWidth(8)
gc.setColor(.2,.8,0,prevSpawnTime) setColor(.2,.8,0,prevSpawnTime)
local d=25-prevSpawnTime*25 local d=25-prevSpawnTime*25
rectangle("line",x*160+163-d,y*160-117-d,154+2*d,154+2*d,15) rectangle("line",x*160+163-d,y*160-117-d,154+2*d,154+2*d,15)
--Touch control boarder line
if tapControl then
gc.setLineWidth(6)
setColor(1,1,1,.2)
gc.line(310,30,580,300)
gc.line(970,30,700,300)
gc.line(310,690,580,420)
gc.line(970,690,700,420)
rectangle("line",580,300,120,120,10)
end
end end
scene.widgetList={ scene.widgetList={
WIDGET.newButton{name="reset", x=160,y=100,w=180,h=100,color="lGreen",font=40,code=pressKey"r"}, WIDGET.newButton{name="reset", x=155,y=100,w=180,h=100,color="lGreen",font=40,code=pressKey"r"},
WIDGET.newKey{name="skip", x=160,y=640,w=180,h=100,color="lYellow",font=40,code=pressKey"space",hide=function()return state~=1 or not skipCD or skipCD>0 end},
WIDGET.newSwitch{name="blind", x=240,y=370,w=60, font=40,disp=function()return blind end, code=pressKey"q",hide=function()return state==1 end}, WIDGET.newSwitch{name="blind", x=240,y=370,w=60, font=40,disp=function()return blind end, code=pressKey"q",hide=function()return state==1 end},
WIDGET.newSwitch{name="tapControl", x=240,y=440,w=60, font=40,disp=function()return tapControl end, code=pressKey"w",hide=function()return state==1 end},
WIDGET.newKey{name="up", x=155,y=600-50,w=100,h=100,font=50,color="yellow",code=pressKey"up",hide=function()return tapControl end},
WIDGET.newKey{name="down", x=155,y=600+50,w=100,h=100,font=50,color="yellow",code=pressKey"down",hide=function()return tapControl end},
WIDGET.newKey{name="left", x=155-100,y=600,w=100,h=100,font=50,color="yellow",code=pressKey"left",hide=function()return tapControl end},
WIDGET.newKey{name="right", x=155+100,y=600,w=100,h=100,font=50,color="yellow",code=pressKey"right",hide=function()return tapControl end},
WIDGET.newKey{name="skip", x=155,y=400,w=100,h=100,font=20,color="yellow",code=pressKey"space",hide=function()return state~=1 or not skipCD or skipCD>0 end},
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene}, WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene},
} }