zoukankan      html  css  js  c++  java
  • 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

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


    作者:半山
    出处:http://www.cnblogs.com/xdao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Xamarin.Forms Layout Challenges – Social Network App(转载)
    Erlang gen_server:start_link/3 和gen_server:start_link/4
    Erlang 从URL中截取尾部文件名
    Erlang 聊天室程序(三) 数据交换格式json的decode
    SOCKS5协议
    Erlang 聊天室程序( 一)
    Erlang 聊天室程序(八) 主题房间supervisor 的使用
    Erlang 聊天室程序(四) 数据交换格式json的encode
    Erlide 的安装使用
    日志系统引起的争论
  • 原文地址:https://www.cnblogs.com/xdao/p/love2d_Tetris_2.html
Copyright © 2011-2022 走看看