不再做了,最后一个版本,虽然还是很多问题,代码也很难看。
1.增加刷新按钮。
2.可选难度。
3.修复一些小bug。
4.增加界面友好性。
直接贴代码,代码中都有注释,而且扫雷都会玩,规则很简单。
Card.java
package version_6; /** * @author Chalmers * 2015年12月26日 上午10:12:46 */ public class Card { //该方块附近雷的数目 public int count; //该方块是否已经被翻开 public boolean flag; }
MainFrame.java
package version_6; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; /** * @author Chalmers * @version 创建时间:2015年12月24日 下午10:25:44 */ /** * 增加刷新按钮 * */ public class MainFrame extends JFrame { JMenuBar menuBar = new JMenuBar(); JMenu level = new JMenu("难度选择"); JMenuItem easy = new JMenuItem("简单"); JMenuItem middle = new JMenuItem("中等"); JMenuItem harder = new JMenuItem("困难"); // 行 private int rowNum = 0; // 列 private int colNum = 0; // 面板宽度 public int width = 0; // 面板高度 public int height = 0; // 剩余的方块数目 private int remainCount = 0; // 雷的数目 private int bomb = 10; // 用来存放方块的信息 private Card[][] card = null; // 因为方块附近最大雷的数目为8,所以设置雷为9 public static final int BOOM = 9; // 附近没有雷 public static final int NONE = 0; // 考虑最极端的情况,某个位置附近有8个雷 private String[] img = new String[] { "0.jpg", "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "boom.jpg", "flag.png" }; private JPanel panel = null; // 方块 private JLabel[][] label = null; // 刷新按钮 private JButton refreshBt = null; // 存放按钮的面板 private JPanel panelUp = null; public MainFrame(int row, int col, int count) { this.rowNum = row; this.colNum = col; this.bomb = count; width = 42 * colNum; height = 50 * rowNum; remainCount = rowNum * colNum; card = new Card[rowNum][colNum]; label = new JLabel[rowNum][colNum]; panel = new JPanel(); panelUp = new JPanel(); panelUp.setSize(340, 20); panelUp.setBorder(BorderFactory.createLineBorder(Color.BLACK)); setJMenuBar(menuBar); menuBar.add(level); // add(level); level.add(easy); level.add(middle); level.add(harder); refreshBt = new JButton("刷新"); ClickListener cl = new ClickListener(); refreshBt.addActionListener(cl); easy.addActionListener(cl); middle.addActionListener(cl); harder.addActionListener(cl); initJLabel(); Toolkit tool = getToolkit(); Dimension dim = tool.getScreenSize(); // 横竖间隔为1,1 panel.setLayout(new GridLayout(rowNum, colNum, 1, 1)); panelUp.setLayout(new FlowLayout()); panelUp.add(refreshBt); setLayout(new BorderLayout()); add(panel, BorderLayout.CENTER); add(panelUp, BorderLayout.NORTH); panel.setVisible(true); setVisible(true); // 设置在屏幕的位置和面板大小 setBounds((int) (dim.getWidth() - width) / 2, (int) (dim.getHeight() - height) / 2, width, height); setIconImage(new ImageIcon("img\\扫雷.jpg").getImage()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置为不可调整大小 setResizable(false); setVisible(true); } private void initJLabel() { initBoom(); for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { label[i][j] = new JLabel(); label[i][j].setBorder(BorderFactory .createLineBorder(Color.BLACK)); // 点击事件 label[i][j].addMouseListener(new JLabelListener(i, j)); panel.add(label[i][j]); } } } // 初始化雷位置 private void initBoom() { // 记录当前已随机生成雷的数目 int count = 0; int row = 0; int col = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { card[i][j] = new Card(); card[i][j].count = 0; card[i][j].flag = false; } } while (count < bomb) { do { // 随机产生雷位置 row = (int) (Math.random() * rowNum); col = (int) (Math.random() * colNum); } while (card[row][col].count == BOOM); // 直到该位置没有雷位置 // 在该位置设置雷 card[row][col].count = BOOM; count++; } // 初始化数值 for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { // 如果该处不是雷,则计算该处周围的雷的数目 if (!(card[i][j].count == BOOM)) { count(i, j); } } } } // 将每个位置的周围的雷的数据计算出来 private void count(int row, int col) { int count = 0; // 左上 if (row - 1 >= 0 && col - 1 >= 0) { if (card[row - 1][col - 1].count == BOOM) { count++; } } // 上方 if (row - 1 >= 0) { if (card[row - 1][col].count == BOOM) { count++; } } // 右上 if (row - 1 >= 0 && col + 1 < colNum) { if (card[row - 1][col + 1].count == BOOM) { count++; } } // 左边 if (col - 1 >= 0) { if (card[row][col - 1].count == BOOM) { count++; } } // 右边 if (col + 1 < colNum) { if (card[row][col + 1].count == BOOM) { count++; } } // 左下 if (row + 1 < rowNum && col - 1 >= 0) { if (card[row + 1][col - 1].count == BOOM) { count++; } } // 下边 if (row + 1 < rowNum) { if (card[row + 1][col].count == BOOM) { count++; } } // 右下 if (row + 1 < rowNum && col + 1 < colNum) { if (card[row + 1][col + 1].count == BOOM) { count++; } } // 将对应方块设置为计算后的数值 card[row][col].count = count; } private class JLabelListener extends MouseAdapter { private int row = 0; private int col = 0; public JLabelListener(int row, int col) { this.row = row; this.col = col; } @Override public void mouseClicked(MouseEvent e) { /* * 右键点击 */ if (e.getButton() == 3 && card[row][col].flag == false) { label[row][col].setIcon(new ImageIcon("img\\" + img[img.length - 1])); return; } /* * 左键点击 */ // 如果不是雷,并且没有被点击过 if (!(card[row][col].count == BOOM) && card[row][col].flag == false) { // 如果该位置附近雷数为0 if (card[row][col].count == NONE) { // 进入递归 open(row, col); } else { // 否则打开 label[row][col].setIcon(new ImageIcon("img\\" + img[card[row][col].count])); // 改变该位置方块状态 card[row][col].flag = true; // 剩余方块-1 remainCount--; // 如果剩余的方块和雷的数目一样,那么表示过关 if (remainCount == bomb) { JOptionPane.showMessageDialog(null, "恭喜过关!"); return; } } // 如果是雷 } else if (card[row][col].count == BOOM && card[row][col].flag == false) { label[row][col].setIcon(new ImageIcon("img\\" + "over.jpg")); card[row][col].flag = true; // 提醒 JOptionPane.showMessageDialog(null, "游戏失败!!"); // 将所有的方块翻开 openAll(); } } // 递归翻牌 private void open(int row, int col) { if (card[row][col].count == NONE && card[row][col].flag == false) { label[row][col].setIcon(new ImageIcon("img\\" + img[card[row][col].count])); // 改变方块状态,表示该方块已经被翻开 card[row][col].flag = true; remainCount--; // 左上 if (row - 1 >= 0 && col - 1 >= 0) { open(row - 1, col - 1); } // 上方 if (row - 1 >= 0) { open(row - 1, col); } // 右上 if (row - 1 >= 0 && col + 1 < colNum) { open(row - 1, col + 1); } // 左边 if (col - 1 >= 0) { open(row, col - 1); } // 右边 if (col + 1 < colNum) { open(row, col + 1); } // 左下 if (row + 1 < rowNum && col - 1 >= 0) { open(row + 1, col - 1); } // 下边 if (row + 1 < colNum) { open(row + 1, col); } // 右下 if (row + 1 < rowNum && col + 1 < colNum) { open(row + 1, col + 1); } } else { if (card[row][col].flag == false) { label[row][col].setIcon(new ImageIcon("img\\" + img[card[row][col].count])); card[row][col].flag = true; remainCount--; } return; } } // 翻开所有的方块 private void openAll() { for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { // 翻开雷牌 if (card[i][j].flag == false && card[i][j].count == 9) { label[i][j].setIcon(new ImageIcon("img\\" + img[card[i][j].count])); } card[i][j].flag = true; } } } } class ClickListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == easy) { setVisible(false); new MainFrame(9, 9, 9); } else if (e.getSource() == middle) { setVisible(false); new MainFrame(16, 16, 40); } else if (e.getSource() == harder) { setVisible(false); new MainFrame(16, 30, 99); } else if (e.getSource() == refreshBt) { // 将panel上的控件全部移除 panel.removeAll(); // 初始化 initJLabel(); // 刷新 repaint(); // 设置可见 setVisible(true); } } } public static void main(String[] args) { new MainFrame(9, 9, 10); } }
相关推荐
Java游戏扫雷-简易复制品.zipJava游戏扫雷-简易复制品.zip Java游戏扫雷-简易复制品.zipJava游戏扫雷-简易复制品.zip Java游戏扫雷-简易复制品.zipJava游戏扫雷-简易复制品.zip Java游戏扫雷-简易复制品.zipJava游戏...
NULL 博文链接:https://moonmonster.iteye.com/blog/2266754
标题中的“扫雷-小游戏-NAS-WebStation-HTML5”揭示了这是一个基于HTML5技术开发的扫雷小游戏,特别设计用于在NAS(Network Attached Storage,网络附加存储)设备上的WebStation服务器上运行。这样的设置使得用户...
通过研究这个“j2me扫雷”项目,初学者不仅可以学会编写简单的游戏,还能深入理解J2ME平台的工作原理,为未来开发更复杂的移动应用打下坚实的基础。同时,对于已经有一定经验的开发者来说,这样的项目也是一个回顾...
【描述】"j2me 扫雷"的描述简单明了,强调了这是一个可以直接在NetBeans 6.5中运行和调试的项目。NetBeans是一个流行的开源IDE,支持多种编程语言,包括Java,对于Java ME开发尤其友好。通过描述我们可以推断,这个...
扫雷,这款经典的Windows系统内置游戏,以其简单易上手、挑战智力的特性深受全球玩家喜爱。它不仅锻炼了玩家的空间思维和逻辑推理能力,还成为了许多人童年回忆的一部分。如今,随着编程技术的发展,扫雷游戏已经...
基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip ...
大一时工程实践用C语言写的简易扫雷游戏,参考了网上的实现扫雷的思想,图形界面用的easyx,没有的可以直接去easyx官网安装,下载很简单,使用方法也很简单
本项目是利用TS环境下运行开发的简易版扫雷,包含传统扫雷的大部分功能。 欢迎下载-开始你的工兵生活吧~
C# 扫雷游戏 简易C# 扫雷游戏 简易C# 扫雷游戏 简易C# 扫雷游戏 简易
扫雷,这款经典的小游戏,凭借其独特的逻辑挑战性和简单的操作方式,一直深受广大用户的喜爱。在计算机科学领域,尤其是软件开发中,实现扫雷游戏是学习图形用户界面(GUI)编程和算法设计的一个良好实践。本篇文章...
在本项目中,我们探索...通过这个简易版的扫雷游戏,学习者可以深入理解C语言的基本语法,数组操作,控制结构,以及简单的输入输出处理。同时,也能接触到游戏逻辑设计、错误处理等编程实践,对提升编程能力大有裨益。
Java扫雷简易实例程序是一种基于Java编程语言实现的简化版经典扫雷游戏。这个程序的特点是简洁明了,没有复杂的用户界面,旨在帮助初学者理解基础的Java编程概念和逻辑控制。下面我们将深入探讨该程序可能包含的关键...