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