像Java语言中的BeJeweled游戏

时间:2014-01-02 22:52:20

标签: java swing user-interface

我正在尝试使用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];
           }

在此设计中,在单击鼠标的方法中,仅检查矩形的左下方左侧是否显示相同的颜色。如何检查具有相同颜色的所有近矩形?

请帮助谢谢

2 个答案:

答案 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。由于索引为ij+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().
    }
});

MouseAdapterabstract class,它实现MouseListener并且在接收任何事件时不执行任何操作。您只需覆盖处理您感兴趣的事件的方法;)