скользящий код головоломки

Наш групповой проект заключается в создании игры-головоломки с раздвижными элементами с использованием Java Eclipse. У нас есть код для создания сетки 3x3 с одним и тем же изображением (предполагается, что это одно изображение, но оно разделено на 9 частей, но вы узнаете об этом позже). Моя часть состоит в том, чтобы создать прослушиватель мыши, который щелкает выбранную «плитку», а затем отображает сообщение, проверяющее, правильно ли была нажата выбранная плитка. (Пример: если пользователь щелкает плитку 1, отображается сообщение «Плитка 1 нажата»). Я думаю, мне придется создавать отдельные прослушиватели мыши для каждой плитки. Какие-либо предложения?

Вот код:

   import javax.swing.*;
   import javax.swing.event.*;
   import java.awt.*;
   import java.awt.event.*;

   public class Puzzle 
   {
// Initialize the Frame for the Puzzle
private JFrame frame = new JFrame("Puzzle");
private JPanel puzzlePanel = new JPanel( null );
private JLabel status;


// Itemize Menu
private JMenuBar menu = new JMenuBar();
private JMenu menuFile = new JMenu("File");
private JMenuItem menuFileNew = new JMenuItem("New Game");
private JMenuItem menuFileQuit = new JMenuItem("Quit");
private JMenu menuHelp = new JMenu("Help");
private JMenuItem menuHelpAbout = new JMenuItem("About");

// Variables
// Easy(3) Medium(4) Hard(5)
private int dimm = 3;
private int spacing = 5;
private int tileDimm = 96;

// Constructor
public Puzzle() 
{
    status = new JLabel("Default");
    frame.add(status,BorderLayout.SOUTH);


    // Build Menu
    frame.setJMenuBar(menu);
    menuFile.add(menuFileNew);
    menuFile.add(menuFileQuit);
    menuHelp.add(menuHelpAbout);
    menu.add(menuFile);
    menu.add(menuHelp);

    // Panel
    puzzlePanel.setPreferredSize(new Dimension((dimm*tileDimm)+(spacing*(dimm+1)),(dimm*tileDimm)+(spacing*(dimm+1))) );
    frame.add(puzzlePanel);

    // Puzzle Logic
    PuzzleLogic puzzleLogic = new PuzzleLogic(dimm);



    Tile[][] tiles = puzzleLogic.createTileArray();
    puzzleLogic.shuffleTiles(tiles);
    for(int i = 0; i < dimm; i++) 
    {
        for(int ii = 0; ii < dimm; ii++) 
        {
            puzzlePanel.add(tiles[i][ii].getLabel());
            int x = i*tileDimm+(spacing*(i+1));
            int y = ii*tileDimm+(spacing*(ii+1));
            tiles[i][ii].getLabel().setBounds(x,y,tileDimm,tileDimm);

            System.out.print(tiles[i][ii].getContent() + " ");
        }
    }

    HandlerClass handler = new HandlerClass();
    puzzlePanel.addMouseListener(handler);
}

// create listener - inner class
class HandlerClass implements MouseListener
{

    public void mouseClicked(MouseEvent e)
    {

        status.setText(String.format("Tile 1 is clicked"));
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
        status.setText(String.format(" "));

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub  
    }

}

public void launch() 
{
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack(); //Adjusts panel to components for display
    frame.setVisible(true);
    frame.setResizable(false);
}

// Calls Everything to Action
public static void main(String[] args) 
{
    Puzzle puzzle = new Puzzle();
    puzzle.launch();
}

}


person TomL    schedule 14.03.2013    source источник
comment
Прочтите мою статью 2048 Game in Java Swing, чтобы увидеть один из способов создания скользящая игра.   -  person Gilbert Le Blanc    schedule 07.12.2014


Ответы (2)


Код, который у вас уже есть, создает одного слушателя для всей головоломки. Таким образом, в обработчике mouseClicked вы можете вычислить положение мыши относительно положения в головоломке, вычислить, находится ли она в верхней/нижней/средней трети и левой/правой/средней трети, и оттуда вы можете вычислить, на какую часть щелкнул игрок?

Вы можете получить координаты положения мыши, используя e.getX() и e.getY().

person Patashu    schedule 14.03.2013
comment
Я запутался в том, как рассчитать, находится ли он в верхней нижней части посередине, лол - person TomL; 15.03.2013
comment
все, что я хочу сделать, это после того, как я запустил его и сказал, что я щелкнул верхнюю левую плитку, она отобразит плитку 1. если я щелкну среднее поле в верхней строке, она отобразит плитку 2. если щелкнуть верхнюю правую плитку, отобразится плитка 3 и так что лол - person TomL; 15.03.2013

Вы можете получить координаты X и Y щелчка мыши, а затем разделить на ширину и высоту, соответственно, вы можете получить номер блока ... но он вернет X: 0,1,2 Y: 0,1,2 [для блока 3x3] .. Поэтому не забудьте добавить один (+1) в конце. Ваш код будет выглядеть примерно так:

Xblock = event.getX()/blockwidth + 1; и аналогично для Y

Возможно, вам придется взять ширину границы и остальные вещи, чтобы получить правильное положение щелчка, чтобы сделать верхний левый угол вашей головоломки равным 0,0;

person RE60K    schedule 14.03.2013
comment
чему бы я тогда установил ширину блока равной? - person TomL; 15.03.2013
comment
Предположим, у вас есть головоломка размером 90x90 пикселей, тогда каждый блок будет размером 30x30. Итак, blockwidth /*(will be)*/ = 30 pixels. - person RE60K; 15.03.2013
comment
хорошо, я получаю значение, но оно меняется, когда я нажимаю в разных местах плитки. это связано с шириной границы? - person TomL; 18.03.2013
comment
Вы должны вычесть значения X и Y, полученные при нажатии на левую верхнюю левую вершину 1 плитки, из event.get(X и Y), это удалит ширину границы и т. Д. - person RE60K; 20.03.2013
comment
Могу ли я получить PuzzleLogic и Tile Class... Может быть, на Pastebin? - person RE60K; 20.03.2013