我正在尝试使用java语言设计像BeJeweled这样的游戏 这是我到目前为止所处的位置:
public class Game {
public static void main(String[] args) throws InterruptedException {
final JFrame window = new JFrame();
window.setSize(508,669);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Grid g=new Grid();
Game.obj(g);
window.add(g);
window.setVisible(true);
window.setResizable(false);
window.repaint(2);
window.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
int x=e.getX();
int y=e.getY();
for(int i=0;i<10;i++) {
for(int j=0;j<16;j++){
if(x>i*50+5 && x<i*50+54 && y>j*40+26 && y<j*40+26+39){
g.b[i][j]=g.a[i][j];
int q = x;
int w=y;
int r =x;
int t =y;
q-=50;
w-=40;
if( i>0&&g.a[i-1][j]==g.b[i][j]){
g.a[i][j]=0;
g.a[i-1][j]=0;
}
if( j>0&&g.a[i][j-1]==g.b[i][j]){
g.a[i][j]=0;
g.a[i][j-1]=0;
}
r+=50;
t+=40;
if(i<9&&g.a[i+1][j]==g.b[i][j]){
g.a[i][j]=0;
g.a[i+1][j]=0;
}
if(j<15&&g.a[i][j+1]==g.b[i][j]){
g.a[i][j]=0;
g.a[i][j+1]=0;
}
}
}
}
SwingUtilities.updateComponentTreeUI(window);
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
public static void obj(Grid g){
Random r =new Random();
for(int k=0;k<10;k++)
for(int l=0;l<16;l++)
g.a[k][l]=1+r.nextInt(4);
}
}
class Grid extends JPanel {
private Graphics Graphics;
@Override
public void paint(Graphics g) {
final Graphics g1 = g ;
this.setGraphics(g);
for(int i=0;i<600;i+=50)
for(int j=0;j<400;j+=40)
g.drawRect(i, j, i+50, j+40);
for(int i=0;i<10;i++)
for(int j=0;j<16;j++){
if(a[i][j]== 0) g.setColor(Color.WHITE);
if(a[i][j] == 1) g.setColor(Color.ORANGE);
if(a[i][j] == 2) g.setColor(Color.red);
if(a[i][j] == 3) g.setColor(Color.GREEN);
if(a[i][j] == 4) g.setColor(Color.cyan);
g.fillRect(i*50+1, j*40+1, 49, 39);
}
// Mouselis mouseptr = new Mouselis(g);
// this.addMouseListener(mouseptr);
// this.addMouseMotionListener(mouseptr);
}
public void setGraphics(Graphics Graphics) {
this.Graphics = Graphics;
}
int [][] a= new int[10][16];
int [][] b= new int[10][16];
}
在此设计中,在单击鼠标的方法中,仅检查矩形的左下方左侧是否显示相同的颜色。如何检查具有相同颜色的所有近矩形?
请帮助谢谢
答案 0 :(得分:1)
您有四个if语句,用于检查相邻矩形的颜色与单击的矩形相同。这是最后一个:
if(j<15&&g.a[i][j+1]==g.b[i][j]){
g.a[i][j]=0;
g.a[i][j+1]=0;
}
将垂直网格坐标 j
与15进行比较,以确保j + 1在边界内。此外,检查2d数组a
中的矩形,看它是否等于点击的2d数组b
中的矩形。如果是,则为Color.WHITE
将其设置为0。由于索引为i
和j+1
,因此会直接检查所点击的矩形。
要检查对角相邻的矩形,请将两个索引更改为1。
右下方的矩形是g.a[i+1][j+1]
。要在没有错误的情况下访问此矩形,您需要确保i + 1和j + 1都在数组的范围内以避免错误。
所以,if语句是
if(j<15 && i < 9 && g.a[i+1][j+1]==g.b[i][j]){ ...
你可以弄清楚其余部分。
答案 1 :(得分:0)
Java是一种强大的面向对象的编程语言 - 特别是在Java8之前:我认为你应该真正使用更多可以保持自己职责和行为的对象。
一旦你有一个代表Jewel
的类,只需实现一些递归方法来知道它是否是某些“宝石条纹”的一部分。例如:
public class Jewel {
private final JewelType type; // Could be an Enum for example
// Many other stuff to add (like a constructor at least!)
public Collection<Jewel> getStreak() {
final Set<Jewel> res = new HashSet<>();
this._getStreak(res);
return res;
}
private void _getStreak(final Set<Jewel> streak) {
// Just leave the method if we've already visited this Jewel
if(!streak.add(this)) {
return;
}
// Assuming that this method returns a Collection of the Jewels that are stored West, North, South and East from this
for(final Jewel neighbour : Grid.getInstance().getJewelsAround(this)) {
if(neighbour.getJewelType().equals(this.getJewelType())) {
neighbour._getStreak(streak);
}
}
}
}
当试图查看某些Jewel
是否足以被“销毁”的条纹的一部分时,请检查以下内容:
Jewel b = Grid.getInstance().getJewelForCoordinates(x, y);
final Collection<Jewel> streak = b.getStreak();
if(streak.size() >= Game.MINIMUM_STREAK_SIZE) {
Grid.getInstance().destroyJewels(streak);
}
我现在甚至都没有访问任何Java编辑器/编译器所以请原谅,我的代码是否会出现任何错误。即使我建议做很多改变,我希望它可以帮助你:)
顺便说一句,如果您不想覆盖MouseListener
接口描述的所有方法,请使用以下命令:
window.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent event) {
// Code to be executed on mouseClicked().
}
});
MouseAdapter
是abstract class
,它实现MouseListener
并且在接收任何事件时不执行任何操作。您只需覆盖处理您感兴趣的事件的方法;)