这学期的专业选修课选了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
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
BDilei[i].setText("");
BDilei[i].setEnabled(true);
}
//每个格子地雷个数的数组,初始化均为0,在9*9的地雷区外面加一圈,这是一个虚拟地雷圈,地雷个数为0
a = new int[row+2][col+2];
for(int i=0;i
for(int j=0;j
a[i][j]=0;
}
}
//随机产生地雷个数,存放在二维数组a中
DileiWeizhi = new int[Dileishu];
for(int i=0;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
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
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
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
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
int c=DileiWeizhi[k];
BDilei[c].setText("Dilei");
}
for(int j=0;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* )[握拳!]