您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用java實現(xiàn)掃雷游戲”,在日常操作中,相信很多人在怎么用java實現(xiàn)掃雷游戲問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用java實現(xiàn)掃雷游戲”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
1.創(chuàng)造窗口
//創(chuàng)建掃雷窗口界面
public Saolei() {
frame.setSize(600,700);
frame.setResizable(false);//設(shè)置窗口尺寸不能變化
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());//分塊
setHeader();//設(shè)置界面初始化
addlei(); //添加雷
setButtons();//添加按鈕
timer.start(); //啟動時鐘;
frame.setVisible(true);
}
2.定義數(shù)據(jù)結(jié)構(gòu)以及初始化
//數(shù)據(jù)結(jié)構(gòu)start
int ROW = 20;
int COL = 20;
int [][] data = new int[ROW][COL];
JButton[][] btns = new JButton[ROW][COL];
int LEICOUNT = 30; //雷個數(shù)
int LEICODE = -1;
int unopened = ROW*COL;
int opened = 0;
int timeSecond =0;
//三個 jlabel 狀態(tài)欄 已開未開,用時
JLabel label1= new JLabel("待開:"+unopened);
JLabel label2= new JLabel("已開:"+opened);
JLabel label3= new JLabel("用時:"+timeSecond+"s");
Timer timer = new Timer(1000, this); //定義時間為一秒
3.窗體按鈕
private void setButtons() {
Container con = new Container();//container容器
con.setLayout(new GridLayout(ROW,COL));//創(chuàng)建方格
for(int i=0;i<ROW;i++) {
for(int j=0;j<COL;j++) {
JButton btn = new JButton();
btn.setOpaque(true);
btn.setBackground(new Color(200,183,113)); //設(shè)置掃雷背景顏色
btn.addActionListener(this); //Btn添加按鈕監(jiān)聽事件
btn.setMargin(new Insets(0,0,0,0)); //button數(shù)字顯示不出來,加上該語句即可顯示
con.add(btn);
btns[i][j] = btn;
}
}
frame.add(con,BorderLayout.CENTER);//中間位置
}
4.埋雷
private void addlei() {
Random rand = new Random();
for(int i=0;i<LEICOUNT;) {
int r = rand.nextInt(ROW);
int c= rand.nextInt(COL);
if(data[r][c]!=LEICODE) {
data[r][c] = LEICODE;
i++;
// System.out.println(r+" "+c+" "+data[r][c]);
}
}
5.計算周圍雷的數(shù)量
//計算周邊雷的數(shù)量
for(int i=0;i<ROW;i++) {
for(int j=0;j<COL;j++) {
if(data[i][j]!=LEICODE) {
int c=0;
if(i>0&&j>0&&data[i-1][j-1]==LEICODE) c++;
if(i>0&&data[i-1][j]==LEICODE) c++;
if(i>0&&j<19&&data[i-1][j+1]==LEICODE) c++;
if(j>0&&data[i][j-1]==LEICODE) c++;
if(j<19&&data[i][j+1]==LEICODE) c++;
if(i<19&&j>0&&data[i+1][j-1]==LEICODE) c++;
if(i<19&&data[i+1][j]==LEICODE) c++;
if(i<19&&j<19&&data[i+1][j+1]==LEICODE) c++;
data[i][j]=c;
}
}
}
6.Banner設(shè)置
//設(shè)置開頭顯示
private void setHeader() {
//設(shè)置畫布 Jpanel
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c1 = new GridBagConstraints(0,0,3,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
panel.add(bannerBtn,c1);
bannerBtn.addActionListener(this);
label1.setOpaque(true); //設(shè)置不透明,背景色,
label1.setBackground(Color.white);
label1.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
label2.setOpaque(true);
label2.setBackground(Color.white);
label2.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
label3.setOpaque(true);
label3.setBackground(Color.white);
label3.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
bannerBtn.setOpaque(true);
bannerBtn.setBackground(Color.white);
bannerBtn.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
GridBagConstraints c2 = new GridBagConstraints(0,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
panel.add(label1,c2);
GridBagConstraints c3 = new GridBagConstraints(1,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
panel.add(label2,c3);
GridBagConstraints c4 = new GridBagConstraints(2,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
panel.add(label3,c4);
frame.add(panel,BorderLayout.NORTH);
}
7.游戲勝利還是失敗
//判斷勝利?。?!
private void checkWin() {
int count=0;
for(int i=0;i<ROW;i++) {
for(int j=0;j<COL;j++) {
if(btns[i][j].isEnabled()) {
count++;
}
}
}
unopened = count;
opened = ROW*COL-count;
label1.setText("待開:"+ unopened);
label2.setText("已開:"+ opened);
if(count==LEICOUNT) {
timer.stop();
bannerBtn.setText("游戲勝利!?。?quot;);
for(int i=0;i<ROW;i++) {
for(int j=0;j<COL;j++) {
if(btns[i][j].isEnabled()) {
btns[i][j].setBackground(new Color(100,183,0));
}
}
}
bannerBtn.setText("Banner:restart!");
JOptionPane.showMessageDialog(frame, "恭喜你!游戲勝利啦!\n 可以點擊上面的Banner重新開始!","游戲結(jié)束!",JOptionPane.PLAIN_MESSAGE);
}
}
//踩雷成功,游戲結(jié)束!
private void lose() {
timer.stop();
bannerBtn.setText("很遺憾,踩雷成功,游戲結(jié)束?。?!");
for(int i=0;i<ROW;i++) {
for(int j=0;j<COL;j++) {
if(btns[i][j].isEnabled()) {
JButton btn = btns[i][j];
if(data[i][j]==LEICODE) {
// btns[i][j].setEnabled(false); btns[i][j].setIcon(bombIcon); btns[i][j].setDisabledIcon(bombIcon);
btn.setBackground(Color.red); //置為紅色
btn.setText(data[i][j]+"");
}
else {
btn.setIcon(null);
btn.setEnabled(false); //btn已經(jīng)打開不可點擊
btn.setOpaque(true);
}
}
}
}
bannerBtn.setText("Banner:restart!");
JOptionPane.showMessageDialog(frame, "很遺憾,暴雷成功,游戲結(jié)束!??!\n 可以點擊上面的Banner重新開始!","游戲結(jié)束!",JOptionPane.PLAIN_MESSAGE);
}
8.空白級聯(lián)打開(實現(xiàn)點擊一個即可打開多個)
private void openCell(int i,int j,int Blankcount ){
JButton btn=btns[i][j];
if(!btn.isEnabled()) return ;
if(Blankcount==10) //部分打開,設(shè)置數(shù)字限制
return;
btn.setIcon(null);
btn.setEnabled(false);
btn.setOpaque(true);
Blankcount++;
btn.setBackground(Color.GREEN);
btn.setText(data[i][j]+"");
if(data[i][j]==0) {
if(i>0&&j>0&&data[i-1][j-1]==0) openCell(i-1,j-1,Blankcount);
if(i>0&&data[i-1][j]==0) openCell(i-1,j,Blankcount);
if(i>0&&j<19&&data[i-1][j+1]==0) openCell(i-1,j+1,Blankcount);
if(j>0&&data[i][j-1]==0) openCell(i,j-1,Blankcount);
if(j<19&&data[i][j+1]==0) openCell(i,j+1,Blankcount);
if(i<19&&j>0&&data[i+1][j-1]==0) openCell(i+1,j-1,Blankcount);
if(i<19&&data[i+1][j]==0) openCell(i+1,j,Blankcount);
if(i<19&&j<19&&data[i+1][j+1]==0) openCell(i+1,j+1,Blankcount);
}
}
到此,關(guān)于“怎么用java實現(xiàn)掃雷游戲”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。