love2d制作俄罗斯方块2

上篇,这篇里我将介绍俄罗斯方块的运动和下一个方块的显示。

这里我们主要使用随机数,由于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

未完待续(现在还是有点慢啊!)

 

 

posted @ 2013-06-04 21:32  半山无极  阅读(750)  评论(0编辑  收藏