接上篇,这篇里我将介绍俄罗斯方块的运动和下一个方块的显示。
这里我们主要使用随机数,由于lua采用的是C的随机数方法,所以生成的是一串
伪随机数序列,可以这样理解这串随机数是用一个公式生成的,所以只要有足够
的数,我们是可以推导出这个产生随机数的公式的。为了解决这个问题,C引入
了随机数种子,即我们产生一个随机数种子,然后把这个种子带入公式,再产生
随机数。只要种子每次都不同,那么就可以生成真正的随机数了。
但是我们如何产生一个不同的种子呢,利用系统时间播种就可以了。代码如下:
math.randomseed (os.time()) --利用时间产生一个种子 n=math.random(start,end) --生成一个从start到end之间的随机数返回给n
好了,下面我们确定一下方块的运动空间,这里我们把它设为1个30×40个格子
的方框。接着绘制游戏右边的下一个方块的提示框,这里我把它设为6×6的格子。
所有的代码如下:(坐标有点问题,由于没实现保存落地的方块,所以方块落地后会消失)
--方块的大小 size=10 --颜色 c1={255,0,0} c2={0,255,0} c3={0,0,255} c4={0,255,255} c5={255,0,255} c6={255,255,0} c7={210,180,140} --方块坐标 颜色、方块下一个形状在els表里的序号 --两个数字为一个坐标 --第一个为x最小点、第二个为y最大点、第三个随便、第四个为y最大点 Els_a1={0,0,0,1,1,0,1,1,c1,1} Els_b1={0,0,1,0,2,0,3,0,c2,3} Els_b2={0,0,0,3,0,1,0,2,c2,2} Els_c1={0,0,1,1,1,0,2,1,c4,7} Els_c2={0,1,0,2,1,0,1,1,c4,6} Els_d1={0,1,1,0,1,1,2,0,c3,5} Els_d2={0,0,1,2,0,1,1,1,c3,4} Els_e1={0,0,1,1,1,0,2,0,c5,9} Els_e2={0,1,1,2,1,1,1,0,c5,10} Els_e3={0,1,1,1,1,0,2,1,c5,11} Els_e4={0,1,0,2,0,0,1,1,c5,8} Els_f1={0,0,0,1,1,0,2,0,c7,17} Els_f2={0,0,1,2,1,0,1,1,c7,18} Els_f3={0,1,2,1,1,1,2,0,c7,19} Els_f4={0,0,0,2,0,1,1,2,c7,16} Els_g1={0,0,2,1,1,0,2,0,c6,13} Els_g2={0,2,1,2,1,0,1,1,c6,14} Els_g3={0,1,1,1,0,0,2,1,c6,15} Els_g4={0,0,0,2,0,1,1,0,c6,10} --所有的俄罗斯方块表 els={Els_a1,Els_b1,Els_b2, Els_c1,Els_c2,Els_d1,Els_d2, Els_e1,Els_e2,Els_e3,Els_e4, Els_f1,Els_f2,Els_f3,Els_f4, Els_g1,Els_g2,Els_g3,Els_g4} --方块是否落底 isBottom=false --画一个方块t方块表,x、y在屏幕上的位置 function drawRect(t,x,y) --保存以前的颜色 local r,g,b,a=love.graphics.getColor() love.graphics.setColor(unpack(t[9])) for i=1,8,2 do love.graphics.rectangle( "line", x+t[i]*size, y+t[i+1]*size, size, size ) end --恢复以前的颜色 love.graphics.setColor(r,g,b,a) end --画游戏空间、画下一个方块、画得分面板 面板扩大两个点像素 function drawCenterLeft( ) --中间的方框 love.graphics.rectangle("line",19,19,302,402) --左边的方框 love.graphics.rectangle("line",340,100,60,60) --画随机显示下一个方块 drawRect(els[next],340+10,100+10,els[next][9]) end function love.load() --产生一个随机的方块,初始化 current=math.random(1,19) --产生小窗口的随机方块 next=math.random(1,19) x=math.random(1,27)*size+18 y=18 end function love.draw() drawCenterLeft() drawRect(els[current],x,y) end count=0 function love.update(dt) count=count+dt if count>0.2 then y=y+10 count=0 if y+(els[current][4]+1)*size>400+20 then y=y-10 isBottom=true end end if isBottom then current=next math.randomseed (os.time()) next=math.random(1,19) y=18 x=math.random(1,27)*size+18 isBottom=false end end function love.keypressed( key, unicode ) Move(key,els[current]) end --移动 参数方向、方块 function Move(dir,fk) if isBottom==false then if dir=="right" then x=x+10 if x+(fk[7]+1)*size>300+20 then x=x-10 end elseif dir=="left" then x=x-10 if x<20 then x=x+10 end end else end end
未完待续(现在还是有点慢啊!)