用Java完成Bejeweld游戏(类项目)

用Java完成Bejeweld游戏(类项目),java,Java,我是计算机科学专业的大二学生,正在上Java的第二堂课。对于我们的第五个项目,我必须用Java设计一个像Bejeweled这样的游戏。这个项目没有什么太难的,但我的脑子里肯定在转动齿轮,使这个程序尽可能简单高效 现在我有点被困在实际的选择过程中,阻碍了我进入积分系统和实际的游戏。在我的事件监听器中,它实现了MouseListener,我将其设置为将单击的点转换为gem的行和列。从这里,我有一个ArrayList设置来保存Dimension变量、gem1和gem2。我还有一个叫做selection

我是计算机科学专业的大二学生,正在上Java的第二堂课。对于我们的第五个项目,我必须用Java设计一个像Bejeweled这样的游戏。这个项目没有什么太难的,但我的脑子里肯定在转动齿轮,使这个程序尽可能简单高效

现在我有点被困在实际的选择过程中,阻碍了我进入积分系统和实际的游戏。在我的事件监听器中,它实现了
MouseListener
,我将其设置为将单击的点转换为gem的行和列。从这里,我有一个
ArrayList
设置来保存
Dimension
变量、
gem1
gem2
。我还有一个叫做
selections
的双布尔数组。根据
ArrayList
是否包含指定的gem,侦听器应在
selections
双数组中选择适当的元素,即选择或取消选择。我为这个问题辛劳了太长时间,而且我也感冒了,这让我的生活一团糟,我的精神有点障碍

如果您看到我的代码中有任何怪癖或选择问题的可能解决方案,我们将不胜感激!我仍在学习和寻找新的、更好的方法将我的想法转化为代码,最好的方法是批评,所以我想一定要努力!非常感谢您抽出时间。:)

编辑:我知道代码中还有很多未完成的部分,但这是一项正在进行的工作。如果你看到一些显然还没有使用的东西,不要担心

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Random;
import java.util.Timer;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;

@SuppressWarnings("serial")
public class Bejeweled extends JPanel{
// Utilities
static Random ran = new Random();
private Timer t;

// Board and Dimensions
public static int BOARD_SIZE = 10, DEFAULT_SIZE = 400,
        size = DEFAULT_SIZE/BOARD_SIZE;
static int[][] board;

// Gem Selection
final int CIRCLE = 0, SQUARE = 1, TRIANGLE = 2, HEXAGON = 3, OCTOGON = 4,
        DIAMOND = 5, RHOMBUS = 6;
public static boolean[][] selections;
public static ArrayList<Dimension> gems;
Dimension gem1, gem2;

public static void main(String[] args){
    JFrame f = new JFrame("Bejeweled");
    f.setLayout(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel boardPane = new JPanel();
    boardPane.add(new Bejeweled());
    JPanel UI = new JPanel();
    JButton btn = new JButton("New Game");
    btn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            Object newgame = JOptionPane.showOptionDialog(f,
                    "Are you sure you want to start a new game?", "New Game?",
                    JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE,
                    null, null, null);
            if(newgame.equals(JOptionPane.YES_OPTION)){
                for(int r = 0; r < BOARD_SIZE; r++)
                    for(int c = 0; c < BOARD_SIZE; c++){
                        board[r][c] = ran.nextInt(7);
                        selections[r][c] = false;
                    }
                gems.clear();
                boardPane.repaint();
            }
        }
    });
    JTextPane coor1 = new JTextPane(), coor2 = new JTextPane();
    coor1.setText("Gem 1 Coords");
    coor2.setText("Gem 2 Coords");
    UI.add(coor1);
    UI.add(coor2);
    UI.add(btn);
    UI.setBackground(Color.black);
    JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
            boardPane, UI);
    f.setContentPane(pane);
    f.pack();
    f.setVisible(true);
}
public Bejeweled(){
    // Initialize variables
    t = new Timer();
    board = new int[BOARD_SIZE][BOARD_SIZE];
    selections = new boolean[BOARD_SIZE][BOARD_SIZE];
    gems = new ArrayList<Dimension>();
    gems.clear();

    // Set-up board and selections
    for(int r = 0; r < BOARD_SIZE; r++)
        for(int c = 0; c < BOARD_SIZE; c++){
            board[r][c] = ran.nextInt(7);
            selections[r][c] = false;
        }

    addMouseListener(new EventListener());
    setBackground(Color.black);
    setPreferredSize(new Dimension(DEFAULT_SIZE, DEFAULT_SIZE));
}
public void paintComponent(Graphics p){
    super.paintComponent(p);
    size = getWidth()/BOARD_SIZE;

    for(int r = 0; r < BOARD_SIZE; r++)
        for(int c = 0; c < BOARD_SIZE; c++){
            if(board[r][c] == CIRCLE){
                p.setColor(Color.white);
                p.fillOval((size*c)+2, (size*r)+2, size-4, size-4);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
            else if(board[r][c] == SQUARE){
                p.setColor(Color.red);
                p.fillRoundRect((size*c)+2, (size*r)+2, size-4, size-4,
                        size/4, size/4);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
            else if(board[r][c] == TRIANGLE){
                int[] xTriangle = {(size*c)+2, (size*(c+1))-size/2,
                        (size*(c+1))-2};
                int[] yTriangle = {(size*(r+1))-2, (size*r)+2, (size*(r+1))-2};
                p.setColor(Color.green);
                p.fillPolygon(xTriangle, yTriangle, xTriangle.length);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
            else if(board[r][c] == HEXAGON){
                int[] xHexagon = {(size*c)+2, (size*(c+1))-((size*3)/4),
                        (size*(c+1))-size/4, (size*(c+1))-2,
                        (size*(c+1))-size/4, (size*(c+1))-((size*3)/4)};
                int[] yHexagon = {(size*(r+1))-size/2, (size*r)+2,
                        (size*r)+2, (size*(r+1))-size/2, (size*(r+1))-2,
                        (size*(r+1))-2};
                p.setColor(Color.yellow);
                p.fillPolygon(xHexagon, yHexagon, xHexagon.length);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
            else if(board[r][c] == OCTOGON){
                int[] xOctogon = {(size*c)+2, (size*c)+2,
                        (size*(c+1))-((size*3)/4), (size*(c+1))-size/4,
                        (size*(c+1))-2, (size*(c+1))-2, (size*(c+1))-size/4,
                        (size*(c+1))-((size*3)/4)};
                int[] yOctogon = {(size*(r+1))-size/4,
                        (size*(r+1))-((size*3)/4), (size*r)+2, (size*r)+2,
                        (size*(r+1))-((size*3)/4), (size*(r+1))-size/4,
                        (size*(r+1))-2, (size*(r+1))-2};
                p.setColor(Color.blue);
                p.fillPolygon(xOctogon, yOctogon, xOctogon.length);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
            else if(board[r][c] == DIAMOND){
                int[] xDiamond = {(size*c)+2, (size*(c+1))-((size*3)/4),
                        (size*(c+1))-size/4, (size*(c+1))-2,
                        (size*(c+1))-size/2};
                int[] yDiamond = {(size*(r+1))-((size*3)/4), (size*r)+2,
                        (size*r)+2, (size*(r+1))-((size*3)/4), (size*(r+1))-2};
                p.setColor(Color.cyan);
                p.fillPolygon(xDiamond, yDiamond, xDiamond.length);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
            else if(board[r][c] == RHOMBUS){
                int[] xRhombus = {(size*c)+2, (size*(c+1))-size/2,
                        (size*(c+1))-2, (size*(c+1))-size/2};
                int[] yRhombus = {(size*(r+1))-size/2, (size*r)+2,
                        (size*(r+1))-size/2, (size*(r+1))-2};
                p.setColor(Color.magenta);
                p.fillPolygon(xRhombus, yRhombus, xRhombus.length);
                if(selections[r][c] == true){
                    Graphics2D p2 = (Graphics2D) p;
                    p2.setStroke(new BasicStroke(2));
                    p2.setColor(new Color(210,210,50));
                    p2.drawRect(size*c, size*r, size, size);
                }
            }
        }
}
private class EventListener implements MouseListener, ActionListener{
    public void mouseClicked(MouseEvent e){
        int col = e.getX()/size, row = e.getY()/size;
        if(!gems.contains(gem1)){
            if(selections[row][col] != true){
                selections[row][col] = true;
                gem1 = new Dimension(row, col);
                gems.add(gem1);
            }
        }
        else if(gems.contains(gem1)){
            if(selections[row][col] = true){
                selections[row][col] = false;
                gems.remove(gem1);
            }
            else if(selections[row][col] = false){
                gem2 = new Dimension(row,col);
                gems.add(gem2);
                if(gem1 == new Dimension(gem2.width+1,gem2.height)){

                }
                else if(gem1 == new Dimension(gem2.width-1,gem2.height)){

                }
                else if(gem1 == new Dimension(gem2.width,gem2.height+1)){

                }
                else if(gem1 == new Dimension(gem2.width,gem2.height-1)){

                }
                else{
                    selections[gem1.width][gem1.height] = false;
                    gems.clear();
                    gem1 = new Dimension(row, col);
                    gems.add(gem1);
                }
            }
        }
        repaint();
    }
    public void actionPerformed(ActionEvent e){

    }

    // Unused implemented methods
    public void mousePressed(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
}
}
import java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.ArrayList;
导入java.util.Random;
导入java.util.Timer;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JButton;
导入javax.swing.JSplitPane;
导入javax.swing.JTextPane;
@抑制警告(“串行”)
公共类Bejeweld扩展JPanel{
//公用事业
静态随机运行=新随机();
私人定时器t;
//电路板和尺寸
公共静态int板大小=10,默认大小=400,
尺寸=默认尺寸/电路板尺寸;
静态int[][]板;
//宝石选择
最终整数圆=0,正方形=1,三角形=2,六边形=3,八角形=4,
菱形=5,菱形=6;
公共静态布尔[][]选择;
公共静态ArrayList gems;
尺寸gem1,gem2;
公共静态void main(字符串[]args){
JFrame f=新JFrame(“宝石”);
f、 setLayout(空);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel boardPane=新的JPanel();
boardPane.add(新的Bejeweled());
JPanel UI=新的JPanel();
JButton btn=新JButton(“新游戏”);
btn.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
Object newgame=JOptionPane.showOptionDialog(f,
“您确定要开始新游戏吗?”,“新游戏?”,
JOptionPane.YES\u NO\u选项,JOptionPane.WARNING\u消息,
空,空,空);
if(newgame.equals(JOptionPane.YES\u选项)){
用于(int r=0;r