java實現(xiàn)簡單掃雷小游戲
本文實例為大家分享了java實現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class SaoLei implements MouseListener,ActionListener{
JPanel p=new JPanel();
JFrame frame = new JFrame("掃雷");
@SuppressWarnings("rawtypes")
JComboBox combobox = new JComboBox();
JButton reset = new JButton("重新開始");
Container container = new Container();
//游戲數(shù)據(jù)結(jié)構(gòu)
SaoLeiConstant constant = new SaoLeiConstant();
JButton[][] buttons = new JButton[constant.row][constant.col];//定義按鈕
int[][] counts = new int [constant.row][constant.col];//定義整型數(shù)組保存按鈕下方雷數(shù)
//創(chuàng)建構(gòu)造方法
public SaoLei() {
//顯示窗口
frame.setSize(600,700);//600*700
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
//添加重來、選擇難度按鈕
addtopButton();
//添加雷區(qū)按鈕
addButtons();
//埋雷
addLei();
//添加雷的計數(shù)
calcNeiboLei();
frame.setVisible(true);
}
void addtopButton() {
p.removeAll();
p.add(reset);
reset.setBackground(Color.green);
reset.setOpaque(true);
reset.addActionListener(this);
//combobox.addItem("選擇難度");
combobox.addItem("新手難度");
combobox.addItem("初級難度");
combobox.addItem("中級難度");
combobox.addItem("高級難度");
combobox.addItem("大師難度");
combobox.setBackground(Color.GREEN);
combobox.setOpaque(true);
combobox.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
String item = e.getItem().toString();
if(item == "新手難度") {
constant.leiCount = 20;
ResetGame();
} else if(item == "初級難度") {
constant.leiCount = 43;
ResetGame();
} else if(item == "中級難度"){
constant.leiCount = 63;
ResetGame();
} else if(item == "高級難度"){
constant.leiCount = 99;
ResetGame();
} else if(item == "大師難度") {
constant.leiCount = 119;
ResetGame();
}
}
});
p.add(combobox);
frame.add(p,BorderLayout.NORTH);
//p.add(new Label("總雷數(shù):"+constant.leiCount,Label.CENTER));
//p.add(new Label("總雷數(shù):"+constant.leiCount,Label.RIGHT));
}
/*
void addnanduButton() {
nandu.setBackground(Color.green);
nandu.setOpaque(true);
nandu.addActionListener(this);
frame.add(nandu,BorderLayout.WEST);
}
void addResetButton() {
reset.setBackground(Color.green);
reset.setOpaque(true);
reset.addActionListener(this);
//reset.addMouseListener(this);
frame.add(reset,BorderLayout.NORTH);
}
*/
void addLei() {
Random rand = new Random();
int randRow,randCol;
for(int i=0; i<constant.leiCount; i++) {
randRow = rand.nextInt(constant.row);
randCol = rand.nextInt(constant.col);
if(counts[randRow][randCol] == constant.LEICODE) {
i--;
} else {
counts[randRow][randCol] = constant.LEICODE;
//buttons[randRow][randCol].setText("X");
}
}
}
void addButtons() {
frame.add(container,BorderLayout.CENTER);
container.setLayout(new GridLayout(constant.row,constant.col));
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
JButton button = new JButton();
button.setBackground(Color.white);
button.setOpaque(true);
button.addActionListener(this);
button.addMouseListener((MouseListener) this);
buttons[i][j] = button;
container.add(button);
}
}
}
void calcNeiboLei() {
int count;
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
count =0;
if(counts[i][j] == constant.LEICODE) continue;
if(i>0 && j>0 && counts[i-1][j-1] == constant.LEICODE) count++;
if(i>0 && counts[i-1][j] == constant.LEICODE) count++;
if(i>0 && j<19 &&counts[i-1][j+1] == constant.LEICODE) count++;
if(j>0 && counts[i][j-1] == constant.LEICODE) count++;
if(j<19 && counts[i][j+1] == constant.LEICODE) count++;
if(i<19 && j>0 && counts[i+1][j-1] == constant.LEICODE) count++;
if(i<19 && counts[i+1][j] == constant.LEICODE) count++;
if(i<19 && j<19 && counts[i+1][j+1] == constant.LEICODE) count++;
counts[i][j] = count;
buttons[i][j].setMargin(new Insets(0,0,0,0));//讓按鈕隨按鈕上的圖案變化
//buttons[i][j].setText(counts[i][j] + "");
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
if(button.equals(reset)) {
ResetGame();//重新開始游戲
} else {
int count = 0;
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
if(button.equals(buttons[i][j])) {
count = counts[i][j];
if(count == constant.LEICODE) {
loseGame();
} else {
openCell(i,j);
checkWin();
}
return;
}
}
}
}
}
public void mouseClicked(MouseEvent e) {
JButton button = (JButton)e.getSource();
if (e.getButton() == MouseEvent.BUTTON3) {//判斷鼠標(biāo)右擊動作
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
if(button.equals(buttons[i][j])) {
if((buttons[i][j].isEnabled() == true)) {
//buttons[i][j].setEnabled(false);
buttons[i][j].setMargin(new Insets(0,0,0,0));//讓按鈕隨按鈕上的圖案變化
buttons[i][j].setText("?");
return;
}
}
}
}
}
}
void ResetGame() {
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
buttons[i][j].setText("");
buttons[i][j].setEnabled(true);
buttons[i][j].setBackground(Color.white);
counts[i][j] = 0;
}
}
addLei();
calcNeiboLei();
}
void checkWin() {
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
if(buttons[i][j].isEnabled() == true && counts[i][j] != constant.LEICODE ) return;
}
}
JOptionPane.showMessageDialog(frame,"Yeah,你贏了!");
}
//使用遞歸方法打開格子
void openCell(int i, int j) {
if(buttons[i][j].isEnabled() == false) return;
buttons[i][j].setBackground(Color.yellow);
buttons[i][j].setOpaque(true);
buttons[i][j].setEnabled(false);
if(counts[i][j] == 0) {
if(i>0 && j>0 && counts[i-1][j-1] != constant.LEICODE) openCell(i-1,j-1);
if(i>0 && j<19 && counts[i-1][j] != constant.LEICODE) openCell(i-1,j);
if(i>0 && j<19 &&counts[i-1][j+1] != constant.LEICODE) openCell(i-1,j+1);
if(j>0 && counts[i][j-1] != constant.LEICODE) openCell(i,j-1);
if(j<19 && counts[i][j+1] != constant.LEICODE) openCell(i,j+1);
if(i<19 && j>0 && counts[i+1][j-1] != constant.LEICODE) openCell(i+1,j-1);
if(i<19 && counts[i+1][j] != constant.LEICODE) openCell(i+1,j);
if(i<19 && j<19 && counts[i+1][j+1] != constant.LEICODE) openCell(i+1,j+1);
} else {
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[i][j].setText(counts[i][j] + "");
}
}
void loseGame() {
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
int count = counts[i][j];
if(count == constant.LEICODE) {
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[i][j].setText("雷");
buttons[i][j].setBackground(Color.red);
buttons[i][j].setEnabled(false);
} else {
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[i][j].setText(count + "");
buttons[i][j].setEnabled(false);
}
}
}
JOptionPane.showMessageDialog(frame,"error,你輸了!");
}
public static void main(String[] args) {
new SaoLei();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
常量類
public class SaoLeiConstant {
final int row = 20;//行數(shù)30
final int col = 20;//列數(shù)30
final int LEICODE = 10;//定義雷下方的數(shù)字
protected int temp = 20;
protected int leiCount = temp;//雷數(shù)30
}
效果圖

更多精彩游戲,請參考專題《java經(jīng)典小游戲》
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計模式之模板方法模式Template Method Pattern詳解
在我們實際開發(fā)中,如果一個方法極其復(fù)雜時,如果我們將所有的邏輯寫在一個方法中,那維護(hù)起來就很困難,要替換某些步驟時都要重新寫,這樣代碼的擴(kuò)展性就很差,當(dāng)遇到這種情況就要考慮今天的主角——模板方法模式2022-11-11
Java?IO及BufferedReader.readline()出現(xiàn)的Bug
這篇文章主要介紹了Java?IO及BufferedReader.readline()出現(xiàn)的Bug,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot 整合 Shiro 密碼登錄與郵件驗證碼登錄功能(多 Realm 認(rèn)證)
這篇文章主要介紹了SpringBoot 整合 Shiro 密碼登錄與郵件驗證碼登錄(多 Realm 認(rèn)證),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
劍指Offer之Java算法習(xí)題精講二叉搜索樹與數(shù)組查找
跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03
關(guān)于idea的gitignore文件編寫及解決ignore文件不生效問題
這篇文章主要介紹了idea的gitignore文件編寫及解決ignore文件不生效問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
SpringBoot參數(shù)校驗Validator框架詳解
Validator框架就是為了解決開發(fā)人員在開發(fā)的時候少寫代碼,提升開發(fā)效率,Validator專門用來進(jìn)行接口參數(shù)校驗,今天通過本文給大家介紹SpringBoot參數(shù)校驗Validator框架,感興趣的朋友一起看看吧2022-06-06
SpringBoot通過@Value實現(xiàn)給靜態(tài)變量注入值詳解
這篇文章主要介紹了springboot如何通過@Value給靜態(tài)變量注入值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

