Java?Swing實(shí)現(xiàn)掃雷源碼
本文實(shí)例為大家分享了Java Swing實(shí)現(xiàn)掃雷源碼的具體代碼,供大家參考,具體內(nèi)容如下
先來(lái)看下效果
運(yùn)行時(shí)只需要?jiǎng)?chuàng)建一個(gè)GameWindow的對(duì)象即可,可使用有參構(gòu)造函數(shù)自定義雷區(qū)行列數(shù)及炸彈個(gè)數(shù),也可使用無(wú)參構(gòu)造函數(shù)設(shè)置默認(rèn)值(小旗和炸彈的圖標(biāo)自己去找吧,我就不在這里放了)
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; public class GameWindow{ ? ? private static Font labelFont = new Font("隸書(shū)",Font.BOLD,45); ? ? private static Font buttonFont = new Font("隸書(shū)",Font.CENTER_BASELINE,20); ? ? private static Icon flag = new ImageIcon("src/images/小旗.jpg");//小旗圖標(biāo) ? ? private static Icon bomb = new ImageIcon("src/images/炸彈.png");//炸彈圖標(biāo) ? ? private static int labelWeight = 30;//小方塊(雷區(qū))寬度 ? ? private static int labelHeigth = 30;//小方塊(雷區(qū))高度 ? ? private static int labelSpace = 1;//小方塊(雷區(qū))間距 ? ? private static int scoreHeight = 50;//積分區(qū)域高度 ? ? private static int[] x8 = {-1,-1,-1,0,0,1,1,1};//原坐標(biāo)周?chē)?8 個(gè)坐標(biāo)的 x 值變化 ? ? private static int[] y8 = {-1,0,1,-1,1,-1,0,1};//原坐標(biāo)周?chē)?8 個(gè)坐標(biāo)的 y 值變化 ? ? private static int[] x4 = {0,0,1,-1};//原坐標(biāo)周?chē)?4 個(gè)坐標(biāo)的 x 值變化 ? ? private static int[] y4 = {1,-1,0,0};//原坐標(biāo)周?chē)?4 個(gè)坐標(biāo)的 x 值變化 ? ? private JFrame frame; ? ? private int[][] data;//存儲(chǔ)和炸彈位置有關(guān)數(shù)據(jù),值為-1時(shí)表示炸彈 ? ? private JLabel[][] labels; ? ? private JPanel mainPanel;//雷區(qū)主面板 ? ? private JPanel scorePanel;//積分區(qū)域面板 ? ? private JLabel areaLabel;//未掃雷區(qū)個(gè)數(shù)標(biāo)簽 ? ? private JLabel bombLabel;//剩余地雷數(shù)標(biāo)簽 ? ? private int width;//窗體寬度 ? ? private int height;//窗體高度 ? ? private int row;//行數(shù) ? ? private int column;//列數(shù) ? ? private int bombNum;//炸彈個(gè)數(shù) ? ? private int remainArea;//未掃雷區(qū)個(gè)數(shù) ? ? private int remainBomb;//剩余地雷數(shù) ? ? public GameWindow(int row,int column,int bombNum){ ? ? ? ? frame = new JFrame("掃雷-洋仔小游戲"); ? ? ? ? this.row = row; ? ? ? ? this.column = column; ? ? ? ? this.bombNum = bombNum; ? ? ? ? mainPanel = new JPanel(); ? ? ? ? init(); ? ? } ? ? public GameWindow(){ ? ? ? ? this(10,10,20); ? ? } ? ? private void setWidthAndHeight(){ ? ? ? ? width = labelWeight * column + (column + 1) * labelSpace; ? ? ? ? height = scoreHeight + labelHeigth * row + (row + 1) * labelSpace; ? ? } ? ? private void setBomb(){ ? ? ? ? if(bombNum > row * column) ? ? ? ? ? ? throw new RuntimeException("炸彈數(shù)設(shè)置過(guò)多!"); ? ? ? ? data = new int[row][column]; ? ? ? ? int count = 0; ? ? ? ? while (count < bombNum){ ? ? ? ? ? ? int r = (int)(Math.random() * row); ? ? ? ? ? ? int c = (int)(Math.random() * column); ? ? ? ? ? ? System.out.println("r = " + r + "\tc = " + c); ? ? ? ? ? ? if(data[r][c] == -1) ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? data[r][c] = -1; ? ? ? ? ? ? for(int i = 0; i < 8; i ++){ ? ? ? ? ? ? ? ? int x = r + x8[i]; ? ? ? ? ? ? ? ? int y = c + y8[i]; ? ? ? ? ? ? ? ? if(x < 0 || x >= row || y < 0 || y >= column || data[x][y] == -1) ? ? ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? ? ? data[r + x8[i]][c + y8[i]] ++; ? ? ? ? ? ? } ? ? ? ? ? ? count ++; ? ? ? ? ? ? System.out.println(count); ? ? ? ? } ? ? } ? ? private class ButtonListener extends MouseAdapter { ? ? ? ? private JButton button; ? ? ? ? private int r; ? ? ? ? private int w; ? ? ? ? private GameWindow window; ? ? ? ? private boolean disabled = true; ? ? ? ? public ButtonListener(JButton button,int r,int w,GameWindow window){ ? ? ? ? ? ? this.button = button; ? ? ? ? ? ? this.r = r; ? ? ? ? ? ? this.w = w; ? ? ? ? ? ? this.window = window; ? ? ? ? } ? ? ? ? @Override ? ? ? ? public void mouseClicked(MouseEvent mouseEvent) { ? ? ? ? ? ? synchronized (window){ ? ? ? ? ? ? ? ? if(!button.isEnabled()) ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? if(mouseEvent.getButton() == MouseEvent.BUTTON3){ ? ? ? ? ? ? ? ? ? ? if(disabled) { ? ? ? ? ? ? ? ? ? ? ? ? button.setIcon(flag); ? ? ? ? ? ? ? ? ? ? ? ? data[r][w] -= 20; ? ? ? ? ? ? ? ? ? ? ? ? remainBomb --; ? ? ? ? ? ? ? ? ? ? ? ? remainArea --; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else { ? ? ? ? ? ? ? ? ? ? ? ? button.setIcon(null); ? ? ? ? ? ? ? ? ? ? ? ? data[r][w] += 20; ? ? ? ? ? ? ? ? ? ? ? ? remainBomb ++; ? ? ? ? ? ? ? ? ? ? ? ? remainArea ++; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? disabled = !disabled; ? ? ? ? ? ? ? ? ? ? bombLabel.setText("" + remainBomb); ? ? ? ? ? ? ? ? ? ? areaLabel.setText("" + remainArea); ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if(!disabled) ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? int cnt = 1; ? ? ? ? ? ? ? ? button.setVisible(false); ? ? ? ? ? ? ? ? if(data[r][w] == -1){ ? ? ? ? ? ? ? ? ? ? gameOver(); // ? ? ? ? ? ? ? ? ? ?System.out.println("\n點(diǎn)到炸彈,全體按鈕已禁用"); ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? LinkedList<int[]> stack = new LinkedList<>(); ? ? ? ? ? ? ? ? stack.push(new int[]{r,w}); ? ? ? ? ? ? ? ? data[r][w] = -1; ? ? ? ? ? ? ? ? while (stack.size() > 0){ ? ? ? ? ? ? ? ? ? ? int[] source = stack.pop(); ? ? ? ? ? ? ? ? ? ? for(int i = 0; i < 4; i ++){ ? ? ? ? ? ? ? ? ? ? ? ? int x = source[0] + x4[i]; ? ? ? ? ? ? ? ? ? ? ? ? int y = source[1] + y4[i]; ? ? ? ? ? ? ? ? ? ? ? ? if(x < 0 || x >= row || y < 0 || y >= column || data[x][y] < 0) ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? ? ? ? ? ? ? if(data[x][y] == 0) ? ? ? ? ? ? ? ? ? ? ? ? ? ? stack.push(new int[]{x,y}); ? ? ? ? ? ? ? ? ? ? ? ? labels[x][y].getLabelFor().setVisible(false); ? ? ? ? ? ? ? ? ? ? ? ? cnt ++; ? ? ? ? ? ? ? ? ? ? ? ? data[x][y] = -1; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? remainArea -= cnt; ? ? ? ? ? ? ? ? areaLabel.setText("" + remainArea); ? ? ? ? ? ? ? ? if(remainArea == remainBomb){ ? ? ? ? ? ? ? ? ? ? gameOver(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? private void gameOver(){ ? ? ? ? for(JLabel[] ls : labels){ ? ? ? ? ? ? for(JLabel l : ls){ ? ? ? ? ? ? ? ? JButton button = (JButton) l.getLabelFor(); ? ? ? ? ? ? ? ? button.setEnabled(false); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? private void init(){ ? ? ? ? setWidthAndHeight(); ? ? ? ? frame.setBounds(380,100,width + 9,height + 32); ? ? ? ? frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ? ? ? ? frame.setResizable(false); ? ? ? ? frame.setLayout(null); ? ? ? ? mainPanel.setBackground(Color.GRAY); ? ? ? ? mainPanel.setBounds(1,scoreHeight + 1,width,height); ? ? ? ? mainPanel.setLayout(null); ? ? ? ? scorePanel = new JPanel(); ? ? ? ? scorePanel.setBounds(0,0,width,scoreHeight); ? ? ? ? scorePanel.setLayout(new GridLayout(1,3,0,0)); ? ? ? ? areaLabel = new JLabel(); ? ? ? ? areaLabel.setFont(labelFont); ? ? ? ? areaLabel.setHorizontalAlignment(JLabel.CENTER); ? ? ? ? scorePanel.add(areaLabel); ? ? ? ? JLabel buttonLabel = new JLabel(); ? ? ? ? scorePanel.add(buttonLabel); ? ? ? ? JButton resetButton = new JButton("重開(kāi)"); ? ? ? ? resetButton.setFont(buttonFont); ? ? ? ? resetButton.setFocusPainted(false); ? ? ? ? resetButton.setBounds(width/ 24,10,width / 4,30); ? ? ? ? resetButton.addActionListener((event)->{ ? ? ? ? ? ? frame.setVisible(false); ? ? ? ? ? ? mainPanel.removeAll(); ? ? ? ? ? ? resetGame(); ? ? ? ? }); ? ? ? ? buttonLabel.add(resetButton); ? ? ? ? bombLabel = new JLabel(); ? ? ? ? bombLabel.setFont(labelFont); ? ? ? ? bombLabel.setHorizontalAlignment(JLabel.CENTER); ? ? ? ? scorePanel.add(bombLabel); ? ? ? ? frame.add(scorePanel); ? ? ? ? frame.add(mainPanel); ? ? ? ? resetGame(); ? ? } ? ? public void resetGame(){ ? ? ? ? setBomb(); ? ? ? ? remainArea = row * column; ? ? ? ? remainBomb = bombNum; ? ? ? ? labels = new JLabel[row][column]; ? ? ? ? System.gc(); ? ? ? ? for(int i = 0; i < row; i ++){ ? ? ? ? ? ? for(int j = 0; j < column; j ++){ ? ? ? ? ? ? ? ? labels[i][j] = new JLabel(); ? ? ? ? ? ? ? ? //設(shè)置元素居中 ? ? ? ? ? ? ? ? labels[i][j].setHorizontalAlignment(JLabel.CENTER); ? ? ? ? ? ? ? ? if(data[i][j] == -1) { ? ? ? ? ? ? ? ? ? ? labels[i][j].setIcon(bomb); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(data[i][j] > 0) ? ? ? ? ? ? ? ? ? ? labels[i][j].setText("" + data[i][j]); ? ? ? ? ? ? ? ? int y = (i + 1) * labelSpace + i * labelWeight; ? ? ? ? ? ? ? ? int x = (j + 1) * labelSpace + j * labelHeigth; ? ? ? ? ? ? ? ? labels[i][j].setBounds(x,y,labelWeight,labelHeigth); ? ? ? ? ? ? ? ? JButton button = new JButton(); ? ? ? ? ? ? ? ? button.addMouseListener(new ButtonListener(button,i,j,this)); ? ? ? ? ? ? ? ? button.setBounds(0,0,labelWeight,labelHeigth); ? ? ? ? ? ? ? ? labels[i][j].setLayout(null); ? ? ? ? ? ? ? ? labels[i][j].add(button); ? ? ? ? ? ? ? ? labels[i][j].setLabelFor(button); ? ? ? ? ? ? ? ? mainPanel.add(labels[i][j]); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? areaLabel.setText("" + remainArea); ? ? ? ? bombLabel.setText("" + remainBomb); ? ? ? ? frame.setVisible(true); ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)用Mysql存取圖片操作實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)用Mysql存取圖片操作實(shí)例,本文講解了使用BLOB類型保存和讀取圖片的代碼實(shí)例,需要的朋友可以參考下2015-06-06詳解java中的PropertyChangeSupport與PropertyChangeListener
這篇文章主要介紹了詳解java中的PropertyChangeSupport與PropertyChangeListener的相關(guān)資料,需要的朋友可以參考下2017-09-09CompletableFuture創(chuàng)建及功能使用全面詳解
這篇文章主要為大家介紹了CompletableFuture創(chuàng)建及功能使用全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07SpringBoot實(shí)現(xiàn)文件上傳下載功能小結(jié)
最近做的一個(gè)項(xiàng)目涉及到文件上傳與下載功能。SpringBoot后臺(tái)如何實(shí)現(xiàn)文件上傳下載呢?下面有單文件上傳和多文件上傳功能,感興趣的朋友一起看看吧2017-08-08Java利用自定義注解實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)
JSR303是一套JavaBean參數(shù)校驗(yàn)的標(biāo)準(zhǔn),它提供了一系列的校驗(yàn)方式,這些校驗(yàn)方式在javax.validation.constraints包中。本文就來(lái)聊聊如何利用它實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)2022-09-09基于Mybatis-plus實(shí)現(xiàn)多租戶架構(gòu)的全過(guò)程
多租戶是一種軟件架構(gòu)技術(shù),在多用戶的環(huán)境下,共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于基于Mybatis-plus實(shí)現(xiàn)多租戶架構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-02-02基于SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件過(guò)程解析
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06springboot整合vue2-uploader實(shí)現(xiàn)文件分片上傳、秒傳、斷點(diǎn)續(xù)傳功能
對(duì)于大文件的處理,無(wú)論是用戶端還是服務(wù)端,如果一次性進(jìn)行讀取發(fā)送、接收都是不可取,很容易導(dǎo)致內(nèi)存問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于springboot整合vue2-uploader實(shí)現(xiàn)文件分片上傳、秒傳、斷點(diǎn)續(xù)傳功能的相關(guān)資料,需要的朋友可以參考下2023-06-06