java的掃雷小遊戲(超簡單)

這學期的專業選修課選了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* )[握拳!] 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章