日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于Java的Windows扫雷游戏的设计与实现

發(fā)布時間:2024/3/26 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Java的Windows扫雷游戏的设计与实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目 錄
摘 要 i
Abstract ii
1 緒論 1
1.1 課題背景及意義 1
1.2 開發(fā)工具的選用及介紹 1
1.3 選題目的和意義 2
1.4 本文主要研究的內(nèi)容 2
2 需求分析 3
2.1 可行性分析 3
2.2 掃雷游戲功能描述 3
2.3 掃雷游戲用例圖 4
2.4 掃雷游戲功能需求 4
2.5 掃雷游戲界面需求 5
2.6 掃雷游戲功能模塊 6
3 游戲的概要分析與設(shè)計 7
3.1 設(shè)計構(gòu)想 7
3.2 流程規(guī)劃 8
3.3 界面規(guī)劃 9
3.4 算法思想 9
4 游戲的詳細(xì)設(shè)計 11
4.1 游戲初始化 11
4.2 雷區(qū)的布置 12
4.3 游戲中主要模塊的介紹與使用 13
4.3.1 鼠標(biāo)事件 13
4.3.2 地雷及雷區(qū)表面探測情況 14
4.3.3 清除未靠近地雷的格子 15
4.3.4 游戲難度的選擇 16
4.3.5 菜單欄的功能 16
4.4 游戲的判斷 16
4.4.1 游戲成功完成 16
4.4.2 游戲失敗 16
4.5 類設(shè)計 17
4.5.1 MineGame類 17
4.5.2 Block類 18
4.5.3 BlockView類 19
4.5.4 Record類 20
4.5.5 ShowRecord類 21
4.5.6 MineArea類 22
4.5.7 LayMines類 23
5 游戲?qū)崿F(xiàn) 25
5.1 游戲難度自定義 25
5.2 掃雷 28
5.2.1 玩家通過右鍵進(jìn)行掃雷,并顯示小紅旗 28
5.2.2 玩家因觸碰到雷而導(dǎo)致游戲結(jié)束 29
5.2.3 玩家掃雷成功 29
5.2.4 玩家游戲數(shù)據(jù)顯示 30
5.3 程序打包發(fā)布過程 32
6 游戲測試結(jié)果 33
6.1 游戲難度自定義測試 33
6.2 掃雷測試 35
6.3 玩家游戲數(shù)據(jù)顯示測試 37
6.4 游戲數(shù)據(jù)顯示區(qū)測試 39
6.5 遞歸算法測試 43
結(jié) 論 44
參考文獻(xiàn) 45
致 謝 47
外文原文 48
中文翻譯 55
1.4本文主要研究的內(nèi)容
掃雷游戲風(fēng)靡全球,受到很多人的喜愛。我研究了這個掃雷游戲之后,發(fā)現(xiàn)有兩個關(guān)鍵點(diǎn):
第一點(diǎn)是鼠標(biāo)事件的處理,包括鼠標(biāo)點(diǎn)擊菜單項(xiàng)中按鈕的事件,點(diǎn)擊雷區(qū)中任意一格的事件,點(diǎn)擊界面上按鈕的事件等。
第二點(diǎn)是初始化雷區(qū),包括隨機(jī)生成雷的位置,界面的初始化,計算周圍雷數(shù)等。
具體要求如下:
(1)掃雷游戲分為三種難度,分別是初、中、高級,點(diǎn)擊游戲左上角的“游戲”菜單后會出現(xiàn)“初級”、“中級”、“高級”三種選項(xiàng)。除此之外玩家還可以自定義難度。
(2)在玩家選擇難度之后游戲?qū)淖兘缑娲笮?#xff0c;并改變雷的總數(shù)。當(dāng)玩家點(diǎn)開第一個格子時雷區(qū)開始布雷同時計時開始。
(3)若玩家想放棄本局游戲并重新開始的話,可以通過點(diǎn)擊掃雷信息統(tǒng)計區(qū)中的按鈕,來結(jié)束當(dāng)前的游戲并開始新的游戲。
(4)當(dāng)玩家認(rèn)為某個格沒有雷,可以直接用鼠標(biāo)單擊這個格或者把鼠標(biāo)放在該格子上按下空格鍵。如果玩家的判斷是正確的,則會顯示周圍8個格子中地雷的總數(shù),如果玩家判斷錯誤,該格子下藏著雷的話,游戲就好結(jié)束,系統(tǒng)自動彈框提示玩家失敗。
(5)若玩家認(rèn)為某個格下有雷,在該格子上鼠標(biāo)右鍵就可以標(biāo)記一個玩家認(rèn)為該格是雷的圖標(biāo),也就是在格子上標(biāo)記一個小紅旗的圖案。玩家每標(biāo)記一個紅旗(不管玩家的判斷正確與否),界面上的計數(shù)區(qū)都會把雷數(shù)減一。
(6)當(dāng)所有的雷都標(biāo)記正確后,游戲會自動彈框顯示“您真厲害,請輸入您的名字,記錄上榜!”。
(7)若玩家在游戲過程中單擊了有雷的格子,游戲失敗并且記時停止,游戲會將剩余的雷全部顯示出來,自動彈框顯示“你輸了,請繼續(xù)努力!”,之后玩家可以開始一局新的游戲。
(8)如果玩家不清楚游戲玩法,可以點(diǎn)擊菜單欄上的幫助來獲取游戲玩法及游戲竅門。
(9)對于自定義難度,系統(tǒng)會有一個閾值,行數(shù)在9到16之間,列數(shù)在9到30之間,地雷數(shù)在10到99之間。如果玩家設(shè)置的值超過該閾值,系統(tǒng)會自動將超過的數(shù)值變成閾值。
2.4掃雷游戲功能需求
本次掃雷設(shè)計需要實(shí)現(xiàn)的主要功能有:

(1)玩家可以選擇合適的游戲難度

點(diǎn)擊游戲界面左上角菜單欄中的“游戲”菜單,會出現(xiàn)出現(xiàn)“初級”、“中級”、“高級”、“自定義”四種選項(xiàng)。在玩家選擇難度之后游戲?qū)淖兘缑娉叽?#xff0c;并改變雷的總數(shù)。前三種雷數(shù)和尺寸都是固定的,無需玩家設(shè)置,而自定義則是玩家自己定義的。

(2)進(jìn)行掃雷游戲

游戲界面包括菜單欄,游戲數(shù)據(jù)顯示區(qū)域以及雷區(qū),當(dāng)玩家點(diǎn)擊雷區(qū)中的任意一格的時候游戲開始,雷區(qū)開始隨機(jī)布雷,玩家需要在最短的時間內(nèi)找出雷區(qū)中所有的地雷,并加以標(biāo)識。

掃雷的基本操作包括鼠標(biāo)左鍵單擊和右鍵單擊兩種。其中左鍵用來點(diǎn)開玩家認(rèn)為不是雷的格子,右鍵標(biāo)記玩家認(rèn)為是雷的格子。

左鍵單擊:玩家在判斷出該格子下沒有雷時單擊該格子,可以將該格子點(diǎn)開。如果該格子周圍有雷就會顯示周圍雷的數(shù)目(由于周圍最多只有8個格子,所以最多只能顯示8);如果格子上什么也不顯示(也就是為空),系統(tǒng)就會自動調(diào)用遞歸的方法打開附近的格子。如果點(diǎn)到了有地雷的格子,那么游戲結(jié)束,系統(tǒng)顯示所有雷的位置。

右鍵單擊:玩家可以通過使用鼠標(biāo)右鍵單擊來標(biāo)記自己認(rèn)為是雷的格子,通過標(biāo)記可以有效的提高掃雷游戲的效率。本文轉(zhuǎn)載自http://www.biyezuopin.vip/onews.asp?id=11244再次右擊該格子可以取消標(biāo)記,且格子被標(biāo)記的時候鼠標(biāo)單擊無效(防止玩家誤操作導(dǎo)致游戲失敗)。

(3)游戲計時

當(dāng)點(diǎn)擊雷區(qū)任意一個格子的時候雷區(qū)開始布雷同時計時開始,計時標(biāo)準(zhǔn)是一秒增加1。如果游戲失敗時,則計時停止。如果玩家開始了新游戲,計時也會重新開始。

(4)標(biāo)記地雷

當(dāng)玩家認(rèn)為格子下有雷時可以右擊格子來標(biāo)記該格子,被標(biāo)記的格子顯示小紅旗。再次右擊可以取消標(biāo)記,且格子被標(biāo)記的時候鼠標(biāo)單擊無效(防止玩家誤操作導(dǎo)致游戲失敗)。如果玩家標(biāo)識的地雷的數(shù)量超過了該難度下規(guī)定的雷數(shù),計數(shù)區(qū)會以負(fù)數(shù)來顯示超過的雷數(shù)并且游戲不會結(jié)束。

(5)統(tǒng)計功能

當(dāng)玩家游戲勝利后會彈框提示并可以輸入玩家的名字,確認(rèn)后本次游戲的記錄會被保存。玩家可以點(diǎn)擊菜單欄上的“游戲”菜單,再點(diǎn)擊其中的“掃雷榜”即可查看游戲的最佳記錄。

(6)退出

點(diǎn)擊關(guān)閉按鈕可以結(jié)束游戲。

package cn.itbaizhan.mine;import java.awt.*; import java.awt.event.*; import javax.swing.*;public class MineArea extends JPanel implements ActionListener, MouseListener {JButton reStart;Block[][] block;BlockView[][] blockView;LayMines lay;int row, colum, mineCount, markMount;// 雷區(qū)的行數(shù)、列數(shù)以及地雷個數(shù)和用戶給出的標(biāo)記數(shù)ImageIcon mark;int grade; // 初、中、高級JPanel pCenter, pNorth;JTextField showTime, showMarkedMineCount; // 顯示用時以及標(biāo)記數(shù)Timer time; // 計時器int spendTime = 0;Record record;JDialog lose = new JDialog();JPanel panel;JLabel str; JButton restart1 = new JButton("重新開始");JButton cancel = new JButton("取消");public MineArea(int row, int colum, int mineCount, int grade) {reStart = new JButton("重新開始");mark = new ImageIcon("mark.png"); // 探雷標(biāo)記time = new Timer(1000, this);showTime = new JTextField(5);showMarkedMineCount = new JTextField(5);showTime.setHorizontalAlignment(JTextField.CENTER);showTime.setFont(new Font("Arial", Font.BOLD, 16));showTime.setDisabledTextColor(java.awt.Color.black); // 設(shè)置字體顏色showTime.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray));// 設(shè)置邊框顏色showTime.setEnabled(false);// 設(shè)置不能響應(yīng)用戶輸入showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setFont(new Font("Arial", Font.BOLD, 16));showMarkedMineCount.setDisabledTextColor(java.awt.Color.black);showMarkedMineCount.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray));showMarkedMineCount.setEnabled(false);pCenter = new JPanel();pNorth = new JPanel();lay = new LayMines();initMineArea(row, colum, mineCount, grade); // 初始化雷區(qū),見下面的LayMines()reStart.addActionListener(this);pNorth.add(showMarkedMineCount);pNorth.add(reStart);pNorth.add(showTime);setLayout(new BorderLayout());add(pNorth, BorderLayout.NORTH);add(pCenter, BorderLayout.CENTER);}public void initMineArea(int row, int colum, int mineCount, int grade) {pCenter.removeAll();spendTime = 0;markMount = mineCount;this.row = row;this.colum = colum;this.mineCount = mineCount;this.grade = grade;block = new Block[row][colum];for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++)block[i][j] = new Block();}//lay.layMinesForBlock(block, mineCount);blockView = new BlockView[row][colum];pCenter.setLayout(new GridLayout(row, colum));for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++) {blockView[i][j] = new BlockView();//blockView[i][j].giveView(block[i][j]); // 給block[i][j]提供視圖pCenter.add(blockView[i][j]);blockView[i][j].getBlockCover().addActionListener(this);blockView[i][j].getBlockCover().addMouseListener(this);blockView[i][j].seeBlockCover();blockView[i][j].getBlockCover().setEnabled(true);blockView[i][j].getBlockCover().setIcon(null);}}showMarkedMineCount.setText("" + markMount);validate();}public void initMine(int m, int n){lay.layMinesForBlock(block, mineCount, m, n);for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++) {blockView[i][j].giveView(block[i][j]);}}}public void setRow(int row) {this.row = row;}public void setColum(int colum) {this.colum = colum;}public void setMineCount(int mineCount) {this.mineCount = mineCount;}public void setGrade(int grade) {this.grade = grade;}public void actionPerformed(ActionEvent e) {if (e.getSource() == restart1) {initMineArea(row, colum, mineCount, grade);lose.dispose();return;}if (e.getSource() == cancel){lose.dispose();return;}int temp = 0;if (e.getSource() != reStart && e.getSource() != time) {time.start();int m = -1, n = -1;for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++) {if(block[i][j].getIsMine() == true)temp = -1;if (e.getSource() == blockView[i][j].getBlockCover()) {m = i;n = j;}}}if(temp == 0)initMine(m, n);if (block[m][n].getIsMine()) {for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++) {blockView[i][j].getBlockCover().setEnabled(false);if (block[i][j].getIsMine())blockView[i][j].seeBlockNameOrIcon();}}panel = new JPanel();panel.setLayout(new FlowLayout());str = new JLabel("你輸了哦!", JLabel.CENTER);//restart1 = new JButton("重新開始");restart1.addActionListener(this);//cancel = new JButton("取消");cancel.addActionListener(this);lose.setTitle("輸了");lose.setBounds(300,100,200,150);lose.setResizable(false);lose.setVisible(false);lose.setModal(true);time.stop();spendTime = 0;markMount = mineCount;lose.add(str, BorderLayout.CENTER);panel.add(restart1);panel.add(cancel);lose.add(panel, BorderLayout.SOUTH);lose.setVisible(true);} else {show(m, n); // 見本類后面的show方法}}if (e.getSource() == reStart) {initMineArea(row, colum, mineCount, grade);}if (e.getSource() == time) {spendTime++;showTime.setText("" + spendTime);}inquireWin();}public void show(int m, int n) {if (block[m][n].getAroundMineNumber() > 0 && block[m][n].getIsOpen() == false) {blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);return;} else if (block[m][n].getAroundMineNumber() == 0 && block[m][n].getIsOpen() == false) {blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);for (int k = Math.max(m - 1, 0); k <= Math.min(m + 1, row - 1); k++) {for (int t = Math.max(n - 1, 0); t <= Math.min(n + 1, colum - 1); t++)show(k, t);}}}public void mousePressed(MouseEvent e) {JButton source = (JButton) e.getSource();for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++) {if (e.getModifiers() == InputEvent.BUTTON3_MASK && source == blockView[i][j].getBlockCover()) {if (block[i][j].getIsMark()) {source.setIcon(null);block[i][j].setIsMark(false);markMount = markMount + 1;showMarkedMineCount.setText("" + markMount);} else {source.setIcon(mark);block[i][j].setIsMark(true);markMount = markMount - 1;showMarkedMineCount.setText("" + markMount);}}}}}public void inquireWin() {int number = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < colum; j++) {if (block[i][j].getIsOpen() == false)number++;}}if (number == mineCount) {time.stop();record = new Record();switch (grade) {case 1:record.setGrade("初級");break;case 2:record.setGrade("中級");break;case 3:record.setGrade("高級");break;}record.setTime(spendTime);record.setVisible(true);}}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {} }
















總結(jié)

以上是生活随笔為你收集整理的基于Java的Windows扫雷游戏的设计与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。