這學期的專業選修課選了java,由於之前已經學過了C++,數據結構和操作系統的原因吧!所以感覺上手還是比較容易的……
於是,實驗課老師並沒有要求那樣一次次的做實驗交實驗報告,而是在最後一次實驗課上,利用之前的時間做一個小項目然後檢查。
我們寢室的人選擇的是俄羅斯方塊,隔壁寢的是貪吃蛇,男生那邊有做推箱子,象棋,坦克大戰,還有瀏覽器什麼的,於是咯,在這些小遊戲裏面,對掃雷還蠻有興趣,於是就選擇了掃雷。之前花了一堆時間從網上搜原理和源代碼,然後花了一個上午的時間做了一個簡單的掃雷。雖然遞歸什麼的,難度選擇什麼的都沒有,但是畢竟是自己的第一個java小程序,所以感覺還是蠻激動的。
交給老師看了之後,老師要求還是自定義長寬和難度,於是弄了一個流,在控制檯輸入。
貼上主程序咯,請各位路過的大神,狠狠地指導一下吧!小女子不勝感激
public Saolei2(String title,int rowshezhi,int colshezhi,int Dileishushezhi){
row = rowshezhi;
col = colshezhi;
Dileishu = Dileishushezhi;
jf = new JFrame(title); //實例化一個JFrame對象
container = jf.getContentPane(); //獲取一個容器
jf.setBounds(400, 100, 400, 500); //設置容器的大小和位置
jf.setVisible(true); //使容器可視
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置容器關閉方式
JUpper = new JPanel(); //頂部面板
JStart = new JButton("開始");
JStart.addActionListener(this);
JResult = new JLabel("這裏顯示輸贏結果");
JDileishu = new JLabel("這裏顯示剩餘的地雷個數");
JUpper.setLayout(new BorderLayout()); //頂部面板是邊界佈局
JUpper.add(JStart, BorderLayout.CENTER); //把開始按鈕放入頂部面板中間
JUpper.add(JResult, BorderLayout.WEST); //左方顯示輸贏結果
JUpper.add(JDileishu,BorderLayout.EAST); //右方顯示剩餘地雷個數
container.add(JUpper,BorderLayout.NORTH); //把頂部面板放入容器中
JMain = new JPanel(); //在主面板添加地雷按鈕
JMain.setLayout(new GridLayout(row,col,0,0)); //9行9列的網格,組件之間的行列間距均爲0
BDilei = new JButton[row*col];
for(int i=0;i<row*col;i++){
BDilei[i] = new JButton();
BDilei[i].addActionListener(this);
BDilei[i].addMouseListener(new SaoleiMouseEvent());
JMain.add(BDilei[i]);
}
container.add(JMain,BorderLayout.CENTER);
jf.setVisible(true);
}
然後再主函數裏面用流實現,難度的設置:
public static void main(String[] args) throws IOException{
int heng,zong,geshu;
BufferedReader dinheng = new BufferedReader(new InputStreamReader(System.in));
System.out.print("input 橫向的個數: ");
heng =Integer.parseInt(dinheng.readLine());
BufferedReader dinzong = new BufferedReader(new InputStreamReader(System.in));
System.out.print("input 縱向的個數: ");
zong =Integer.parseInt(dinzong.readLine());
BufferedReader dingeshu = new BufferedReader(new InputStreamReader(System.in));
System.out.print("input 地雷的個數: ");
geshu =Integer.parseInt(dingeshu.readLine());
new Saolei2("掃雷遊戲",heng,zong,geshu);
}
事件咯:
public void actionPerformed(ActionEvent e) {
if(e.getSource()==JStart){
//Dileishu = 40;
JDileishu.setText("開始遊戲,剩餘地雷個數"+Dileishu);
JResult.setText("這裏顯示輸贏結果");
//清空,按鈕設置爲true
for(int i=0;i<row*col;i++){
BDilei[i].setText("");
BDilei[i].setEnabled(true);
}
//每個格子地雷個數的數組,初始化均爲0,在9*9的地雷區外面加一圈,這是一個虛擬地雷圈,地雷個數爲0
a = new int[row+2][col+2];
for(int i=0;i<row+2;i++){
for(int j=0;j<col+2;j++){
a[i][j]=0;
}
}
//隨機產生地雷個數,存放在二維數組a中
DileiWeizhi = new int[Dileishu];
for(int i=0;i<Dileishu;i++){
int p=1;
int m=(int)(Math.random()*row*col); //產生1個隨機數,在1和81之間
while(p==1){
int l=1;
int j;
for(j=0;j<i&&l==1;j++){
if(DileiWeizhi[j]==m){
m=(int)(Math.random()*row*col);
l=0;
}
}
if(j==i){
DileiWeizhi[i]=m;
p=0;
}
}
}
//開始放雷
for(int i=0;i<Dileishu;i++){
int x=(DileiWeizhi[i]/col+1);
System.out.print(" 橫座標 "+x);
int y=(DileiWeizhi[i]%col+1);
System.out.print(" 縱座標"+y+" ");
a[x][y]=1000; //一個很大的數,標記這個位置有地雷
}
System.out.println();
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){ //對從a[1][1]到a[9][9]開始循環
if(a[i][j]!=1000){ //如果這個區域沒有地雷,則檢查這個區域周圍8個區域是否有地雷,如果有則這個區域的數字爲地雷數
if(a[i-1][j-1]==1000){a[i][j]++;}
if(a[i-1][j]==1000){a[i][j]++;}
if(a[i-1][j+1]==1000){a[i][j]++;}
if(a[i][j-1]==1000){a[i][j]++;}
if(a[i][j+1]==1000){a[i][j]++;}
if(a[i+1][j-1]==1000){a[i][j]++;}
if(a[i+1][j]==1000){a[i][j]++;}
if(a[i+1][j+1]==1000){a[i][j]++;}
}
}
}
}//if(e.getSource()==JStart)結束
}
鼠標事件:
class SaoleiMouseEvent implements MouseListener {
public void mouseClicked(MouseEvent e) {
//JDileishu.setText("剩餘地雷個數"+Dileishu);
for(int i=0;i<col*row;i++){
int x1=i/col+1;
//System.out.print("橫座標"+x1);
int y1=i%col+1;
//System.out.print("縱座標"+y1);
if(e.getSource()==BDilei[i] && BDilei[i].getText()!="Dilei"){
if(e.getButton()==MouseEvent.BUTTON3){
BDilei[i].setText("Dilei");
Dileishu--;
JDileishu.setText("剩餘地雷個數"+Dileishu);
if(Dileishu==0){
int Biaoji=0;
for(int j=0;j<col*row;j++){
int x=i/col+1;
int y=i%col+1;
if(a[x][y]==1000 && BDilei[j].getText()=="Dilei"){Biaoji++;}
}
if(Biaoji==Dileishu){JResult.setText("你贏了!");}
}
}
if(e.getButton()==MouseEvent.BUTTON1){
if(a[x1][y1]==1000){
JResult.setText("你輸了!");
for(int k=0;k<Dileishu;k++){
int c=DileiWeizhi[k];
BDilei[c].setText("Dilei");
}
for(int j=0;j<col*row;j++){
BDilei[j].setEnabled(false);
}
}
if(a[x1][y1]!=1000){
BDilei[i].setText(a[x1][y1]+"");
BDilei[i].setEnabled(false);
}
}
}
else if(e.getSource()==BDilei[i] && BDilei[i].getText()=="Dilei"){
if(e.getButton()==MouseEvent.BUTTON3){
BDilei[i].setText(" ");
Dileishu++;
JDileishu.setText("剩餘地雷個數"+Dileishu);
}
}
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
(*^__^*) 嘻嘻……人生的第一次這種的小代碼!下學期課程比較少,於是好好練習編程咯!
今天,英語六級終於結束了。折磨我的英語啊!!終於可以毫無牽掛的學習日語了,加油!O(∩_∩)O~~o( ̄ヘ ̄o* )[握拳!]