重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
這些東西早忘光了說下我的理解希望可以幫助你把。
10多年的南崗網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整南崗建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“南崗網(wǎng)站設(shè)計(jì)”,“南崗網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
你先想好用什么來做,java swing里面做這個(gè)的,我記得這個(gè)東西可以直接用button來做的。
這些button形成一個(gè)矩形,用一個(gè)數(shù)組來記錄每個(gè)位置,比如point (x,y)這種。
用一個(gè)map來存放每個(gè)位置上button的狀態(tài),比如用0表示是雷,1不是。2是已經(jīng)顯示空白的區(qū)域,最后可能就是map((x,y),1);這種。
然后基本就是一些邏輯問題了,比如隨機(jī)地雷位置(設(shè)置3里面隨機(jī)數(shù)設(shè)置多少個(gè)是01).怎么右鍵點(diǎn)擊顯示周圍雷個(gè)數(shù),這些都是不少工作。
我能想到的就這些,畢竟過了很久了,你現(xiàn)在要是上學(xué)的話就抓緊寫這個(gè)東西,我感覺你有了思路查資料的話一個(gè)禮拜差不多也就能看得出能不能做出來,不能做出來在找源碼學(xué)吧,這些東西自己先做一遍和看源碼在學(xué)習(xí)效果差挺多。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main
{
public static void main(String[] argus)
{
Landmine Zhang = new Landmine();
}
}
//
// Landmine類 主界面
class Landmine extends JFrame
{
static Resources resources = new Resources();
Playing listener = new Playing(this); //主要監(jiān)聽者,監(jiān)聽地雷面板的動(dòng)作
Help helpListener = new Help(this); //輔助監(jiān)聽者,監(jiān)聽“幫助”、“關(guān)于”
JPanel landminePanel = new JPanel(); //創(chuàng)建地雷面板
JPanel topPanel = new JPanel(); //創(chuàng)建頂部面板
JPanel lowerPanel = new JPanel(); //創(chuàng)建底部面板
public static MyButton [][] lei; //主區(qū)按鈕組
public static int numberOfUnflaged ; //剩余的雷數(shù),顯示在topPanel上,用于提示用戶
public static int numberOfClicked; //已經(jīng)翻開的格子數(shù),當(dāng)數(shù)字?jǐn)?shù)字到"總格子數(shù)—雷數(shù)"時(shí),即勝利
public static int usedTime; //已用時(shí)間
public static JLabel numberOfUnflagedLabel = new JLabel(); //創(chuàng)建剩雷數(shù)標(biāo)簽
public static JLabel timeLabel = new JLabel();//創(chuàng)建時(shí)間標(biāo)簽
public static Timer timer; //創(chuàng)建計(jì)時(shí)
Keylistener keyListener = new Keylistener(this);
public Landmine()
{
super("掃雷__1.2版__小老頭"); //標(biāo)題
setBounds(300,90,800,800); //設(shè)置窗口位置和大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//最大化、最小化、關(guān)閉按鈕
BorderLayout ff = new BorderLayout(); //創(chuàng)建布局管理器
setLayout(ff); //關(guān)聯(lián)布局管理器
setResizable(false); //禁止改變窗口大小
/*初始化一些數(shù)據(jù)*/
numberOfClicked = 0;
numberOfUnflaged = 40;
usedTime = 0;
/*設(shè)置頂部面板*/
numberOfUnflagedLabel.setText("剩余雷數(shù):"+numberOfUnflaged);//顯示剩余雷數(shù)
numberOfUnflagedLabel.setFont(resources.fontOne);//設(shè)置剩雷數(shù)標(biāo)簽字體
numberOfUnflagedLabel.setIcon(resources.bombIconForLabel);//剩雷數(shù)標(biāo)簽圖標(biāo)(地雷形)
topPanel.add(numberOfUnflagedLabel); //剩雷數(shù)標(biāo)簽加入topPanel
timeLabel.setText("用時(shí):" + usedTime); //顯示剩余時(shí)間
timeLabel.setFont(resources.fontOne); //設(shè)置時(shí)間標(biāo)簽字體
timeLabel.setIcon(resources.clockIcon); //設(shè)置時(shí)間標(biāo)簽圖標(biāo)
topPanel.add(timeLabel); //時(shí)間標(biāo)簽加入topPanel
add(topPanel,BorderLayout.NORTH); //加入主面板上部
timer = new Timer(1000,new TimerListener());//計(jì)算器注冊監(jiān)聽者
/*設(shè)置底部面板*/
JButton aboutJB = new JButton("關(guān)于"); //創(chuàng)建“關(guān)于”按鈕
JButton helpJB = new JButton("求救"); //創(chuàng)建“求救”按鈕
helpJB.addActionListener(helpListener); //"求救"按鈕加入監(jiān)聽者
aboutJB.addActionListener(helpListener);//"關(guān)于"按鈕加入監(jiān)聽者
helpJB.addKeyListener(keyListener);
aboutJB.addKeyListener(keyListener); //注冊按鍵監(jiān)聽
lowerPanel.add(aboutJB); //“關(guān)于”按鈕加入lowerPanel
lowerPanel.add(helpJB); //“幫助”按鈕加入lowerPanel
add(lowerPanel,BorderLayout.SOUTH);
/*設(shè)置地雷面板*/
GridLayout dd = new GridLayout(16,16);
landminePanel.setLayout(dd); //布局管理
lei = new MyButton[18][18];
for(int i=0; i18; ++i)
{//創(chuàng)建下標(biāo)0—17的按鈕,18*18矩陣
for(int j=0; j18; ++j)
{
lei[i][j] = new MyButton(i,j);
}
}
for(int i=1; i17; ++i)
{//將下標(biāo)1-16的按鈕,加入面板、設(shè)置圖標(biāo)、翻開標(biāo)記為假、加入監(jiān)聽者
for(int j=1; j17; ++j)
{
landminePanel.add(lei[i][j]); //按鈕加入地雷面板
lei[i][j].setIcon(resources.smallIcon); //設(shè)置按鈕圖標(biāo)
lei[i][j].isClicked = false; //翻開標(biāo)記設(shè)置為 假lei[i][j].setIcon(dead);
lei[i][j].addActionListener(listener); //加入監(jiān)聽者
lei[i][j].addMouseListener(listener); //加入鼠標(biāo)事件監(jiān)聽者
lei[i][j].addKeyListener(keyListener); //按鈕注冊按鍵監(jiān)聽,當(dāng)焦點(diǎn)在按鈕上是能監(jiān)聽按鍵
}
}
add(landminePanel,BorderLayout.CENTER); //landminePanel加入主框架中央
addLandmine(); //布雷
timer.start(); //啟動(dòng)計(jì)時(shí)器
setVisible(true);//顯示之
}
/*布雷*/
public static void addLandmine()
{//隨機(jī)將40的按鈕的是否為雷的標(biāo)記isBomb設(shè)為真
for(int count = 0; count40; /*blank*/)
{
int i = (int)(Math.random()*100 % 16 +1 ) ;
int j = (int)(Math.random()*100 % 16 +1 ) ;
if(lei[i][j].isBomb == false)
{
lei[i][j].isBomb = true;
count++;
}
}
}
class TimerListener implements ActionListener
{//內(nèi)部類,時(shí)間監(jiān)聽
public void actionPerformed(ActionEvent e)
{
usedTime++;
timeLabel.setText("用時(shí):" + usedTime);
}
}
}
//
// Playing類 執(zhí)行主要游戲操作
class Playing implements ActionListener,MouseListener
{
static Resources resources = new Resources();
public static Landmine gui;
public Playing(Landmine in )
{
gui = in;
}
public void actionPerformed(ActionEvent event)
{
MyButton receive = (MyButton)event.getSource();
if(receive.isBomb)
{//如果翻到了雷。。
for(int i=1; i17; ++i)
{//將所有的雷圖標(biāo)設(shè)為 “地雷”
for(int j=1; j17; ++j)
{
if(gui.lei[i][j].isBomb)
gui.lei[i][j].setIcon(resources.bombIcon);
}
}
receive.setIcon(resources.deadIcon);//將踩到的地雷圖標(biāo)設(shè)為 “衰”
gui.timer.stop(); //停止計(jì)時(shí)器
JOptionPane.showMessageDialog(null,"小朋友,你掛了…","失敗!",
JOptionPane.INFORMATION_MESSAGE,
resources.deadIcon);//提示失敗
int yourChose = JOptionPane.showConfirmDialog(null,"你可能是一不小心點(diǎn)錯(cuò)了,再來一局?" );
if(yourChose == JOptionPane.OK_OPTION)
{//點(diǎn)擊“是”時(shí)
replay();
}
else
{//點(diǎn)擊 “否” 或 “取消” 時(shí)退出程序
System.exit(0);
}
}
else if(receive.isClicked ==false)
{//未翻到雷
showBombNumber(receive);
}
}
public static void showBombNumber(MyButton in)
{//翻開點(diǎn)擊的按鈕
int numberOfLandmine = 0;//記錄雷的個(gè)數(shù)
in.isClicked = true; //翻開標(biāo)記設(shè)為真
/*檢測周圍8個(gè)方塊是否為雷*/
if(gui.lei[in.num_x-1][in.num_y-1].isBomb == true) numberOfLandmine++;//左上
if(gui.lei[in.num_x][in.num_y-1].isBomb == true) numberOfLandmine++; //上
if(gui.lei[in.num_x+1][in.num_y-1].isBomb == true) numberOfLandmine++;//右上
if(gui.lei[in.num_x+1][in.num_y].isBomb == true) numberOfLandmine++; //右
if(gui.lei[in.num_x+1][in.num_y+1].isBomb == true) numberOfLandmine++;//右下
if(gui.lei[in.num_x][in.num_y+1].isBomb == true) numberOfLandmine++; //下
if(gui.lei[in.num_x-1][in.num_y+1].isBomb == true) numberOfLandmine++;//左下
if(gui.lei[in.num_x-1][in.num_y].isBomb == true) numberOfLandmine++; //左
in.setIcon(new ImageIcon("images/"+numberOfLandmine+".png"));//根據(jù)周圍的雷數(shù)顯示數(shù)字圖標(biāo)
gui.numberOfClicked++;//翻開格子數(shù)+1
if(gui.numberOfClicked==216)
{//翻開216個(gè)格子時(shí)游戲成功,用戶選擇是否再來一局
int yourChoice = JOptionPane.showConfirmDialog(null,"恭喜你成功了!再來一盤嗎?");
if(yourChoice == JOptionPane.OK_OPTION)
replay();
else
System.exit(0);
}
if(numberOfLandmine==0)
{//如果周圍無雷,則將周圍未翻開格子的全部翻開
if(gui.lei[in.num_x-1][in.num_y-1].isClicked == false)
showBombNumber(gui.lei[in.num_x-1][in.num_y-1]);
if(gui.lei[in.num_x][in.num_y-1].isClicked == false)
showBombNumber(gui.lei[in.num_x][in.num_y-1]);
if(gui.lei[in.num_x+1][in.num_y-1].isClicked == false)
showBombNumber(gui.lei[in.num_x+1][in.num_y-1]);
if(gui.lei[in.num_x+1][in.num_y].isClicked == false)
showBombNumber(gui.lei[in.num_x+1][in.num_y]);
if(gui.lei[in.num_x+1][in.num_y+1].isClicked == false)
showBombNumber(gui.lei[in.num_x+1][in.num_y+1]);
if(gui.lei[in.num_x][in.num_y+1].isClicked == false)
showBombNumber(gui.lei[in.num_x][in.num_y+1]);
if(gui.lei[in.num_x-1][in.num_y+1].isClicked == false)
showBombNumber(gui.lei[in.num_x-1][in.num_y+1]);
if(gui.lei[in.num_x-1][in.num_y].isClicked == false)
showBombNumber(gui.lei[in.num_x-1][in.num_y]);
}
}
public static void replay()
{//重新開始
gui.dispose(); //釋放框架資源
gui.timer.stop(); //終止計(jì)時(shí)器
Landmine ff = new Landmine();//重新創(chuàng)建一個(gè)主類的實(shí)例
//這幾條語句實(shí)現(xiàn)了重新開始————關(guān)閉上一個(gè)窗口,重新開啟一個(gè)
//但是這種方法會(huì)造成內(nèi)存的浪費(fèi),一個(gè)改進(jìn)的方法是不關(guān)閉當(dāng)年窗口,而是將當(dāng)前窗口重新初始化
}
public void mousePressed(MouseEvent e)
{//當(dāng)鼠標(biāo)右鍵點(diǎn)擊時(shí)自動(dòng)調(diào)用此函數(shù)
int mods = e.getModifiers();
MyButton receive = (MyButton)e.getSource();
if((mods InputEvent.BUTTON3_MASK) != 0)
{//鼠標(biāo)右鍵
if(receive.isClicked == false)
{
receive.isRight = receive.isRight ? false : true;//改變r(jià)eceive.isRight的值
if(receive.isRight)
{//如果添加標(biāo)記,則剩余雷數(shù)-1,設(shè)置標(biāo)簽為“旗幟”
gui.numberOfUnflaged--;
receive.setIcon(resources.flagIcon);
}
else
{//如果清除標(biāo)記,則剩余雷數(shù)+1,設(shè)置標(biāo)簽為“未翻開”
gui.numberOfUnflaged++;
receive.setIcon(resources.smallIcon);
}
gui.numberOfUnflagedLabel.setText("剩余雷數(shù):"+gui.numberOfUnflaged);
//更新剩余雷數(shù)標(biāo)簽
}
}
}
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
}
//
// Help類,響應(yīng)“關(guān)于”、“求救”
class Help implements ActionListener
{
static Resources resources = new Resources();
public static Landmine gui;
public Help(Landmine in)
{
gui = in ;
}
public void actionPerformed(ActionEvent event)
{
if(event.getActionCommand()=="關(guān)于")
JOptionPane.showMessageDialog(null,"掃雷1.2版。。小老頭出品");
if(event.getActionCommand()=="求救")
help();
}
public static void help()
{//求救
int stopNumber = (int)(Math.random() * gui.numberOfUnflaged + 1 );
int count = 0;
for(int i=1; i17;++i )
{
for(int j=1; j17; ++j)
{
if( gui.lei[i][j].isBomb !gui.lei[i][j].isClicked !gui.lei[i][j].isRight )
{
count++;
}
if(count == stopNumber)
{
gui.lei[i][j].setIcon(resources.badIcon);
return;
}
}
}
}
}
//
// Keylistener類,響應(yīng)鍵盤事件
class Keylistener implements KeyListener
{
static Resources resources = new Resources();
Landmine gui;
public Keylistener(Landmine in)
{
gui = in;
}
public void keyPressed(KeyEvent e)
{//有鍵按下時(shí)自動(dòng)執(zhí)行該方法
if(e.getKeyCode() == KeyEvent.VK_UP)
{//按鍵為 向上 時(shí),將所有未標(biāo)記的地雷顯示出
for(int i=1; i17; ++i)
{
for(int j=1; j17; ++j)
{
if(gui.lei[i][j].isBomb !gui.lei[i][j].isRight)
gui.lei[i][j].setIcon(resources.badIcon);
}
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN)
{//按鍵為 向下 時(shí),將所有未標(biāo)記的地雷恢復(fù)為未點(diǎn)擊的圖標(biāo)
for(int i=1; i17; ++i)
{
for(int j=1; j17; ++j)
{
if(gui.lei[i][j].isBomb !gui.lei[i][j].isRight)
gui.lei[i][j].setIcon(resources.smallIcon);
}
}
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
}
//
// 按鈕類 MyBtton
class MyButton extends JButton
{
public int num_x,num_y; //第幾號(hào)方塊
public boolean isBomb; //是否為雷
public boolean isClicked; //是否被點(diǎn)擊
public int BombFlag; //探雷標(biāo)記
public boolean isRight; //是否點(diǎn)擊右鍵
public MyButton(int x, int y)
{
BombFlag = 0;
num_x = x;
num_y = y;
isBomb = false;
isClicked = true;
isRight = false;
}
}
//
// 資源類 其他類中用到的圖標(biāo),字體等
class Resources
{
public static ImageIcon deadIcon;
public static ImageIcon smallIcon;
public static ImageIcon clockIcon;
public static ImageIcon bombIcon;
public static ImageIcon flagIcon;
public static ImageIcon badIcon;
public static ImageIcon bombIconForLabel;
public static Font fontOne;
public Resources()
{
deadIcon = new ImageIcon("images/dead.gif");
smallIcon = new ImageIcon("images/smallIcon.png");
clockIcon = new ImageIcon("images/clock2.png");
bombIcon = new ImageIcon("images/bomb.png");
flagIcon = new ImageIcon("images/flag_2.png");
badIcon = new ImageIcon("images/bad.gif");
bombIconForLabel = new ImageIcon("images/bombForLabel.gif");
fontOne = new Font("null",Font.BOLD,20);
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Frame
extends JFrame {
JTextField text;
JLabel nowBomb, setBomb;
int BombNum, BlockNum; // 當(dāng)前雷數(shù),當(dāng)前方塊數(shù)
int rightBomb, restBomb, restBlock; // 找到的地雷數(shù),剩余雷數(shù),剩余方塊數(shù)
JButton start = new JButton(" 開始 ");
JPanel MenuPamel = new JPanel();
JPanel bombPanel = new JPanel();
Bomb[][] bombButton;
JPanel c;
BorderLayout borderLayout1 = new BorderLayout();
GridLayout gridLayout1 = new GridLayout();
public Frame() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}
catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
c = (JPanel) getContentPane();
setTitle("掃雷");
c.setBackground(Color.WHITE);
MenuPamel.setBackground(Color.GRAY);
c.setLayout(borderLayout1);
setSize(new Dimension(600, 600));
setResizable(false);
BlockNum = 144;
BombNum = 10;
text = new JTextField("10 ", 3);
nowBomb = new JLabel("當(dāng)前雷數(shù)" + ":" + BombNum);
setBomb = new JLabel("設(shè)置地雷數(shù)");
start.addActionListener(new Frame1_start_actionAdapter(this));
MenuPamel.add(setBomb);
MenuPamel.add(text);
MenuPamel.add(start);
MenuPamel.add(nowBomb);
c.add(MenuPamel, java.awt.BorderLayout.SOUTH);
bombPanel.setLayout(gridLayout1);
gridLayout1.setColumns( (int) Math.sqrt(BlockNum));
gridLayout1.setRows( (int) Math.sqrt(BlockNum));
bombButton = new Bomb[ (int) Math.sqrt(BlockNum)][ (int) Math.sqrt(BlockNum)];
for (int i = 0; i (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j (int) Math.sqrt(BlockNum); j++) {
bombButton[i][j] = new Bomb(i, j);
//bombButton[i][j].setSize(10, 10);
bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//設(shè)置字體大小
bombButton[i][j].setForeground(Color.white);
bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this));
bombButton[i][j].addActionListener(new Bomb_actionAdapter(this));
bombPanel.add(bombButton[i][j]);
}
}
c.add(bombPanel, java.awt.BorderLayout.CENTER);
startBomb();
}
/* 開始按鈕 */
public void start_actionPerformed(ActionEvent e) {
int num=Integer.parseInt(text.getText().trim());
if (num = 5 num 50) {
BombNum = num;
startBomb();
}
else if (num 5) {
JOptionPane.showMessageDialog(null, "您設(shè)置的地雷數(shù)太少了,請重設(shè)!", "錯(cuò)誤",
JOptionPane.ERROR_MESSAGE);
num=10;
BombNum = num;
}
else {
JOptionPane.showMessageDialog(null, "您設(shè)置的地雷數(shù)太多了,請重設(shè)!", "錯(cuò)誤",
JOptionPane.ERROR_MESSAGE);
num=10;
BombNum = num;
}
}
/* 開始,布雷 */
public void startBomb() {
nowBomb.setText("當(dāng)前雷數(shù)" + ":" + BombNum);
for (int i = 0; i (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j (int) Math.sqrt(BlockNum); j++) {
bombButton[i][j].isBomb = false;
bombButton[i][j].isClicked = false;
bombButton[i][j].isRight = false;
bombButton[i][j].BombFlag = 0;
bombButton[i][j].BombRoundCount = 9;
bombButton[i][j].setEnabled(true);
bombButton[i][j].setText("");
bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//設(shè)置字體大小
bombButton[i][j].setForeground(Color.BLUE);
rightBomb = 0;
restBomb = BombNum;
restBlock = BlockNum - BombNum;
}
}
for (int i = 0; i BombNum; ) {
int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));
int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));
if (bombButton[x][y].isBomb != true) {
bombButton[x][y].isBomb = true;
i++;
}
}
CountRoundBomb();
}
/* 計(jì)算方塊周圍雷數(shù) */
public void CountRoundBomb() {
for (int i = 0; i (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j (int) Math.sqrt(BlockNum); j++) {
int count = 0;
// 當(dāng)需要檢測的單元格本身無地雷的情況下,統(tǒng)計(jì)周圍的地雷個(gè)數(shù)
if (bombButton[i][j].isBomb != true) {
for (int x = i - 1; x i + 2; x++) {
for (int y = j - 1; y j + 2; y++) {
if ( (x = 0) (y = 0)
(x ( (int) Math.sqrt(BlockNum)))
(y ( (int) Math.sqrt(BlockNum)))) {
if (bombButton[x][y].isBomb == true) {
count++;
}
}
}
}
bombButton[i][j].BombRoundCount = count;
}
}
}
}
/* 是否挖完了所有的雷 */
public void isWin() {
restBlock = BlockNum - BombNum;
for (int i = 0; i (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j (int) Math.sqrt(BlockNum); j++) {
if (bombButton[i][j].isClicked == true) {
restBlock--;
}
}
}
if (rightBomb == BombNum || restBlock == 0) {
JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您勝利了!", "勝利",
JOptionPane.INFORMATION_MESSAGE);
startBomb();
}
}
/** 當(dāng)選中的位置為空,則翻開周圍的地圖* */
public void isNull(Bomb ClickedButton) {
int i, j;
i = ClickedButton.num_x;
j = ClickedButton.num_y;
for (int x = i - 1; x i + 2; x++) {
for (int y = j - 1; y j + 2; y++) {
if ( ( (x != i) || (y != j)) (x = 0) (y = 0)
(x ( (int) Math.sqrt(BlockNum)))
(y ( (int) Math.sqrt(BlockNum)))) {
if (bombButton[x][y].isBomb == false
bombButton[x][y].isClicked == false
bombButton[x][y].isRight == false) {
turn(bombButton[x][y]);
}
}
}
}
}
/* 翻開 */
public void turn(Bomb ClickedButton) {
ClickedButton.setEnabled(false);
ClickedButton.isClicked = true;
if (ClickedButton.BombRoundCount 0) {
ClickedButton.setText(ClickedButton.BombRoundCount + "");
}
else {
isNull(ClickedButton);
}
}
/* 左鍵點(diǎn)擊 */
public void actionPerformed(ActionEvent e) {
if ( ( (Bomb) e.getSource()).isClicked == false
( (Bomb) e.getSource()).isRight == false) {
if ( ( (Bomb) e.getSource()).isBomb == false) {
turn( ( (Bomb) e.getSource()));
isWin();
}
else {
for (int i = 0; i (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j (int) Math.sqrt(BlockNum); j++) {
if (bombButton[i][j].isBomb == true) {
bombButton[i][j].setText("b");
}
}
}
( (Bomb) e.getSource()).setForeground(Color.RED);
( (Bomb) e.getSource()).setFont(new Font("", Font.BOLD, 20));
( (Bomb) e.getSource()).setText("X");
JOptionPane.showMessageDialog(this, "你踩到地雷了,按確定重來", "踩到地雷", 2);
startBomb();
}
}
}
/* 右鍵點(diǎn)擊 */
public void mouseClicked(MouseEvent e) {
Bomb bombSource = (Bomb) e.getSource();
boolean right = SwingUtilities.isRightMouseButton(e);
if ( (right == true) (bombSource.isClicked == false)) {
bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;
if (bombSource.BombFlag == 1) {
if (restBomb 0) {
bombSource.setForeground(Color.RED);
bombSource.setText("F");
bombSource.isRight = true;
restBomb--;
}
else {
bombSource.BombFlag = 0;
}
}
else if (bombSource.BombFlag == 2) {
restBomb++;
bombSource.setText("Q");
bombSource.isRight = false;
}
else {
bombSource.setText("");
}
if (bombSource.isBomb == true) {
if (bombSource.BombFlag == 1) {
rightBomb++;
}
else if (bombSource.BombFlag == 2) {
rightBomb--;
}
}
nowBomb.setText("當(dāng)前雷數(shù)" + ":" + restBomb);
isWin();
}
}
public static void main(String[] args) {
Frame frame = new Frame();
frame.setVisible(true);
}
}
class Frame1_start_actionAdapter
implements ActionListener {
private Frame adaptee;
Frame1_start_actionAdapter(Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.start_actionPerformed(e);
}
}
////////////////////////////
class Bomb
extends JButton {
int num_x, num_y; // 第幾號(hào)方塊
int BombRoundCount; // 周圍雷數(shù)
boolean isBomb; // 是否為雷
boolean isClicked; // 是否被點(diǎn)擊
int BombFlag; // 探雷標(biāo)記
boolean isRight; // 是否點(diǎn)擊右鍵
public Bomb(int x, int y) {
num_x = x;
num_y = y;
BombFlag = 0;
BombRoundCount = 9;
isBomb = false;
isClicked = false;
isRight = false;
}
}
class Bomb_actionAdapter
implements ActionListener {
private Frame adaptee;
Bomb_actionAdapter(Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.actionPerformed(e);
}
}
class Bomb_mouseAdapter
extends MouseAdapter {
private Frame adaptee;
Bomb_mouseAdapter(Frame adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.mouseClicked(e);
}
}
掃雷游戲的算法概述:
你可以把地雷所在的區(qū)域抽象成一個(gè)二維數(shù)組。數(shù)組里的元素是該地周圍的雷數(shù)。然后根據(jù)玩家所設(shè)定的地雷個(gè)數(shù)用一個(gè)隨機(jī)數(shù)生成器來撒雷。有雷的地方可以用-1來表示,沒有雷的地方在撒雷的時(shí)候數(shù)它旁邊的雷數(shù),然后將值填入對應(yīng)的數(shù)組元素里。這樣,你的雷陣已經(jīng)部署完畢。
接下來是玩家的操作了。如果你有仔細(xì)觀察的話,當(dāng)你點(diǎn)擊一個(gè)位置的是后發(fā)生的情況有3種:
1. 如果該處有雷的話,很簡單,游戲結(jié)束
2. 如果該處沒有雷,但是這個(gè)地方附近有至少一個(gè)雷的話,只將當(dāng)前的位置周圍雷數(shù)顯示出來。
3. 如果該處沒有雷,并且附近也沒有雷的話,就用一個(gè)循環(huán)或是遞歸的方法將它四周的沒有雷的地方也顯示出來。如果他四周的位置的四周也沒有雷的話,繼續(xù)這個(gè)過程,知道四周至少有一個(gè)雷時(shí)候停止。
玩家事件的處理:
玩家的事件有三種:單擊,左右鍵同時(shí)點(diǎn)擊,和右擊。
單擊可以想象成走到該處,如果有雷的話就游戲結(jié)束,沒有的話就根據(jù)我以上講的三點(diǎn)來判斷該做什么。
左右鍵同時(shí)點(diǎn)擊的話就將該處四周可能有雷的地方顯示出來,如果玩家錯(cuò)將沒有雷的地方放了小紅旗的話,游戲結(jié)束。
右擊是放小紅旗。
當(dāng)所有雷都被清楚的時(shí)候,游戲結(jié)束,玩家勝利。
剛寫過這個(gè)代碼
t?java.util.Random;
import?java.util.Scanner;
public?class?Mine?{
public?static?void?main(String[]?args)?{
int[][]?m?=?new?int[10][10];
Random?r?=?new?Random();
for(int?i?=?0;i10;++i)
for(int?j?=?0;j10;++j)
{
m[i][j]?=?r.nextInt(2);
}
Scanner?sc?=?new?Scanner(System.in);
System.out.println("輸入坐標(biāo)x和坐標(biāo)y");
int?x?=?sc.nextInt();
int?y?=?sc.nextInt();
System.out.println("地雷的個(gè)數(shù)是:"+findMine(m,x,y));
for(int?i1?=?0;i110;i1++)
{for(int?j1?=?0;j110;j1++)
System.out.print(m[i1][j1]+"?");
System.out.println();
}?
System.out.println();
}
public?static?int?findMine(int[][]?m,int?x,int?y){
int?sum?=?0;
if(m[x][y]?==?1)
return?-1;
if((x-1)0y-10)
if(m[x-1][y-1]==1)
sum++;
if((x-1)0)
if(m[x-1][y]==1)
sum++;
if(x-10y+1m[0].length)
if(m[x-1][y+1]==1)
sum++;
if(y-10)
if(m[x][y-1]==1)
sum++;
if(y+1m[0].length)
if(m[x][y+1]==1)
sum++;
if(x+1m.lengthy-10)
if(m[x+1][y-1]==1)
sum++;
if(x+1m.length)
if(m[x+1][y]==1)
sum++;
if(x+1m.lengthy+1m[0].length)
if(m[x+1][y+1]==1)
sum++;
return?sum;
}
}