亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? minepanel.java

?? 用java實現的全真模擬windows下的掃雷程序。不過目前實現以button方式實現。改進可以考慮以位圖形式實現
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/*
 * MinePanel.java 1.0 2003-6-15
 *
 * Copyleft (c) 2003 RatKing.
 */

package jmine;

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.*;

/**
 * 總面板,包括上側的笑臉按鈕面板和下側的雷區面板
 */
public class MinePanel extends JPanel implements MouseListener {
    private JMine jmine;

    public static final int ONE_SECOND = 1000;  // 1秒 = 1000毫秒

    public static final int LOW_LEVEL       = 0;  // 初級
    public static final int MIDDLE_LEVEL    = 1;  // 中級
    public static final int HIGH_LEVEL      = 2;  // 高級
    public static final int CUSTOM_LEVEL    = 3;  // 自定義...

    public static final int READY   = 0;  // 準備就緒
    public static final int PLAY    = 1;  // 開始游戲
    public static final int PAUSE   = 2;  // 暫停游戲
    public static final int WIN     = 3;  // 勝利結束
    public static final int LOSE    = 4;  // 失敗結束

    private int gameLevel   = LOW_LEVEL;  // 難度級別
    private int mineRows    = 0;  // 雷區高度
    private int mineColumns = 0;  // 雷區寬度
    private int totalMines  = 0;  // 地雷總數

    public boolean isMark   = true;  // 標記
    public boolean isColor  = true;  // 顏色
    public boolean isSound  = true;  // 聲音

    private int state = READY;  // 系統運行狀態

    /**
     * 是否鼠標中鍵按下
     * 當鼠標中鍵按下,或鼠標左右鍵同時按下時,為true
     * 當釋放了鼠標中鍵,或鼠標左右鍵同時按下后釋放任意一個,則為false
     */
    private boolean isMiddlePressed = false;

    /** 開始按鈕面板 */
    JPanel startPanel = new JPanel();
    /** 雷區面板 */
    JPanel mineField = new JPanel();

    GridLayout gridLayout = new GridLayout();
    Border raisedbevel = BorderFactory.createRaisedBevelBorder();
    Border loweredbevel = BorderFactory.createLoweredBevelBorder();
    Border margin1 = new EmptyBorder(6,6,6,6);
    Border margin2 = new EmptyBorder(4,6,4,6);
    BorderLayout borderLayout = new BorderLayout();

    public FaceButton faceButton;   // 笑臉按鈕
    public MineButton[][] mineButton;  // 雷區按鈕
    public Counter remainMines; // 剩余地雷數
    public Counter totalTime;   // 所用時間(秒數)
    public Timer timer;         // 計時器

    public MinePanel(JMine jmine) {
        this(jmine, LOW_LEVEL);
    }

    public MinePanel(JMine jmine, int gameLevel) {
        this.jmine = jmine;
        init();
        setGameLevel(gameLevel);
    }

    /** 面板初始化,組裝面板,制定布局與邊框 */
    public void init() {
        // 設置面板的邊框
        this.setBorder(new CompoundBorder(raisedbevel, margin1));
        startPanel.setBorder(new CompoundBorder(loweredbevel, margin2));
        mineField.setBorder(loweredbevel);

        // 設置面板的布局
        borderLayout.setVgap(6);  // 設置總面板中開始面板與地雷面板之間的間距
        this.setLayout(borderLayout);
        mineField.setLayout(gridLayout);
        startPanel.setLayout(new BoxLayout(startPanel, BoxLayout.X_AXIS));

        // 組裝開始按鈕
        faceButton = new FaceButton(jmine);
        remainMines = new Counter(jmine, totalMines);
        totalTime = new Counter(jmine, 0);
        totalTime.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                // 若按下中鍵,或同時按下鼠標左鍵和右鍵,則暫停計時
                if ((e.getButton() == MouseEvent.BUTTON2
                        || (e.getModifiersEx() & (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK))
                        == (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK))) {
                    if (timer.isRunning()) {
                        timer.stop();
                        //state = PAUSE;
                    }
                    else if (state == PLAY) {
                        timer.start();
                    }
                }
            }
        });

        startPanel.add(remainMines);
        startPanel.add(Box.createHorizontalGlue());
        startPanel.add(faceButton);
        startPanel.add(Box.createHorizontalGlue());
        startPanel.add(totalTime);
        faceButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                replay();
            }
        });

        // 定義時鐘及其事件處理方法
        timer = new Timer(ONE_SECOND, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
        	totalTime.increase();  // “計時器”每增加1秒,“所用時間”就也增加1秒
        	if (isSound) {
        	    Toolkit.getDefaultToolkit().beep();
        	}
            }
        });

        // 組裝總面板
        this.add(startPanel, BorderLayout.NORTH);
        this.add(mineField, BorderLayout.CENTER);
        this.addMouseListener(this);
    }  // init()

    public int getGameLevel() {
        return gameLevel;
    }

    public void setGameLevel(int gameLevel) {
        this.gameLevel = gameLevel;

        if (gameLevel == LOW_LEVEL) {
            reset(9, 9, 10);
        }
        else if (gameLevel == MIDDLE_LEVEL) {
            reset(16, 16, 40);
        }
        else if (gameLevel == HIGH_LEVEL) {
            reset(16, 30, 99);
        }
    }

    public void setGameLevel(int mineRows, int mineColumns, int totalMines) {
        gameLevel = CUSTOM_LEVEL;
        reset(mineRows, mineColumns, totalMines);
    }

    public void replay() {
        reset(mineRows, mineColumns, totalMines);

    }

    /**
     * 系統重置
     */
    private void reset(int mineRows, int mineColumns, int totalMines) {
        state = READY;
        timer.stop();

        remainMines.setNumber(totalMines);
        faceButton.setIconStyle(FaceButton.FACE_SMILE);
        totalTime.setNumber(0);

        // 是否雷區大小發生改變
        boolean isChanged = false;

        if (this.mineRows != mineRows
                || this.mineColumns != mineColumns
                || this.totalMines != totalMines) {
            isChanged = true;
            this.mineRows = mineRows;
            this.mineColumns = mineColumns;
            this.totalMines = totalMines;
        }

        if (isChanged) {
            // 清除雷區所有地雷按鈕
            mineField.removeAll();

            // 重置mineField面板中GridLayout布局的高度與寬度
            gridLayout.setRows(mineRows);       // 設置地雷的行數
            gridLayout.setColumns(mineColumns); // 設置地雷的列數

            // 生成地雷按鈕,并組裝到地雷面板中
            mineButton = new MineButton[mineRows][mineColumns];
            for (int i = 0; i < mineRows; i++) {
                for (int j = 0; j < mineColumns; j++) {
                    mineButton[i][j] = new MineButton(jmine, i, j);
                    mineButton[i][j].addMouseListener(this);
                    mineField.add(mineButton[i][j]);
                }
            }
        }

        // 重置所有地雷按鈕為初始狀態
        for (int i = 0; i < mineRows; i++) {
            for (int j = 0; j < mineColumns; j++) {
                mineButton[i][j].setMine(false);
                mineButton[i][j].setIconStyle(MineButton.ICON_NULL);
            }
        }

        // 隨機分布地雷
        Random random = new Random();
        int k = 0;
        while (k < totalMines) {
            int r = random.nextInt(mineRows);
            int c = random.nextInt(mineColumns);
            if (!mineButton[r][c].isMine()) {
                mineButton[r][c].setMine(true);
                k++;
            }
        }
        validate();  // 使改動生效
    }

    public int getMineRows() {
        return mineRows;
    }

    public void setMineRows(int mineRows) {
        this.mineRows = mineRows;
    }

    public int getMineColumns() {
        return mineColumns;
    }

    public void setMineColumns(int mineColumns) {
        this.mineColumns = mineColumns;
    }

    public int getTotalMines() {
        return totalMines;
    }

    public void setTotalMines(int totalMines) {
        this.totalMines = totalMines;
    }

    // 定義鼠標事件處理方法
    public void mouseClicked(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        if (state != READY && state != PLAY)
            return;

        faceButton.setIconStyle(FaceButton.FACE_O);
        Object object = e.getSource();
        if (!(object instanceof MineButton))
            return;




        int button = e.getButton();
        int modifiers = e.getModifiers();
        int modifiersEx = e.getModifiersEx();

        MineButton mb = (MineButton) object;

        // 按鈕呈凹下的樣子
        if (mb.getIconStyle() == MineButton.ICON_NULL
                || mb.getIconStyle() == MineButton.ICON_MARK) {
            mb.setBorderDown();
        }

        // 若僅按下鼠標右鍵,且左鍵未按下
        if (button == MouseEvent.BUTTON3
                && (modifiersEx & InputEvent.BUTTON1_DOWN_MASK)
                != InputEvent.BUTTON1_DOWN_MASK) {
            // 處理插上小紅旗過程
            if (mb.getIconStyle() == MineButton.ICON_NULL) {
                mb.setIconStyle(MineButton.ICON_FLAG);
                remainMines.decrease();
                if (checkWinning()) {
                    doWin();
                }
            }
            else if (mb.getIconStyle() == MineButton.ICON_FLAG) {
                if (isMark) {
                    mb.setIconStyle(MineButton.ICON_MARK);
                }
                else {
                    mb.setIconStyle(MineButton.ICON_NULL);
                }
                remainMines.increase();
            }
            else if (mb.getIconStyle() == MineButton.ICON_MARK) {
                mb.setIconStyle(MineButton.ICON_NULL);
            }
            return;
        }

        // 若按下中鍵,或同時按下鼠標左鍵和右鍵
        if (button == MouseEvent.BUTTON2
                || (modifiersEx & (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK))
                == (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK)) {
            isMiddlePressed = true;
            doDownAround(mb);
        }
    }

    public void mouseReleased(MouseEvent e) {
        if (state != READY && state != PLAY)
            return;

        faceButton.setIconStyle(FaceButton.FACE_SMILE);
        Object object = e.getSource();
        if (!(object instanceof MineButton))
            return;
        MineButton mb = (MineButton) object;

        int button = e.getButton();
        int modifiers = e.getModifiers();
        int modifiersEx = e.getModifiersEx();

        // 如果在地雷按鈕外部釋放鼠標,則把該鼠標釋放事件傳輸到鼠標所在的按鈕
        if (!mb.contains(e.getX(), e.getY())) {
            int x = e.getX();
            int y = e.getY();
            int width = mb.getSize().width;
            int height = mb.getSize().height;
            int row = mb.getRow();
            int column = mb.getColumn();

            //System.out.println("Debug: row = " + row + ", column = " + column + ", e = " + e);
            if (y > 0)
                row += y / height;
            else
                row -= -y / height + 1;
            if (x > 0)
                column += x / width;
            else
                column -= -x / width + 1;

            if (row >= 0 && column >= 0 && row < mineRows && column < mineColumns) {
                //System.out.println("Debug2: row = " + row + ", column = " + column
                //        + ", e = " + SwingUtilities.convertMouseEvent(mb, e, mineButton[row][column]));
                mineButton[row][column].dispatchEvent(SwingUtilities.convertMouseEvent(mb, e, mineButton[row][column]));
            }

            return;
        }

        // 若釋放了左鍵,且此時右鍵未按下
        if (button == MouseEvent.BUTTON1 && !isMiddlePressed
                && ((modifiersEx & InputEvent.BUTTON3_DOWN_MASK) != InputEvent.BUTTON3_DOWN_MASK)) {
            treadMineButton(mb);
        }
        // 若釋放了中鍵,或釋放了左右鍵同時按下后的任何一個
        if (isMiddlePressed || button == MouseEvent.BUTTON2
                || (button == MouseEvent.BUTTON1
                && (modifiersEx & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
                || (button == MouseEvent.BUTTON3
                && (modifiersEx & InputEvent.BUTTON1_DOWN_MASK) == InputEvent.BUTTON1_DOWN_MASK)) {
            isMiddlePressed = false;
            doDoubleDownReleased(mb);
        }

    }

    public void mouseEntered(MouseEvent e) {
        if (state != READY && state != PLAY)
            return;

        Object object = e.getSource();
        int modifiersEx = e.getModifiersEx();

        if (!(object instanceof MineButton))
            return;
        MineButton mb = (MineButton) object;

        // 若按下了鼠標左鍵、或中鍵,或同時按下了左右鍵
        if ((modifiersEx & InputEvent.BUTTON1_DOWN_MASK) == InputEvent.BUTTON1_DOWN_MASK
                || (modifiersEx & InputEvent.BUTTON2_DOWN_MASK) == InputEvent.BUTTON2_DOWN_MASK
                || (modifiersEx & (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK))
                == (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK)) {
            // 按鈕呈凹下的樣子
            if (mb.getIconStyle() == MineButton.ICON_NULL
                    || mb.getIconStyle() == MineButton.ICON_MARK) {
                mb.setBorderDown();
            }
        }

        // 若按下了鼠標中鍵,或同時按下了鼠標左鍵和右鍵
        if ((modifiersEx & InputEvent.BUTTON2_DOWN_MASK) == InputEvent.BUTTON2_DOWN_MASK
                ||(modifiersEx & (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK))
                == (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK)) {
            // 周圍按鈕呈凹下的樣子
            doDownAround(mb);
        }
    }

    public void mouseExited(MouseEvent e) {
        if (state != READY && state != PLAY)
            return;

        Object object = e.getSource();
        int modifiersEx = e.getModifiersEx();

        if (!(object instanceof MineButton))
            return;
        MineButton mb = (MineButton) object;
        // 按鈕呈凸出的樣子
        if (mb.getIconStyle() == MineButton.ICON_NULL
                || mb.getIconStyle() == MineButton.ICON_MARK) {
            mb.setBorderUp();
        }

        // 若按下了鼠標中鍵,或同時按下了鼠標左鍵和右鍵
        if ((modifiersEx & InputEvent.BUTTON2_DOWN_MASK) == InputEvent.BUTTON2_DOWN_MASK
                ||(modifiersEx & (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK))
                == (InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK)) {
            // 周圍按鈕呈凸出的樣子
            doUpAround(mb);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费观看视频一区| 亚洲va天堂va国产va久| 欧美电影影音先锋| 日本乱人伦aⅴ精品| 日本精品一区二区三区高清| 91日韩在线专区| 91日韩在线专区| 91国偷自产一区二区使用方法| 99久久99久久免费精品蜜臀| 色婷婷久久久久swag精品 | 欧美激情一区二区三区不卡| 日韩欧美高清在线| 日韩一区二区三区四区| 久久久噜噜噜久久人人看| 制服丝袜在线91| 欧美在线短视频| 日韩一区二区免费在线电影 | 国产精品123区| 成人综合婷婷国产精品久久蜜臀| 国产凹凸在线观看一区二区| 97精品久久久久中文字幕| 欧美色国产精品| 欧美精品1区2区3区| 久久九九久久九九| 亚洲精品国产无套在线观| 午夜视频久久久久久| 狠狠色狠狠色综合系列| 成人av动漫在线| 欧美美女视频在线观看| 日韩精品一区二区三区视频播放 | 国产精品888| 色综合久久中文综合久久97| 6080日韩午夜伦伦午夜伦| 国产色婷婷亚洲99精品小说| 亚洲黄色av一区| 国产伦精品一区二区三区在线观看| 成人亚洲一区二区一| 欧美日韩在线一区二区| 久久久久99精品国产片| 亚洲成av人片| av一本久道久久综合久久鬼色| 欧美日韩成人一区二区| 国产精品三级av| 久久99国产精品久久| 色综合久久六月婷婷中文字幕| 日韩免费电影一区| 亚洲妇女屁股眼交7| 成人av片在线观看| 欧美精品一区二区三区四区| 伊人婷婷欧美激情| 高清不卡在线观看av| 日韩精品一区二区三区视频| 亚洲国产成人tv| 91蜜桃婷婷狠狠久久综合9色| 久久九九99视频| 极品少妇xxxx偷拍精品少妇| 欧美猛男超大videosgay| 成人免费一区二区三区视频| 国产一区二区三区精品欧美日韩一区二区三区| 91黄视频在线| 亚洲欧美一区二区三区孕妇| 国产成人免费视频网站高清观看视频| 欧美一二区视频| 日韩vs国产vs欧美| 欧美精品久久久久久久久老牛影院| 日韩理论在线观看| 91久久免费观看| 国产精品国产自产拍高清av| 国产一区二区精品久久99| 精品欧美乱码久久久久久| 日韩成人dvd| 日韩情涩欧美日韩视频| 毛片av一区二区| 欧美电影免费观看高清完整版在 | 另类人妖一区二区av| 欧美日韩极品在线观看一区| 亚洲成av人在线观看| 欧美四级电影在线观看| 亚洲成精国产精品女| 欧美精品日韩一本| 美腿丝袜在线亚洲一区| 欧美大片在线观看| 国产乱一区二区| 欧美经典一区二区三区| 成人黄色一级视频| 一区二区三区日本| 欧美精选午夜久久久乱码6080| 日韩不卡免费视频| 2020国产精品| 91丝袜国产在线播放| 亚洲一区二区三区影院| 91精品国产综合久久福利软件 | 日本亚洲电影天堂| 日韩欧美色综合| 成人h精品动漫一区二区三区| 亚洲欧美在线视频观看| 欧美日韩国产另类不卡| 国产永久精品大片wwwapp| 国产精品国产三级国产有无不卡| 在线免费视频一区二区| 蜜桃av一区二区| 国产精品久久久久久久久免费桃花 | 日本不卡一区二区三区高清视频| 日韩一卡二卡三卡四卡| 国产成人福利片| 性做久久久久久免费观看| 精品国产一区二区三区四区四| 国产成人精品在线看| 亚洲国产精品尤物yw在线观看| 精品乱人伦一区二区三区| 色综合久久久久| 国产在线国偷精品产拍免费yy| 亚洲精品久久久蜜桃| 久久夜色精品一区| 91国偷自产一区二区开放时间| 国产福利精品一区| 日韩成人精品在线| 一区二区激情视频| 国产午夜精品久久久久久久| 日韩欧美一区在线| 色欧美乱欧美15图片| 国产aⅴ综合色| 美腿丝袜亚洲色图| 亚洲精品乱码久久久久久久久| 精品欧美一区二区久久 | 日韩免费观看高清完整版在线观看| 成人一区二区三区视频在线观看 | 蜜臀久久99精品久久久久久9| 中文字幕亚洲综合久久菠萝蜜| 欧美一区二区三区的| 日本韩国精品在线| 99这里只有久久精品视频| 国内精品视频一区二区三区八戒| 亚洲va国产va欧美va观看| 亚洲色图色小说| 中文字幕欧美三区| 精品播放一区二区| 日韩欧美自拍偷拍| 91精品蜜臀在线一区尤物| 欧洲一区在线电影| 色呦呦一区二区三区| 99久久免费视频.com| 99久久精品免费看国产免费软件| 国产一区二区视频在线| 韩国在线一区二区| 狠狠网亚洲精品| 狠狠色丁香九九婷婷综合五月| 青草国产精品久久久久久| 天天av天天翘天天综合网| 亚洲成人av福利| 日本最新不卡在线| 久久精品国产网站| 精品一区二区三区欧美| 国产专区欧美精品| 国产激情视频一区二区三区欧美 | 日韩欧美一区二区免费| 91麻豆精品国产91久久久| 日韩写真欧美这视频| 欧美成人激情免费网| 国产亚洲一二三区| 国产精品成人免费精品自在线观看| 中文字幕一区av| 亚洲一区二区三区四区在线观看 | 韩国精品主播一区二区在线观看 | 日韩一卡二卡三卡国产欧美| 日韩精品一区二| 国产精品视频一二三| 亚洲色大成网站www久久九九| 夜夜夜精品看看| 看片的网站亚洲| 成人精品亚洲人成在线| 色婷婷精品大视频在线蜜桃视频 | 欧美另类z0zxhd电影| 欧美男人的天堂一二区| 日韩美女一区二区三区四区| 欧美激情综合网| 亚洲午夜久久久久中文字幕久| 石原莉奈一区二区三区在线观看 | 中文字幕精品一区二区三区精品| 亚洲欧洲美洲综合色网| 亚洲国产精品久久久久秋霞影院 | 国产成人激情av| 在线视频国产一区| 欧美成人bangbros| 中文字幕一区日韩精品欧美| 天天综合网天天综合色| 成人毛片视频在线观看| 欧美男人的天堂一二区| 国产精品入口麻豆九色| 日韩精品91亚洲二区在线观看| 国产激情一区二区三区四区| 欧美视频一区二区三区| 国产区在线观看成人精品 | 99在线视频精品| 日韩亚洲欧美成人一区| 中文字幕av一区二区三区高| 日韩综合一区二区| 99久久久国产精品| 久久久精品中文字幕麻豆发布| 亚洲综合视频在线观看|