0

私たちのグループプロジェクトは、JavaEclipseを使用してスライディングパズルゲームを作成することです。同じ画像で3x3グリッドを作成するコードがあります(1つの画像であるはずですが、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();
}

}

4

2 に答える 2

1

既に作成したコードは、パズル全体に対して 1 つのリスナーを作成します。したがって、mouseClickedハンドラーでは、パズル内の位置に対するマウスの位置を計算し、上/下/中 3 分の 1 と左/右/中 3 分の 1 にあるかどうかを計算し、そこからプレイヤーがクリックしたピースを計算できますか?

e.getX()と を使用して、マウス位置の座標を取得できますe.getY()

于 2013-03-14T04:29:07.443 に答える
0

マウス クリックの X 座標と Y 座標を取得し、それぞれ幅と高さで除算してブロック番号を取得できます。ただし、X: 0,1,2 Y:0,1,2 [3x3 ブロックの場合] が返されます。 .. したがって、最後に必ず 1 (+1) を追加してください。コードは次のようになります。

Xblock = event.getX()/blockwidth + 1;Yについても同様

パズルの左上隅を 0,0 にする正しいクリック位置を取得するには、境界線の幅と残りの部分を取得する必要がある場合があります。

于 2013-03-14T04:43:53.543 に答える