Java語(yǔ)言實(shí)現(xiàn)掃雷游戲(1)
Java類庫(kù)中提供了用于GUI的swing開發(fā)工具包,我們可以利用swing設(shè)計(jì)出一些簡(jiǎn)單的經(jīng)典小游戲,如掃雷,推箱子,俄羅斯方塊等.接下來(lái)我就簡(jiǎn)單分享一下用Java設(shè)計(jì)掃雷游戲的思路與過(guò)程.
首先,我們要設(shè)計(jì)出掃雷的窗口界面,說(shuō)白了,也就是在窗口上繪制出指定行數(shù)和列數(shù)的小方格.要在窗體上繪制方格,我們需要一個(gè)JPanel面板,所以我們定義類GamePanel讓它繼承自JPanel,然后我們?cè)诰涂梢赃@個(gè)類上繪制我們所要的信息了.然后,在類中,我們定義一些基本的變量,如行數(shù),列數(shù),雷的數(shù)量等等,方便后面使用
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GamePanel extends JPanel {
private static final long serialVersionUID = 1L;
// 界面行數(shù)
private int rows;
// 界面列數(shù)
private int cols;
// 炸彈數(shù)
private int bombCount;
// 每個(gè)方格寬度
private final int BLOCKWIDTH = 20;
// 每個(gè)方格長(zhǎng)度
private final int BLOCKHEIGHT = 20;
// 存儲(chǔ)界面中每一個(gè)方格的繪制信息
private JLabel[][] labels;
}
(JLabel標(biāo)簽用于短文本字符串或圖像或二者的顯示區(qū),我們用它來(lái)顯示方格邊界,數(shù)字,或者雷等信息)
接下來(lái)我們?cè)跇?gòu)造方法中初始化這些類變量
// 構(gòu)造方法,初始化參數(shù)
public GamePanel(int rows, int cols) {
this.rows = rows;
this.cols = cols;
this.bombCount = rows * cols / 10;
this.labels = new JLabel[rows][cols];
this.setLayout(null);
}
然后,我們就可以在這個(gè)JPanel面板上繪制小方格了.我們先創(chuàng)建一個(gè)名為initLabels()的方法,在這個(gè)方法中根據(jù)行數(shù)和列數(shù)循環(huán)產(chǎn)生JLabel標(biāo)簽,并將每個(gè)標(biāo)簽的邊界繪制出來(lái),填充背景并將它們存儲(chǔ)到類二維數(shù)組變量 labels中,這樣,我們就得到了一個(gè)充滿小方格的掃雷窗體
// 界面初始化,繪制掃雷的邊框
private void initLabels(){
for (int i = 0; i < this.rows; i++) {
for (int j = 0; j < this.cols; j++) {
JLabel l = new JLabel("", JLabel.CENTER);
// 設(shè)置每個(gè)小方格的邊界
l.setBounds(j * BLOCKWIDTH, i * BLOCKHEIGHT, BLOCKWIDTH, BLOCKHEIGHT);
// 繪制方格邊框
l.setBorder(BorderFactory.createLineBorder(Color.GRAY));
// 設(shè)置方格為透明,便于我們填充顏色
l.setOpaque(true);
// 背景填充為黃色
l.setBackground(Color.YELLOW);
// 將方格加入到容器中(即面板JPanel)
this.add(l);
// 將方格存到類變量中,方便公用
labels[i][j] = l;
}
}
}
然后在構(gòu)造方法中調(diào)用這個(gè)初始化方法
this.initLabels();// 寫在構(gòu)造方法中
當(dāng)我們將這個(gè)JPanel面板繪制完后,我們還要將它放在一個(gè)JFrame容器中它才能顯示出來(lái),這樣我們就需要將JPanel的大小作為參數(shù)傳出去,方便設(shè)置容器的大小,所以我們?cè)俣x一個(gè)public的方法,計(jì)算寬和高,并以數(shù)組的形式傳遞出去
//計(jì)算寬和高,并傳給容器
public int[] returnSize() {
// 因?yàn)榇绑w的菜單欄,邊框也要占用像素,所以加上20和40修正大小
int[] a = {this.cols * BLOCKWIDTH + 20, this.rows * BLOCKHEIGHT + 40};
return a;
}
最后創(chuàng)建一個(gè)Game類,在這個(gè)類中寫程序的主入口main,進(jìn)行仿真調(diào)試
import java.awt.Container;
import javax.swing.JFrame;
public class Game {
public static void main(String[] args) {
// 創(chuàng)建JFrame對(duì)象作為容器
JFrame w = new JFrame();
// 創(chuàng)建mainPanel對(duì)象,初始化一個(gè)20*30的方格窗體
GamePanel mainPanel = new GamePanel(20, 30);
// 獲取JFrame應(yīng)給設(shè)置的寬度和高度
int[] a = mainPanel.returnSize();
// 設(shè)置JFame寬和高
w.setSize(a[0], a[1]);
Container c = w.getContentPane();
c.add(mainPanel);
w.setVisible(true);
}
}
運(yùn)行程序,結(jié)果如下

這樣,我們第一階段的工作就完成了.接下來(lái),我們要在上面這個(gè)圖中產(chǎn)生bombCount個(gè)炸彈,也就是在我們生成的labels中隨機(jī)挑選出bombCount個(gè)炸彈,并用"*"顯示出來(lái)
// 產(chǎn)生bombCount個(gè)炸彈,并在labels中用"*"標(biāo)注出來(lái)
private void randomBomb() {
for (int i = 0; i < this.bombCount; i++) {
// 生成一個(gè)隨機(jī)數(shù)表示行坐標(biāo)
int rRow = (int) (Math.random() * this.rows);
// 生成一個(gè)隨機(jī)數(shù)表示列坐標(biāo)
int rCol = (int) (Math.random() * this.cols);
// 根據(jù)坐標(biāo)確定JLabel的位置,并顯示*
this.labels[rRow][rCol].setText("*");
// 設(shè)置背景顏色
this.labels[rRow][rCol].setBackground(Color.DARK_GRAY);
// 設(shè)置*的顏色
this.labels[rRow][rCol].setForeground(Color.RED);
}
}
然后我們?cè)趇nitLabels()方法中調(diào)用randomBomb()這個(gè)方法,運(yùn)行程序,顯示如下:

至此,我們已經(jīng)完成了掃雷游戲的一半程序,只剩下填充按鈕和點(diǎn)擊按鈕后發(fā)生的邏輯判斷了,這些將在下一篇文章中繼續(xù)分享
完整詳細(xì)代碼(已注釋好)已經(jīng)附在下一篇博客中,供交流和學(xué)習(xí),歡迎查閱 Java語(yǔ)言實(shí)現(xiàn)的掃雷游戲(二)
更多精彩游戲,請(qǐng)參考專題《java經(jīng)典小游戲》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別
在?Java?開發(fā)中,表達(dá)式語(yǔ)言是一種強(qiáng)大的工具,而SpEL?表達(dá)式與EL?表達(dá)式是我們常常遇到兩種表達(dá)式語(yǔ)言,下面我們就來(lái)看看它們的具體使用與區(qū)別吧2023-07-07
詳解Spring Aop實(shí)例之AspectJ注解配置
本篇文章主要介紹了詳解Spring Aop實(shí)例之AspectJ注解配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Java獲取e.printStackTrace()打印的信息方式
這篇文章主要介紹了Java獲取e.printStackTrace()打印的信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
深入剖析springBoot中的@Scheduled執(zhí)行原理
這篇文章主要介紹了springBoot中的@Scheduled執(zhí)行原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
九個(gè)動(dòng)畫組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表
數(shù)據(jù)結(jié)構(gòu)和算法是密不可分的,兩者往往是相輔相成的存在,所以在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)過(guò)程中,不免會(huì)遇到各種算法,數(shù)據(jù)結(jié)構(gòu)常用操作一般為:增刪改查?;旧纤械臄?shù)據(jù)結(jié)構(gòu)都是圍繞這幾個(gè)操作進(jìn)行展開,本文用九張動(dòng)圖來(lái)闡述先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)2021-08-08
Java中關(guān)于http請(qǐng)求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn)
這篇文章主要介紹了Java中關(guān)于http請(qǐng)求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn),本文僅僅介紹了使用http請(qǐng)求獲取FlexManager平臺(tái)某個(gè)FBox盒子即某設(shè)備的監(jiān)控點(diǎn)分組的分組下的所有監(jiān)控點(diǎn)信息,需要的朋友可以參考下2022-10-10
使用Spring Data JPA的坑點(diǎn)記錄總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于使用Spring Data JPA的一些坑點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
mybatis實(shí)現(xiàn)獲取入?yún)⑹荓ist和Map的取值
這篇文章主要介紹了mybatis實(shí)現(xiàn)獲取入?yún)⑹荓ist和Map的取值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

