我已经开始开发俄罗斯方块游戏。一切正常,但是如何在底部保留矩形?

这是Comp1类,其中检索随机形状并使用计时器向下移动

package buildblock;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import buildblock.tetris;
public class Comp1 extends JPanel implements ActionListener {

int curx=10;
int cury=30;
int nx=0;
int ny=0;
int p=1;
 Timer t;
boolean EndofLine=false;
JLabel l1=new JLabel("");
int value=0;
int coords[][][]=new int[3][3][2];
int shape[][][][]={
        {{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{0,0},{100,40},{0,0}},{{80,60},{100,60},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{80,40},{100,40},{120,40}},{{0,0},{0,0},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{0,0},{100,40},{0,0}},{{0,0},{100,60},{0,0}}},
        {{{80,20},{100,20},{0,0}},{{0,0},{100,40},{0,0}},{{0,0},{100,60},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{80,40},{100,40},{0,0}},{{80,60},{0,0},{0,0}}},
        {{{80,20},{0,0},{0,0}},{{80,40},{100,40},{0,0}},{{0,0},{100,60},{0,0}}},
         {{{80,20},{100,20},{0,0}},{{80,40},{100,40},{0,0}},{{0,0},{0,0},{0,0}}},
        };

Comp1(tetris Parent)
{
   setVisible(true);
   setSize(400,900);
   curx=(400-curx)/2;
   setLayout(new BorderLayout());
   timer();
}

public void getShape(int a)
{
     for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            for(int k=0;k<2;k++)
            {
            coords[i][j][k]=shape[a][i][j][k];
             repaint();
            }
        }
    }
}

public void paint(Graphics g)
{
    super.paint(g);

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            for(int k=0;k<2;k++)
            {
                if(coords[i][j][k]!=0)
                {
                    if(k==0)
                    {
                        curx=coords[i][j][k]+nx;
                    }
                    else
                    {
                        cury=coords[i][j][k]+ny;
                        drawRec(g,curx,cury,20,20);

                    }
                }
            }
        }
    }
}

 public void drawRec(Graphics g,int newx,int newy,int w,int h)
 {
             g.drawRect(newx, newy, 20, 20);
             g.drawLine(curx+1,cury+20-1,curx+20-1,cury+20-1);
 }

public void timer()
{
t=new Timer(150,this);
  t.start();
}

public int Random()
{
    Random r=new Random();
    int n=Math.abs(r.nextInt()%7+1);
    return n;
}

public void lineDown()
{
    ny=ny+10;
    repaint();
}

public void actionPerformed(ActionEvent e)
{
    if(value!=250&&!EndofLine)
    {
        value=value+5;
        if(p==0)
        {
            p=Random();
        }
        getShape(p);
        lineDown();
    }
    else
    {
        p=Random();
        ny=0;
        EndofLine=false;
        value=0;
    }
}
}


形状是一个4维数组,从中检索特定矩形的宽度和高度,共同形成所需的形状。通过随机函数,我们使用getShape()方法选择特定形状,并使用drawRect函数绘制矩形。

现在lineDown函数以10为增量向下移动特定形状,并在到达最后一行后调用repaint()方法,并且新的Random形状从顶部下降,问题在于如何保留特定形状在底部,以便可以执行下一个操作。

最佳答案

我将创建一个已经跌落到“俄罗斯方块”板底部的“形状” List。该List将保留在您的Tetris类中,并且当当前下降的项目击中板的底部或已经下降的形状之一时,应将其停止并添加到下降的列表中。

其他一般提示:

根据个人经验,除非必要,请尝试远离大小大于2的数组。它们are肿,混乱且难以维护。在您的情况下,有一个完美的界面可以使用,称为Shape。查看此代码

// java.awt.geom.Path2D implements java.awt.Shape
java.awt.geom.Path2D path = new Path2D.Double();
path.moveTo(0, 0);
path.lineTo(2, 0);
path.lineTo(2, 2);
path.lineTo(2, 0);
path.closePath();
path.transform(AffineTransform.getScaleInstance(20, 20));


这将创建一个Shape,这是您的基本方块!然后,您将可以访问自己无需实现的强大功能。

PS:正如安德鲁在评论中建议的那样,“还请查看基于Shapecollision detection。它使用Java 2D Area对象测试交集。”

关于java - 如何在俄罗斯方块游戏的底部保留矩形?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24484772/

10-11 22:46
查看更多