<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了Java Swing實現掃雷原始碼的具體程式碼,供大家參考,具體內容如下
先來看下效果
執行時只需要建立一個GameWindow的物件即可,可使用有參建構函式自定義雷區行列數及炸彈個數,也可使用無參建構函式設定預設值(小旗和炸彈的圖示自己去找吧,我就不在這裡放了)
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; public class GameWindow{ private static Font labelFont = new Font("隸書",Font.BOLD,45); private static Font buttonFont = new Font("隸書",Font.CENTER_BASELINE,20); private static Icon flag = new ImageIcon("src/images/小旗.jpg");//小旗圖示 private static Icon bomb = new ImageIcon("src/images/炸彈.png");//炸彈圖示 private static int labelWeight = 30;//小方塊(雷區)寬度 private static int labelHeigth = 30;//小方塊(雷區)高度 private static int labelSpace = 1;//小方塊(雷區)間距 private static int scoreHeight = 50;//積分割區域高度 private static int[] x8 = {-1,-1,-1,0,0,1,1,1};//原座標周圍 8 個座標的 x 值變化 private static int[] y8 = {-1,0,1,-1,1,-1,0,1};//原座標周圍 8 個座標的 y 值變化 private static int[] x4 = {0,0,1,-1};//原座標周圍 4 個座標的 x 值變化 private static int[] y4 = {1,-1,0,0};//原座標周圍 4 個座標的 x 值變化 private JFrame frame; private int[][] data;//儲存和炸彈位置有關資料,值為-1時表示炸彈 private JLabel[][] labels; private JPanel mainPanel;//雷區主面板 private JPanel scorePanel;//積分割區域面板 private JLabel areaLabel;//未掃雷區個數標籤 private JLabel bombLabel;//剩餘地雷數標籤 private int width;//表單寬度 private int height;//表單高度 private int row;//行數 private int column;//列數 private int bombNum;//炸彈個數 private int remainArea;//未掃雷區個數 private int remainBomb;//剩餘地雷數 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("炸彈數設定過多!"); 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點到炸彈,全體按鈕已禁用"); 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("重開"); 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(); //設定元素居中 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); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45