掃雷(待改進)
自從學習Java之后,就覺得Java比我原先學了這么久的C要難上不少
Designed by Rossi
最近看了不少Java開發的小專案例子,于是游戲成癮的我心血來潮想寫個小游戲
掃雷
- 掃雷(待改進)
- 思路想法
- 一、未完善的地方
- 二、程式代碼
- 叨逼一句
思路想法
首先,我們要設計出掃雷的視窗界面,說白了,也就是在視窗上繪制出指定行數和列數的小方格,首先用JFrame設計表單,要在表單上繪制方格的話我們就需要一個JPanel面板,所以我們定義函式,在里面呼叫JPanel陳述句,然后我們在就可以這個類上繪制我們所要的資訊了,然后,在類中,我們定義一些基本的變數如行數、列數、雷的數量等等,方便后面使用,最后就是撰寫構造沙盤和判別勝負,以及按鍵等等
下面來一起進入正題
一、未完善的地方
1.右鍵標記:正版掃雷是有滑鼠右鍵標記的功能的,要實作這個功能需要用到滑鼠事件監聽,但是我在寫完架構之后回過頭來完善這個功能的時候發現無論插入那里都會有報錯,這意味著我要對代碼架構進行一定幅度的調整,處于麻煩我就沒有完成這個功能,
2.統計時間和剩余雷數:因為需要開辟執行緒類,對于目前的代碼量來說是不可能一口氣寫完的,所以這個專案放在了后續的完善計劃中,
3.難度選擇:因為剛開始寫的時候沒有考慮這么多,只是想著如果最后撰寫成功的話再進一步改進
二、程式代碼
下面讓我貼出我的源代碼
代碼如下:
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
public class mine {
public static void main(String arg[]) {
new mine();
}
JFrame f;
JPanel p,p1,p2;
int n=20;
int boomnumber=50;
JButton cheat,restart;
JButton b[][]=new JButton[n][n];
JLabel l[][]=new JLabel[n][n];
int boxy[][];
int visited[][]=new int[n][n];
mine() {
f=new JFrame("掃雷");
f.setBounds(600, 200, 495, 545);
p=new JPanel();
p.setLayout(null);
p1=new JPanel();
p2=new JPanel();
p1.setLayout(new BorderLayout());
p2.setLayout(new GridLayout(1,3));
p.setBackground(new Color(193,210,240));
makeboom(n,p);
makebutton(n,p);
cheat=new JButton("作弊模式");
cheat.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i[]:boxy) {
b[i[0]][i[1]].setText(".");
}
}
});
restart=new JButton("重新開始");
restart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
f.dispose();
new mine();
}
});
p1.add(p,BorderLayout.CENTER);
p2.add(p1,BorderLayout.CENTER);
p2.add(restart);
p2.add(cheat);
f.add(p1);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void makebutton(int n,JPanel a) {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
a.add(b[i][j]=new JButton());
b[i][j].setBounds(j*24,i*24,24,24);
b[i][j].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton d=(JButton)e.getSource();
int index=0;
int indey=0;
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(d==b[i][j]) {
index=i;
indey=j;
}
}
}
open(index,indey);
}
});
}
}
}
public void makeboom(int n,JPanel a) {
boxy=boom(n,boomnumber);
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
l[i][j]=new JLabel("0",JLabel.CENTER);
l[i][j].setBounds(j*24,i*24,24,24);
l[i][j].setBorder(BorderFactory.createLineBorder(Color.GRAY));
l[i][j].setOpaque(true);
l[i][j].setVisible(false);
a.add(l[i][j]);
}
}
for(int i=0;i<boomnumber;i++) {
l[boxy[i][0]][boxy[i][1]].setText("!");
visited[boxy[i][0]][boxy[i][1]]=1;
}
setnumber();
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(l[i][j].getText().equals("0")) {
l[i][j].setText("");
}
}
}
}
public int[][] boom(int n,int m){
int[][] boxy=new int[m][2];
int flag=0;
while(flag!=m) {
int x=(int)(Math.random()*n);
int y=(int)(Math.random()*n);
if(isrepeat(x,y,boxy,flag)==0) {
boxy[flag][0]=x;
boxy[flag][1]=y;
flag++;
}
}
return boxy;
}
public int isrepeat(int x,int y,int a[][],int flag) {
int is=0;
for(int i=0;i<flag;i++) {
if(a[i][0]==x && a[i][1]==y) {
is=1;
break;
}
else {
is=0;
}
}
return is;
}
public void setnumber() {
for(int[] i:boxy) {
int x=i[0];
int y=i[1];
for(int u=x-1;u<x+2;u++) {
for(int v=y-1;v<y+2;v++) {
if(u>=0 && u<n && v>=0 && v<n) {
String s=l[u][v].getText();
if(!s.equals("!")) {
int lnumb=Integer.parseInt(s);
lnumb++;
l[u][v].setText(lnumb+"");
}
}
}
}
}
}
public void open(int x,int y) {
b[x][y].setVisible(false);
l[x][y].setVisible(true);
visited[x][y]=1;
if(isWin()) {
JOptionPane.showMessageDialog(null, "游戲獲勝","游戲獲勝",JOptionPane.PLAIN_MESSAGE);
}
else{
if(l[x][y].getText().equals("!")) {
JOptionPane.showMessageDialog(null, "您失敗了","游戲結束",JOptionPane.PLAIN_MESSAGE);
}
else if(l[x][y].getText().equals("")){
for(int u=x-1;u<x+2;u++) {
for(int v=y-1;v<y+2;v++) {
if(u>=0 && u<n && v>=0 && v<n && visited[u][v]!=1) {
open(u,v);
}
}
}
}
else {
}
}
}
public boolean isWin() {
int last=-1;
for(int i[]:visited) {
if(Arrays.binarySearch(i, 0)<0) {
last=1;
}
else {
last=-1;
break;
}
}
if(last==1) {
return true;
}
else {
return false;
}
}
}
運行截圖:

叨逼一句
人總是要進步的,所以程式也是要改進的,這個blog僅做為一個記錄和分享,后續我改進完了之后我會繼續在原帖下更新的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/249549.html
標籤:其他
上一篇:React 訊息訂閱與發布機制
