gpt4 book ai didi

java - 如何在俄罗斯方 block 游戏中保留底部的矩形?

转载 作者:行者123 更新时间:2023-11-29 05:21:34 26 4
gpt4 key购买 nike

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

这是 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() 方法,新的随机形状从顶部落下,问题现在是如何保留底部的特定形状,以便进行下一步操作。

最佳答案

我会创建一个 List 的“形状”,这些形状已经落到俄罗斯方 block 板的底部。此 List 将保存在您的 Tetris 类中,当当前下落的项目碰到板的底部或已经下落的形状之一时,它应该停止并添加到堕落的名单。

其他一般提示:

根据个人经验,除非必要,否则请尽量远离大小 > 2 的数组;它们臃肿、困惑且难以维护。在您的情况下,有一个名为 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:正如 Andrew 在评论中建议的那样,“另请查看基于 Shapecollision detection 。它使用 Java 2D Area 对象来测试交叉点。”

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com