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* )[握拳!] 

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值