JAVA简单实现扫雷小游戏

这两天学校外面来人教java基础,学习一下,自己试着做了一个扫雷小游戏,记录一下子学习过程。(我觉得自己不是很懂类和对象,基础没怎么看),敲出来的代码结构混乱,希望路过的大虾不吝啬的留下些代码改进的意见或是编写代码要注意的地方,感谢U•ェ•*U

效果图



我的敲代码过程(想到什么敲什么)

搭界面

这里用到的变量都是需要在多个地方使用的,所以我定义成了全局变量

// 使用到的变量private int matrix = 9; // matrix*matrix 矩阵,规定了页面上的按钮数量private int mineNum = 10; // 雷的数量private int[][] counts = new int[matrix][matrix]; // 按钮下对应的雷数private Color clickedColor = Color.LIGHT_GRAY; // 已经被点击的按钮的颜色private Color bombColor = Color.yellow; // 雷爆炸的颜色private Color mineColor = Color.white; // 布雷区默认的颜色// 使用到的全局控件private JFrame jf = new JFrame("扫雷小游戏");    //创建一个JFrame对象,存放整个窗体private JPanel jp = new JPanel(); // 创建JPanel对象,中间容器,先存放其中,再存放到窗体中private TestTimer testTimer =new TestTimer();private Timer tme =new Timer(1000,testTimer);private int tmeCount = 0;private JLabel gameTime = new JLabel("00"); // 游戏时间private JButton[][] buttons = new JButton[matrix][matrix]; // 页面上的按钮组(游戏主体)

从效果图中可以看出我把窗体分成了两个部分,头部的菜单区域和游戏主题区域

  1. 头部菜单区域
 private void addTopMenu() {JLabel levelLabel = new JLabel("游戏等级"); // 游戏等级gameTime.setBackground(Color.yellow); // 设置标签颜色gameTime.setOpaque(true); // 是否不透明,不设没颜色。。。。JButton resetButton = new JButton("新对局"); // 重置按钮resetButton.addActionListener(new ResetGame());String[] listData = new String[]{"9x9,10", "16x16,30", "30x30,99"};JComboBox<String> gameLevel= new JComboBox<String>(listData);    //创建JComboBoxgameLevel.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {// 下拉框选项if (e.getItem() == "9x9,10") {matrix = 9;mineNum = 10;} else if (e.getItem() == "16x16,30") {matrix = 16;mineNum = 30;} else if (e.getItem() == "30x30,99") {matrix = 30;mineNum = 99;}}}});JPanel topMenu = new JPanel(); topMenu.add(levelLabel); topMenu.add(gameLevel); topMenu.add(gameTime); topMenu.add(resetButton); jf.add(topMenu, BorderLayout.NORTH);}
  1. 游戏主体(雷区)
private void addButtons() {// 先清空雷区jp.removeAll();jp.setLayout(new GridLayout(matrix,matrix,0,0)); // 采用网格布局buttons = new JButton[matrix][matrix];// 添加按钮组for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {JButton button = new JButton();button.setBackground(mineColor);button.setOpaque(true); //设置颜色的必选项button.setMargin(new Insets(0, 0, 0, 0)); //设置按钮边距button.addMouseListener(new MouseListener() {public void mouseReleased(MouseEvent e){//System.out.println("mouseReleased---鼠标放开事件");}public void mousePressed(MouseEvent e){//System.out.println("mousePressed---鼠标按下事件");} public void mouseExited(MouseEvent e){//System.out.println("mouseExited---鼠标移出按钮区域");}public void mouseEntered(MouseEvent e){//System.out.println("mouseEntered---鼠标移入按钮区域");}public void mouseClicked(MouseEvent e){if(e.getButton()==e.BUTTON1 && ((JButton)e.getSource()).isEnabled() == true && ((JButton)e.getSource()).getText() != "?"){//System.out.println("鼠标左点击事件");// 游戏主体按钮的事件触发tme.start(); // 计时开始boolean flag = true; // 标记是否需要判断游戏成功JButton button = (JButton)e.getSource();for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (buttons[i][j] == button) {if (counts[i][j] == 99) {// 踩雷了,游戏结束gameOver();flag = false;break;}if (counts[i][j] == 0) {// 是0,调用递归方法,寻找周围所有的0isZero(i,j);break;}// 显示具体的数字buttons[i][j].setBackground(clickedColor);buttons[i][j].setText(String.valueOf(counts[i][j]));}}}// 检查是否找出了所有的非雷区域if (flag) {isEnd();}}if(e.getButton()==e.BUTTON3){//System.out.println("鼠标右点击事件");if (((JButton)e.getSource()).getText() == "" && ((JButton)e.getSource()).getBackground() == mineColor) {((JButton)e.getSource()).setText("?");} else {if (((JButton)e.getSource()).getText() == "?") {((JButton)e.getSource()).setText("");}}}if(e.getButton()==e.BUTTON2){// 预加载周围八个的内容JButton button = (JButton)e.getSource();for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (buttons[i][j] == button) {// 找到当前被点击的按钮if(buttons[i][j].getBackground() == clickedColor) {// 只能是已经显示了的按钮// 查看周围八个格子的内容,如果有“?”,就显示剩余格子的内容int count = 0; // 周围“?”的数量,判断是否需要显示周围内容if (i>0   && j>0 &&          buttons[i-1][j-1].getText() == "?") count++;if (i>0   &&                   buttons[i-1][j].getText() == "?" ) count++;if (i>0   && j<matrix-1 &&       buttons[i-1][j+1].getText() == "?") count++;if (j>0   &&                  buttons[i][j-1].getText() == "?" ) count++;if (j<matrix-1 &&               buttons[i][j+1].getText() == "?" ) count++;if (i<matrix-1 && j>0 &&        buttons[i+1][j-1].getText() == "?" ) count++;if (i<matrix-1 &&                buttons[i+1][j].getText() == "?" ) count++;if (j<matrix-1 && i<matrix-1 && buttons[i+1][j+1].getText() == "?" ) count++;//// 当周围标记了雷的数量与当前按钮上的值一样,就展开周围内容if(count == Integer.valueOf(buttons[i][j].getText())) {// 显示周围八个内容,是雷就结束游戏,不是就展开if (i>0 && j>0 &&                buttons[i-1][j-1].getBackground() == mineColor && buttons[i-1][j-1].getText() != "?") {if (counts[i-1][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}     else {/*递归展开内容*/isZero(i-1,j-1);}}if (i>0 &&                         buttons[i-1][j].getBackground() == mineColor &&   buttons[i-1][j].getText() != "?")    {if (counts[i-1][j] == 99) {/*如果是雷,游戏结束*/gameOver();}      else {/*递归展开内容*/isZero(i-1,j);}}if (i>0 && j<matrix-1 &&      buttons[i-1][j+1].getBackground() == mineColor && buttons[i-1][j+1].getText() != "?") {if (counts[i-1][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}  else {/*递归展开内容*/isZero(i-1,j+1);}}if (j>0 &&                        buttons[i][j-1].getBackground() == mineColor &&   buttons[i][j-1].getText() != "?")    {if (counts[i][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}      else {/*递归展开内容*/isZero(i,j-1);}}if (j<matrix-1 &&                buttons[i][j+1].getBackground() == mineColor &&  buttons[i][j+1].getText() != "?")   {if (counts[i][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}         else {/*递归展开内容*/isZero(i,j+1);}}if (i<matrix-1 && j>0 &&         buttons[i+1][j-1].getBackground() == mineColor && buttons[i+1][j-1].getText() != "?") {if (counts[i+1][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}  else {/*递归展开内容*/isZero(i+1,j-1);}}if (i<matrix-1 &&                 buttons[i+1][j].getBackground() == mineColor &&  buttons[i+1][j].getText() != "?")   {if (counts[i+1][j] == 99) {/*如果是雷,游戏结束*/gameOver();}         else {/*递归展开内容*/isZero(i+1,j);}}if (j<matrix-1 && i<matrix-1 &&  buttons[i+1][j+1].getBackground() == mineColor && buttons[i+1][j+1].getText() != "?") {if (counts[i+1][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}   else {/*递归展开内容*/isZero(i+1,j+1);}}}}}}}}}});buttons[i][j] = button;jp.add(button);}}jf.add(jp, BorderLayout.CENTER); // 将JPanel中间容器添加到JFrame窗体中}

游戏逻辑方法

  1. burieMine() 埋雷
 private void burieMine () {// 先清空所有的雷counts = new int[matrix][matrix];// 埋雷for(int i=0;i<mineNum;i++) {Random r = new Random(); // 随机获取一个位置int x = r.nextInt(matrix);int y = r.nextInt(matrix);if (counts[x][y] == 99) {// 如果已经设置为雷,就跳过i--;continue;}counts[x][y] = 99; // 99表示是雷}}
  1. mineCount() 统计对应按钮下周围雷的数量
private void mineCount () {// 统计雷的数量// 判断方法:寻找九宫格中目标周围8个的内容int num; // 用来统计目标周围雷的数量for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {if (counts[i][j] == 99) continue; // 如果是雷就跳过num = 0;
//              (i-1,j-1)  (i-1,j)  (i-1,j+1)
//              (i,j-1)    (i,j)    (i, j+1)
//              (i+1,j-1)  (i+1,j)    (i+1,j+1)// 防止数组下标越界if (i>0   && j>0 &&             counts[i-1][j-1] == 99) num++;if (i>0   &&                   counts[i-1][j] == 99 ) num++;if (i>0   && j<matrix-1 &&           counts[i-1][j+1] == 99) num++;if (j>0   &&                  counts[i][j-1] == 99) num++;if (j<matrix-1 &&                counts[i][j+1] == 99) num++;if (i<matrix-1 && j>0 &&         counts[i+1][j-1] == 99) num++;if (i<matrix-1 &&                 counts[i+1][j] == 99) num++;if (j<matrix-1 && i<matrix-1 &&  counts[i+1][j+1] == 99) num++;counts[i][j] = num; // 赋值到目标位置         }}}
  1. gameOver() 游戏结束
private void gameOver() {tme.stop();// 游戏结束,显示所有内容for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (counts[i][j] == 99) { // 如果是雷就显示雷buttons[i][j].setText("雷");buttons[i][j].setBackground(bombColor);} else {if (counts[i][j] == 0) { // 如果是0就显示为空buttons[i][j].setText("");} else {buttons[i][j].setText(String.valueOf(counts[i][j]));}buttons[i][j].setBackground(clickedColor);}buttons[i][j].setEnabled(false); // 设置按钮不可用}}String msg = "坚持了" + String.valueOf(tmeCount) + "秒";JOptionPane.showMessageDialog(jf, msg, "游戏结束", JOptionPane.ERROR_MESSAGE);}
  1. isZero(int i, int j) // 如果是0也就是空(即周围没有雷),就打开周围不是雷的按钮
private void isZero(int i, int j) {// 递归实现寻找周围的0,// 结束条件:1.已经被点击(或显示)的按钮(按钮颜色改变为了橙色了的按钮)//         2.遇到了雷//            3.遇到了数字if (buttons[i][j].getBackground() == clickedColor) return;if (counts[i][j] == 0) {buttons[i][j].setText("");buttons[i][j].setBackground(clickedColor);isEnd();} else {if (counts[i][j] == 99) {return;} else {buttons[i][j].setText(String.valueOf(counts[i][j]));buttons[i][j].setBackground(clickedColor);isEnd();return;} }// 查看目标周围八格if (i>0   && j>0 ) isZero(i-1,j-1);if (i>0) isZero(i-1,j);if (i>0   && j<matrix-1 ) isZero(i-1,j+1);if (j>0) isZero(i,j-1);if (j<matrix-1) isZero(i,j+1);if (i<matrix-1 && j>0) isZero(i+1,j-1);if (i<matrix-1)  isZero(i+1,j);if (j<matrix-1 && i<matrix-1) isZero(i+1,j+1);}
  1. isEnd() 判断是否找出了所有的非雷单位,判断方式:页面已点击的按钮的数量 = 雷区按钮总数量 - 雷的数量
private void isEnd() {// 游戏完成,找出了所有的非雷单位int count = 0;// 计数器,记录共有多少个被选出的单位for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {if(buttons[i][j].getBackground() == clickedColor) {count++;}}}if (count == matrix*matrix - mineNum) {// 成功找出所有的非雷tme.stop();for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {buttons[i][j].setEnabled(false);}}String msg = "共用时" + String.valueOf(tmeCount) + "秒";JOptionPane.showMessageDialog(jf, msg, "你赢了", JOptionPane.PLAIN_MESSAGE);}}
  1. init() 游戏初始化方法,重置游戏就是调用此方法
private void init() {// 重绘窗体jf.repaint();// 绘制雷区addButtons();burieMine();mineCount();jf.setVisible(true); // 设置窗体可见,不写看不见tmeCount = 0;gameTime.setText("00");tme.stop();}

鼠标事件(左键,滚轮,右键)

button.addMouseListener(new MouseListener() {public void mouseReleased(MouseEvent e){//System.out.println("mouseReleased---鼠标放开事件");}public void mousePressed(MouseEvent e){System.out.println("w");//System.out.println("mousePressed---鼠标按下事件");} public void mouseExited(MouseEvent e){//System.out.println("mouseExited---鼠标移出按钮区域");}public void mouseEntered(MouseEvent e){//System.out.println("mouseEntered---鼠标移入按钮区域");}public void mouseClicked(MouseEvent e){if(e.getButton()==MouseEvent.BUTTON1 && ((JButton)e.getSource()).isEnabled() == true && ((JButton)e.getSource()).getText() != "?"){//System.out.println("鼠标左点击事件");// 游戏主体按钮的事件触发tme.start(); // 计时开始boolean flag = true; // 标记是否需要判断游戏成功JButton button = (JButton)e.getSource();for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (buttons[i][j] == button) {if (counts[i][j] == 99) {// 踩雷了,游戏结束gameOver();flag = false;break;}if (counts[i][j] == 0) {// 是0,调用递归方法,寻找周围所有的0isZero(i,j);break;}// 显示具体的数字buttons[i][j].setBackground(clickedColor);buttons[i][j].setText(String.valueOf(counts[i][j]));}}}// 检查是否找出了所有的非雷区域if (flag) {isEnd();}}if(e.getButton() == MouseEvent.BUTTON3){//System.out.println("鼠标右点击事件");if (((JButton)e.getSource()).getText() == "" && ((JButton)e.getSource()).getBackground() == mineColor) {((JButton)e.getSource()).setText("?");} else {if (((JButton)e.getSource()).getText() == "?") {((JButton)e.getSource()).setText("");}}}if(e.getButton()==MouseEvent.BUTTON2){// 预加载周围八个的内容JButton button = (JButton)e.getSource();for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (buttons[i][j] == button) {// 找到当前被点击的按钮if(buttons[i][j].getBackground() == clickedColor) {// 只能是已经显示了的按钮// 查看周围八个格子的内容,如果有“?”,就显示剩余格子的内容int count = 0; // 周围“?”的数量,判断是否需要显示周围内容if (i>0   && j>0 &&            buttons[i-1][j-1].getText() == "?") count++;if (i>0   &&                   buttons[i-1][j].getText() == "?" ) count++;if (i>0   && j<matrix-1 &&       buttons[i-1][j+1].getText() == "?") count++;if (j>0   &&                  buttons[i][j-1].getText() == "?" ) count++;if (j<matrix-1 &&               buttons[i][j+1].getText() == "?" ) count++;if (i<matrix-1 && j>0 &&        buttons[i+1][j-1].getText() == "?" ) count++;if (i<matrix-1 &&                buttons[i+1][j].getText() == "?" ) count++;if (j<matrix-1 && i<matrix-1 && buttons[i+1][j+1].getText() == "?" ) count++;//// 当周围标记了雷的数量与当前按钮上的值一样,就展开周围内容if(count == Integer.valueOf(buttons[i][j].getText())) {// 显示周围八个内容,是雷就结束游戏,不是就展开if (i>0 && j>0 &&                buttons[i-1][j-1].getBackground() == mineColor && buttons[i-1][j-1].getText() != "?") {if (counts[i-1][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}     else {/*递归展开内容*/isZero(i-1,j-1);}}if (i>0 &&                         buttons[i-1][j].getBackground() == mineColor &&   buttons[i-1][j].getText() != "?")    {if (counts[i-1][j] == 99) {/*如果是雷,游戏结束*/gameOver();}      else {/*递归展开内容*/isZero(i-1,j);}}if (i>0 && j<matrix-1 &&      buttons[i-1][j+1].getBackground() == mineColor && buttons[i-1][j+1].getText() != "?") {if (counts[i-1][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}  else {/*递归展开内容*/isZero(i-1,j+1);}}if (j>0 &&                        buttons[i][j-1].getBackground() == mineColor &&   buttons[i][j-1].getText() != "?")    {if (counts[i][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}      else {/*递归展开内容*/isZero(i,j-1);}}if (j<matrix-1 &&                buttons[i][j+1].getBackground() == mineColor &&  buttons[i][j+1].getText() != "?")   {if (counts[i][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}         else {/*递归展开内容*/isZero(i,j+1);}}if (i<matrix-1 && j>0 &&         buttons[i+1][j-1].getBackground() == mineColor && buttons[i+1][j-1].getText() != "?") {if (counts[i+1][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}  else {/*递归展开内容*/isZero(i+1,j-1);}}if (i<matrix-1 &&                 buttons[i+1][j].getBackground() == mineColor &&  buttons[i+1][j].getText() != "?")   {if (counts[i+1][j] == 99) {/*如果是雷,游戏结束*/gameOver();}         else {/*递归展开内容*/isZero(i+1,j);}}if (j<matrix-1 && i<matrix-1 &&  buttons[i+1][j+1].getBackground() == mineColor && buttons[i+1][j+1].getText() != "?") {if (counts[i+1][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}   else {/*递归展开内容*/isZero(i+1,j+1);}}}}}}}}}});

程序源代码

package demo;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;
import java.util.EventListener;
import java.util.Random;public class MineClearance {// 使用到的变量int matrix = 9; // matrix*matrix 矩阵,规定了页面上的按钮数量int mineNum = 10; // 雷的数量int[][] counts = new int[matrix][matrix]; // 按钮下对应的雷数Color clickedColor = Color.LIGHT_GRAY; // 已经被点击的按钮的颜色Color bombColor = Color.yellow; // 雷爆炸的颜色Color mineColor = Color.white; // 布雷区默认的颜色// 使用到的全局控件private JFrame jf = new JFrame("扫雷小游戏");    //创建一个JFrame对象,存放整个窗体private JPanel jp = new JPanel(); // 创建JPanel对象,中间容器,先存放其中,再存放到窗体中private TestTimer testTimer =new TestTimer();private Timer tme =new Timer(1000,testTimer);private int tmeCount = 0;private JLabel gameTime = new JLabel("00"); // 游戏时间private JButton[][] buttons = new JButton[matrix][matrix]; // 页面上的按钮组(游戏主体)public MineClearance() {// 页面布局jf.setLayout(new BorderLayout()); //设置边框布局jp.setLayout(new GridLayout(matrix,matrix,0,0)); // 采用网格布局jf.setBounds(300, 100, 600, 650);    //设置窗口大小和位置//----头部菜单-----addTopMenu();//----绘制雷区-----init();}private void addTopMenu() {JLabel levelLabel = new JLabel("游戏等级"); // 游戏等级gameTime.setBackground(Color.yellow); // 设置标签颜色gameTime.setOpaque(true); // 是否不透明,不设没颜色。。。。JButton resetButton = new JButton("新对局"); // 重置按钮resetButton.addActionListener(new ResetGame());String[] listData = new String[]{"9x9,10", "16x16,30", "30x30,99"};JComboBox<String> gameLevel= new JComboBox<String>(listData);    //创建JComboBoxgameLevel.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {// 下拉框选项if (e.getItem() == "9x9,10") {matrix = 9;mineNum = 10;} else if (e.getItem() == "16x16,30") {matrix = 16;mineNum = 30;} else if (e.getItem() == "30x30,99") {matrix = 30;mineNum = 99;}}}});JPanel topMenu = new JPanel(); topMenu.add(levelLabel); topMenu.add(gameLevel); topMenu.add(gameTime); topMenu.add(resetButton); jf.add(topMenu, BorderLayout.NORTH);}private void addButtons() {// 先清空雷区jp.removeAll();jp.setLayout(new GridLayout(matrix,matrix,0,0)); // 采用网格布局buttons = new JButton[matrix][matrix];// 添加按钮组for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {JButton button = new JButton();button.setBackground(mineColor);button.setOpaque(true); //设置颜色的必选项button.setMargin(new Insets(0, 0, 0, 0)); //设置按钮边距button.addMouseListener(new MouseListener() {public void mouseReleased(MouseEvent e){//System.out.println("mouseReleased---鼠标放开事件");}public void mousePressed(MouseEvent e){//System.out.println("mousePressed---鼠标按下事件");} public void mouseExited(MouseEvent e){//System.out.println("mouseExited---鼠标移出按钮区域");}public void mouseEntered(MouseEvent e){//System.out.println("mouseEntered---鼠标移入按钮区域");}public void mouseClicked(MouseEvent e){if(e.getButton()==e.BUTTON1 && ((JButton)e.getSource()).isEnabled() == true && ((JButton)e.getSource()).getText() != "?"){//System.out.println("鼠标左点击事件");// 游戏主体按钮的事件触发tme.start(); // 计时开始boolean flag = true; // 标记是否需要判断游戏成功JButton button = (JButton)e.getSource();for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (buttons[i][j] == button) {if (counts[i][j] == 99) {// 踩雷了,游戏结束gameOver();flag = false;break;}if (counts[i][j] == 0) {// 是0,调用递归方法,寻找周围所有的0isZero(i,j);break;}// 显示具体的数字buttons[i][j].setBackground(clickedColor);buttons[i][j].setText(String.valueOf(counts[i][j]));}}}// 检查是否找出了所有的非雷区域if (flag) {isEnd();}}if(e.getButton()==e.BUTTON3){//System.out.println("鼠标右点击事件");if (((JButton)e.getSource()).getText() == "" && ((JButton)e.getSource()).getBackground() == mineColor) {((JButton)e.getSource()).setText("?");} else {if (((JButton)e.getSource()).getText() == "?") {((JButton)e.getSource()).setText("");}}}if(e.getButton()==e.BUTTON2){// 预加载周围八个的内容JButton button = (JButton)e.getSource();for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (buttons[i][j] == button) {// 找到当前被点击的按钮if(buttons[i][j].getBackground() == clickedColor) {// 只能是已经显示了的按钮// 查看周围八个格子的内容,如果有“?”,就显示剩余格子的内容int count = 0; // 周围“?”的数量,判断是否需要显示周围内容if (i>0   && j>0 &&           buttons[i-1][j-1].getText() == "?") count++;if (i>0   &&                   buttons[i-1][j].getText() == "?" ) count++;if (i>0   && j<matrix-1 &&       buttons[i-1][j+1].getText() == "?") count++;if (j>0   &&                  buttons[i][j-1].getText() == "?" ) count++;if (j<matrix-1 &&               buttons[i][j+1].getText() == "?" ) count++;if (i<matrix-1 && j>0 &&        buttons[i+1][j-1].getText() == "?" ) count++;if (i<matrix-1 &&                buttons[i+1][j].getText() == "?" ) count++;if (j<matrix-1 && i<matrix-1 && buttons[i+1][j+1].getText() == "?" ) count++;//// 当周围标记了雷的数量与当前按钮上的值一样,就展开周围内容if(count == Integer.valueOf(buttons[i][j].getText())) {// 显示周围八个内容,是雷就结束游戏,不是就展开if (i>0 && j>0 &&                buttons[i-1][j-1].getBackground() == mineColor && buttons[i-1][j-1].getText() != "?") {if (counts[i-1][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}     else {/*递归展开内容*/isZero(i-1,j-1);}}if (i>0 &&                         buttons[i-1][j].getBackground() == mineColor &&   buttons[i-1][j].getText() != "?")    {if (counts[i-1][j] == 99) {/*如果是雷,游戏结束*/gameOver();}      else {/*递归展开内容*/isZero(i-1,j);}}if (i>0 && j<matrix-1 &&      buttons[i-1][j+1].getBackground() == mineColor && buttons[i-1][j+1].getText() != "?") {if (counts[i-1][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}  else {/*递归展开内容*/isZero(i-1,j+1);}}if (j>0 &&                        buttons[i][j-1].getBackground() == mineColor &&   buttons[i][j-1].getText() != "?")    {if (counts[i][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}      else {/*递归展开内容*/isZero(i,j-1);}}if (j<matrix-1 &&                buttons[i][j+1].getBackground() == mineColor &&  buttons[i][j+1].getText() != "?")   {if (counts[i][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}         else {/*递归展开内容*/isZero(i,j+1);}}if (i<matrix-1 && j>0 &&         buttons[i+1][j-1].getBackground() == mineColor && buttons[i+1][j-1].getText() != "?") {if (counts[i+1][j-1] == 99) {/*如果是雷,游戏结束*/gameOver();}  else {/*递归展开内容*/isZero(i+1,j-1);}}if (i<matrix-1 &&                 buttons[i+1][j].getBackground() == mineColor &&  buttons[i+1][j].getText() != "?")   {if (counts[i+1][j] == 99) {/*如果是雷,游戏结束*/gameOver();}         else {/*递归展开内容*/isZero(i+1,j);}}if (j<matrix-1 && i<matrix-1 &&  buttons[i+1][j+1].getBackground() == mineColor && buttons[i+1][j+1].getText() != "?") {if (counts[i+1][j+1] == 99) {/*如果是雷,游戏结束*/gameOver();}   else {/*递归展开内容*/isZero(i+1,j+1);}}}}}}}}}});buttons[i][j] = button;jp.add(button);}}jf.add(jp, BorderLayout.CENTER); // 将JPanel中间容器添加到JFrame窗体中}private void burieMine () {// 先清空所有的雷counts = new int[matrix][matrix];// 埋雷for(int i=0;i<mineNum;i++) {Random r = new Random(); // 随机获取一个位置int x = r.nextInt(matrix);int y = r.nextInt(matrix);if (counts[x][y] == 99) {// 如果已经设置为雷,就跳过i--;continue;}counts[x][y] = 99; // 99表示是雷}}private void mineCount () {// 统计雷的数量// 判断方法:寻找九宫格中目标周围8个的内容int num; // 用来统计目标周围雷的数量for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {if (counts[i][j] == 99) continue; // 如果是雷就跳过num = 0;
//              (i-1,j-1)  (i-1,j)  (i-1,j+1)
//              (i,j-1)    (i,j)    (i, j+1)
//              (i+1,j-1)  (i+1,j)    (i+1,j+1)// 防止数组下标越界if (i>0   && j>0 &&             counts[i-1][j-1] == 99) num++;if (i>0   &&                   counts[i-1][j] == 99 ) num++;if (i>0   && j<matrix-1 &&           counts[i-1][j+1] == 99) num++;if (j>0   &&                  counts[i][j-1] == 99) num++;if (j<matrix-1 &&                counts[i][j+1] == 99) num++;if (i<matrix-1 && j>0 &&         counts[i+1][j-1] == 99) num++;if (i<matrix-1 &&                 counts[i+1][j] == 99) num++;if (j<matrix-1 && i<matrix-1 &&  counts[i+1][j+1] == 99) num++;counts[i][j] = num; // 赋值到目标位置         }}}private void gameOver() {tme.stop();// 游戏结束,显示所有内容for (int i=0;i<matrix;i++) {for (int j=0;j<matrix;j++) {if (counts[i][j] == 99) { // 如果是雷就显示雷buttons[i][j].setText("雷");buttons[i][j].setBackground(bombColor);} else {if (counts[i][j] == 0) { // 如果是0就显示为空buttons[i][j].setText("");} else {buttons[i][j].setText(String.valueOf(counts[i][j]));}buttons[i][j].setBackground(clickedColor);}buttons[i][j].setEnabled(false); // 设置按钮不可用}}String msg = "坚持了" + String.valueOf(tmeCount) + "秒";JOptionPane.showMessageDialog(jf, msg, "游戏结束", JOptionPane.ERROR_MESSAGE);}private void init() {// 重绘窗体jf.repaint();// 绘制雷区addButtons();burieMine();mineCount();jf.setVisible(true); // 设置窗体可见,不写看不见tmeCount = 0;gameTime.setText("00");tme.stop();}private void isZero(int i, int j) {// 递归实现寻找周围的0,// 结束条件:1.已经被点击(或显示)的按钮(按钮颜色改变为了橙色了的按钮)//          2.遇到了雷//            3.遇到了数字if (buttons[i][j].getBackground() == clickedColor) return;if (counts[i][j] == 0) {buttons[i][j].setText("");buttons[i][j].setBackground(clickedColor);isEnd();} else {if (counts[i][j] == 99) {return;} else {buttons[i][j].setText(String.valueOf(counts[i][j]));buttons[i][j].setBackground(clickedColor);isEnd();return;} }// 查看目标周围八格if (i>0   && j>0 ) isZero(i-1,j-1);if (i>0) isZero(i-1,j);if (i>0   && j<matrix-1 ) isZero(i-1,j+1);if (j>0) isZero(i,j-1);if (j<matrix-1) isZero(i,j+1);if (i<matrix-1 && j>0) isZero(i+1,j-1);if (i<matrix-1)  isZero(i+1,j);if (j<matrix-1 && i<matrix-1) isZero(i+1,j+1);}private void isEnd() {// 游戏完成,找出了所有的非雷单位int count = 0;// 计数器,记录共有多少个被选出的单位for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {if(buttons[i][j].getBackground() == clickedColor) {count++;}}}if (count == matrix*matrix - mineNum) {// 成功找出所有的非雷tme.stop();for(int i=0;i<matrix;i++) {for(int j=0;j<matrix;j++) {buttons[i][j].setEnabled(false);}}String msg = "共用时" + String.valueOf(tmeCount) + "秒";JOptionPane.showMessageDialog(jf, msg, "你赢了", JOptionPane.PLAIN_MESSAGE);}}public static void main(String[] args) {new MineClearance();}class ResetGame implements ActionListener{// 重置游戏public void actionPerformed(ActionEvent event){init();}}class TestTimer implements ActionListener{public void actionPerformed(ActionEvent e){tmeCount++;String s;if (tmeCount < 10) {s =  "0" + String.valueOf(tmeCount);}else {s =  String.valueOf(tmeCount);}gameTime.setText(s);}}
}

JAVA简单实现扫雷小游戏相关推荐

  1. VB6实现简单的扫雷小游戏

    #VB实现简单的扫雷小游戏 扫雷这个小游戏可谓是简单又好玩,百万不腻,不知道有没有小伙伴跟博主一样脑热的曾经扫过一整个屏幕的雷... 源码可以在作者的资源页下载 https://download.cs ...

  2. 用C语言实现一个简单的扫雷小游戏(附全代码及教程)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...

  3. java课程设计——扫雷小游戏

    1.项目简介 采用java swing设计扫雷游戏软件,设计目标如下: 扫雷游戏分为初级.中级和高级三个级别,初级模式9*9个方块中有10个雷.中级模式16*16个方块中有40个雷.高级模式16*30 ...

  4. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...

  5. 【java游戏开发】教你用java做出扫雷小游戏

    扫雷是一款大众类的益智小游戏.根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 本课程详细讲解一个扫雷游戏的开发过程.只要90分钟就可以完成一个你自己亲手开发出来的Java ...

  6. C语言简单的键盘玩扫雷小游戏(完结)

    1:这次我们会将前面的代码进行整合,和整理,最终使我们的程序可以有效的运行起来. [1]初始化函数. void GameInit() {     //随机数种子     srand((unsigned ...

  7. 人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏

    前言 火了很长一段时间的ChatGPT.注册使用需要国外的手机号 3.1 计算机专业知识类问题 - 3.2 生活常识类 3.3 情感类 3.4 扫雷小游戏案例 package com.atguigu. ...

  8. 扫雷html5简单初级,纯原生JS用面向对象class方法实现简易扫雷小游戏

    Demo介绍 纯原生js 实现 且用ES6语法class写的扫雷小游戏:布局为10*10的网格,随机生成10-20个雷. 左键点击扫雷.右键标记该地方有雷.该demo下载下来复制到html文件中直接可 ...

  9. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

最新文章

  1. 2018-4-7 差分进化算法
  2. 实现tap的多种方式
  3. @ConditionalOnProperty 详解
  4. linux wget下载、断点续传
  5. 解决yum安装时 Cannot retrieve repository metadata (repomd.xml) for repository
  6. 安装提示卸载office_office2010 卸载工具
  7. extensions.conf的常用参数配置
  8. 数字填图问题matlab上机实验报告,数学建模实验报告数字填图问题
  9. Hibernate VS iBATIS
  10. java1.8win7_JDK 1.8 安装配置教程(win7 64bit )
  11. 【白皮书分享】2020年度薪酬白皮书.pdf(附下载链接)
  12. 提高生产力,这4款设计软件能自动生成代码
  13. FreeImage的学习总结总结(二)
  14. TPC,TPCC,TPMC(计算机性能衡量指标) -----
  15. SAS和JBOD基础简介
  16. 从315晚会曝光网秦谈企业社会责任
  17. C++解决《无重复字符的最长子串》问题(滑动窗口(unordered_set),string)
  18. 华硕 ROG主题 提取主题包
  19. Python有趣|数据分析三板斧
  20. 【JavaScript 基础】-- 数组切割splice和slice

热门文章

  1. 如何修改视频MD5的格式?这些方法值得你收藏
  2. PR转场模板 实用创意分裂多帧多画面纪录片vlog转场过渡pr模板
  3. 种草!超好用的PDF转换器上线啦~
  4. 基于STM32驱动SG90舵机
  5. studio3T连接不上mongoDB
  6. Hive 通过关闭CBO (Cost based Optimizer) 来优化特定的SQL执行
  7. 人脸生成的最强算法——《StyleGAN》论文解析
  8. js-bridge原理
  9. Nginx的access.log日志分析工具-goaccess
  10. 作业三--创建子程序