/********************************************************************************* *源文件名:Mine.java *开发语言:java * *创建人:牛永刚 *创建日期:2005-04-26 *创建原因:开始学习java语言,就写了一个扫雷来锻炼自己的java基础 *联系方式:email:[email protected] 、[email protected] qq:37954924 * *声明:版权信息请不要修改,j2sdk1.4.1_02运行通过 *********************************************************************************/ import java.awt.*; import javax.swing.*; import java.util.Random; import java.awt.event.*; class Min extends JPanel //雷的类 { //备注:鼠标的左键 = 1;右键 = 3;中键 = 2 private int flag = 0,statu = 0; //定义雷的属性 0:没有打开 1:打开 2:标示为雷 3:不确定 //flag = 0 不是雷 ; flag = 1是雷 private int but,count = 0; //but:哪一个鼠标键被按下去了 count:这个区域周围有多少个雷 private int mx = 0,my = 0,mw = 10; //定义雷的坐标和宽度 public Min() //构造函数 { statu = 0; } public Min(int f,int x,int y,int w) //构造函数 { flag = f; mx = x; my = y; mw = w; } public int getFlag(){return flag;} public int getStatu(){return statu;} public int getMx(){return mx;} public int getMy(){return my;} public int getMw(){return mw;} public int getCount(){return count;} public void setFlag(int f){flag = f;} public void setCount(int c){count = c;} public void setData(int f,int x,int y,int w,int s) //传递值 { flag = f; mx = (x-1)*w; my = (y-1)*w; mw = w-1; statu = s; } //根据你点击鼠标的不同来改变雷的属性 public int sendKey(int key) { //返回值,如果游戏结束则返回-1 int rtn = 1; if(key == 3) { switch(statu) { case 1: break; case 2: statu = 3; break; case 3: statu = 0; break; case 0: statu = 2; break; } rtn = 1; } if(key == 1 && statu == 0) { switch(flag) { case 0: statu = 1; rtn = 2; break; case 1: statu = 1; rtn = -1; break; } } return rtn; } } class DrawPanel extends JPanel { private int i,j; private int f = 0; //if f = 1 then game over ,if f =2 then win private int chx = 0,chy = 0; //专门记录坐标x,y的值 private int msum = 6,ksum = 0; //msum:雷的个数,ksum:标示雷的个数 private int bx = 10,by = 10,bw = 40; //bx,by:棋盘的大小,bw:棋子的大小 public Min board[][] = { {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, }; //画坐标为ax,ay区域的雷的状态 public void draw(Graphics g,int ax,int ay) { int x,y,w; //坐标x,y;和宽度:w int s,c,flag; //状态;雷的个数; int cx = bw/2 - 4; int cy = bw/2 + 4; x = board[ax][ay].getMx(); y = board[ax][ay].getMy(); w = board[ax][ay].getMw(); s = board[ax][ay].getStatu(); c = board[ax][ay].getCount(); flag= board[ax][ay].getFlag(); switch(s) { case 0: //没有打开状态 { g.setColor(Color.black); g.fillRect(x,y,w,w); break; } case 1: //打开状态 { g.setColor(Color.blue); g.fillRect(x,y,w,w); if(c != 0 && flag == 0) //此处没有雷 { g.setColor(Color.red); g.drawString(String.valueOf(c),x + cx,y + cy); } if(flag == 1) //此处有雷 { g.setColor(Color.red); g.fillRect(x,y,w,w); g.setColor(Color.blue); g.drawString("雷",x + cx,y + cy); } break; } case 2: //标雷状态 { g.setColor(Color.green); g.fillRect(x,y,w,w); g.setColor(Color.blue); g.drawString("旗",x + cx,y + cy); break; } case 3: //不确定状态 { g.setColor(Color.black); g.fillRect(x,y,w,w); g.setColor(Color.red); g.drawString("?",x + cx,y + cy); break; } default: break; } } //没有图形器的绘图函数:画出坐标ax,ay的雷的状态和图形 public void draw(int ax,int ay) { Graphics g; g = this.getGraphics(); draw(g,ax,ay); } //打开周围没有雷的地方,并且绘画所在区域点击左键触发 public int openNoMin(int ax,int ay) { int i,j; if(ax<1||ay<1||ax>bx||ay>by) return 0; //鼠标点击的区域出界了 if(board[ax][ay].getStatu() != 0) return 0; //如果此区域打开了,返回 board[ax][ay].sendKey(1); //如果返回值等于-1,就说明游戏结束 draw(ax,ay); if(board[ax][ay].getFlag() == 1) //如果游戏结束,把所有的雷都显示出来 { for(i = 1;i<=bx;i++) { for(j = 1;j <= by;j++) { if(board[i][j].getFlag() == 1) { board[i][j].sendKey(1); draw(i,j); } } } return -1; } //如果游戏没有结束 if(board[ax][ay].getCount() > 0) { ksum ++; return 1; //周围有雷,就不用打开周围地区 } if(board[ax][ay].getCount() == 0 && board[ax][ay].getFlag() == 0) //周围没有雷,打开周围地区,直到有雷的地区 { openNoMin(ax-1,ay-1);openNoMin(ax,ay-1);openNoMin(ax+1,ay-1); openNoMin(ax-1,ay ); openNoMin(ax+1,ay ); openNoMin(ax-1,ay+1);openNoMin(ax,ay+1);openNoMin(ax+1,ay+1); } ksum ++; return 1; } //计算坐标x,y的周围雷的个数 public int getCount(int ai,int aj) { int sum = 0; if(board[ai][aj].getFlag() == 1) { return sum; } if(ai>1&&aj>1&&ai<bx&&aj<by) { sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+ board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+ board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag(); } if(ai==1&&aj==1) { sum = board[ai+1][aj ].getFlag()+ board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag(); } if(ai==1&&aj==by) { sum = board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+ board[ai+1][aj ].getFlag(); } if(ai==bx&&aj==1) { sum = board[ai-1][aj ].getFlag()+ board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag(); } if(ai==bx&&aj==by) { sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai-1][aj ].getFlag(); } if(ai==1&&aj>1&&aj<by) { sum = board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+ board[ai+1][aj ].getFlag()+ board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag(); } if(ai==bx&&aj>1&&aj<by) { sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai-1][aj ].getFlag()+ board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag(); } if(ai>1&&ai<bx&&aj==1) { sum = board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+ board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag(); } if(ai>1&&ai<bx&&aj==by) { sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+ board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag(); } return sum; } //传入参数:几列,几行,宽度,雷数 public void initMin(int ax,int ay,int aw,int as) { int k = 1; //表明产生的第几个雷 Random r; //随机数 f = 0; //f=0表示游戏还没有结束 ksum = 0; bx = ax; by = ay; bw = aw; msum = as; r = new Random(); //初始化底盘的值 for(i = 1;i <= bx;i++) { for(j=1;j<=by;j++) { board[i][j].setData(0,i,j,bw,0); } } //随机产生雷 while(k <= msum) { i = r.nextInt(bx)+1; j = r.nextInt(by)+1; if(board[i][j].getFlag() != 1) { board[i][j].setFlag(1); k++; } } //非雷区的周围有几个雷,初始化其值 for(i = 1;i <= bx;i++) { for(j=1;j<=by;j++) { board[i][j].setCount(getCount(i,j)); } } setBackground(Color.white); repaint(); } //构造函数 public DrawPanel(int ax,int ay,int aw,int as) { initMin(ax,ay,aw,as); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { int r; if(f != 0) return; //如果游戏结束,返回 chx = me.getX(); chy = me.getY(); if(me.getButton() != 1) { board[chx/bw+1][chy/bw+1].sendKey(me.getButton()); draw(chx/bw+1,chy/bw+1); } else if(me.getButton() == 1) { if(openNoMin(chx/bw+1,chy/bw+1) == -1) { f = 1; repaint(); } else if ( ksum + msum == bx*by ) { f = 2; repaint(); } } } } ); } //重画所有的图形,包括一些修饰的图形 public void paint(Graphics g) { int x,y,w; int s; int cx = bw/2 - 4; int cy = bw/2 + 4; g.clearRect(0,0,600,600); for(i=1;i<=bx;i++) { for(j=1;j<=by;j++) { draw(g,i,j); } } if(f == 1) { Font f = new Font("11",1,70); Font fo = g.getFont(); g.setColor(Color.white); g.setFont(f); //g.setSize(); g.drawString("Game Over",0,200); g.setFont(fo); } if( f == 2 ) { Font f = new Font("11",1,70); Font fo = g.getFont(); g.setColor(Color.white); g.setFont(f); //g.setSize(); g.drawString("You win!",0,200); g.setFont(fo); } } }; //主类和程序的入口 public class Mine extends JFrame implements ActionListener { Container cp = getContentPane(); JButton bt = new JButton("开局"); Label l1 = new Label("列:"); Label l2 = new Label("行:"); Label l3 = new Label("宽度:"); Label l4 = new Label("雷的个数:"); TextField tf1 = new TextField("10",2); //列 TextField tf2 = new TextField("10",2); //行 TextField tf3 = new TextField("40",2); //宽度 TextField tf4 = new TextField("15",2); //雷的个数 int x=10,y=10,w=40,sum=15; DrawPanel dp = new DrawPanel(x,y,w,sum); public Mine() { setBackground(Color.white); cp.setLayout(null); cp.add(dp); cp.add(bt); cp.add(tf1); cp.add(tf2); cp.add(tf3); cp.add(tf4); cp.add(l1); cp.add(l2); cp.add(l3); cp.add(l4); l1.setBounds(20 ,10,20,20); tf1.setBounds(40,10,20,20); l2.setBounds(70,10,20,20); tf2.setBounds(90,10,20,20); l3.setBounds(120,10,40,20); tf3.setBounds(160,10,20,20); l4.setBounds(190,10,60,20); tf4.setBounds(250,10,20,20); bt.setBounds(300,10,80,20); dp.setBounds(20,40,x*w,y*w); setResizable(false); setSize(x*w+40,y*w+80); setTitle("扫雷"); show(); bt.addActionListener(this); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} } ); } public void actionPerformed(ActionEvent e) { if(e.getSource() == bt) { //x = Integer.parseInt(tf1.getText()); //y = Integer.parseInt(tf2.getText()); //w = Integer.parseInt(tf3.getText()); sum = Integer.parseInt(tf4.getText()); setSize(x*w+40,y*w+80); dp.setBounds(20,40,x*w,y*w); show(); dp.initMin(x,y,w,sum); } } public static void main(String args[]) { new Mine(); } };
由于我不知道更好的方法来初始化一个自定义类的二维数组,在这里现了这么一个丑,希望你们能够给我一点指导,先谢谢。 
|