一个Java拼图游戏

  1  import  java.awt. * ;
  2  import  java.applet. * ;
  3  import  java.awt.event. * ;
  4  public   class  PPuzzle  extends  Applet{
  5      Image imgPuzzle,buff;
  6      Point fifteen = new  Point( 3 , 3 );
  7       int [][] map = {{ 0 , 4 , 8 , 12 },{ 1 , 5 , 9 , 3 },{ 2 , 6 , 10 , 14 },{ 3 , 7 , 11 , 15 }};
  8       int  sx,sy;
  9      Canvas screen;
 10      Graphics gs,gb;
 11       boolean  running = false ;
 12      Button bStart = new  Button( " 新游戏 " );
 13      Button bSee = new  Button( " 显示正确的图像 " );
 14       public   void  init(){
 15          prepareImage();                     // 准备图像
 16          sx = imgPuzzle.getWidth( this ) / 4 ;
 17          sy = imgPuzzle.getHeight( this ) / 4 ;
 18          setBackground(Color.blue);
 19          initScreen();                      // 初始化画面
 20          initButtons();                     // 初始化按钮
 21          add(screen);                       // 向Applet添加组件
 22          add(bStart);
 23          add(bSee);
 24      }
 25       void  prepareImage(){                   // 准备图像的方法
 26          imgPuzzle = getImage(getCodeBase(), " temp/xxx.jpg " );
 27          MediaTracker mt = new  MediaTracker( this );
 28          mt.addImage(imgPuzzle,  0 );         // 等待至图像全部加载完毕
 29           try {
 30              mt.waitForAll();
 31          } catch (Exception e){}
 32           // 创建buffer并获取其Graphics对象
 33          buff = createImage(imgPuzzle.getWidth( this ),imgPuzzle.getHeight( this ));
 34          gb = buff.getGraphics();
 35      }
 36       void  initMap(){                        // 初始化map
 37          java.util.Random rnd = new  java.util.Random();
 38           int  temp,x1,y1,x2,y2;
 39           for ( int  i = 0 ;i < 100 ;i ++ ){
 40              x1 = rnd.nextInt( 4 );
 41              x2 = rnd.nextInt( 4 );
 42              y1 = rnd.nextInt( 4 );
 43              y2 = rnd.nextInt( 4 );
 44              temp = map[x1][y1];
 45              map[x1][y1] = map[x2][y2];
 46              map[x2][y2] = temp;
 47          }
 48          outer: for ( int  j = 0 ;j < 4 ;j ++ )
 49               for ( int  i = 0 ;i < 4 ;i ++ )
 50                   if (map[i][j] == 15 ){
 51                      fifteen.setLocation(i,j);
 52                       break  outer;
 53                  }
 54      }
 55       void  initScreen(){                    // 初始化画面
 56          screen = new  Canvas(){              // 创建screen对象
 57               public   void  paint(Graphics g){   // 覆盖paint()方法
 58                   if (gs == null )gs = getGraphics(); // 获取screen的Graphics对象
 59                   if (running)
 60                      drawScreen();
 61                   else
 62                   // 若游戏未开始,则显示整幅图像
 63                      g.drawImage(imgPuzzle, 0 , 0 , this );
 64              }
 65          };
 66           // 设定screen的大小
 67          screen.setSize(imgPuzzle.getWidth( this ),imgPuzzle.getHeight( this ));
 68          
 69          screen.addMouseListener( new  MouseAdapter(){   // 处理鼠标事件
 70               public   void  mousePressed(MouseEvent me){
 71                   if ( ! running)  return ;
 72                   int  x = me.getX() / sx,y = me.getY() / sy;
 73                   int  fx = ( int )fifteen.getX(),fy = ( int )fifteen.getY();
 74                   if (Math.abs(fx - x) + Math.abs(fy - y) >= 2 ) return ;
 75                   if  (map[x][y] == 15 ) return ;
 76                  map[fx][fy] = map[x][y];
 77                  map[x][y] = 15 ;
 78                  fifteen.setLocation(x,y);
 79                  drawScreen();
 80              }
 81          });
 82      }
 83       void  initButtons(){                                // 初始化按钮
 84           // “新游戏”按钮事件的处理
 85          bStart.addActionListener( new  ActionListener(){
 86               public   void  actionPerformed(ActionEvent ae){
 87                  initMap();                             // 初始化mpa
 88                  drawScreen();                          // 绘制画面
 89                  running = true ;                         // 代表游戏正在进行中
 90                  bSee.setLabel( " 显示正确的图像 " );       // 改变bSee按钮的标题
 91              }
 92          });
 93           // “显示正确图像”按钮事件处理
 94          bSee.addActionListener( new  ActionListener(){
 95               public   void  actionPerformed(ActionEvent ae){
 96                   // bSee按钮标题为“继续游戏”
 97                   if (bSee.getLabel().equals( " 继续游戏 " )){
 98                   drawScreen();                          // 绘制画面
 99  //                  bSee.setLabel("显示正确图像");       // 标题更改为“显示正确图像”  
100                   }
101                   else {
102                       // bSee的标题为“显示正确图像”
103                      gs.drawImage(imgPuzzle, 0 , 0 ,screen);    // 显示整幅图像
104                      bSee.setLabel( " 继续游戏 " );
105                  }
106              }
107          });
108      }
109       void  drawScreen(){                                   // 绘制画面的方法
110          gb.clearRect( 0 0 , sx * 4 , sy * 4 );                  // 清空buffer
111           // 将制定位置的图像块绘制至buffer中
112           int  i;
113           for ( int  j = 0 ;j < 4 ;j ++ )
114               for (i = 0 ;i < 4 ;i ++ )
115                   if (map[i][j] != 15 )drawSegment(map[i][j],i,j);
116           // 向Screen绘制buffer中的图像
117          gs.drawImage(buff,  0 0 , screen);
118      }
119       void  drawSegment( int  seg,  int  x,  int  y){
120          
121           int  dx = seg % 4 * sx,dy = seg / 4 * sy;
122          
123          gb.drawImage(imgPuzzle,x * sx,y * sy,x * sx + sx - 1 ,y * sy + sy - 1 ,dx,dy,dx + sx - 1 ,dy + sy - 1 ,screen);
124      }
125      
126  }

 注意:"temp/xxx.jpg"处是拼图的源图,具体图像位置由您自己决定

 

转载于:https://www.cnblogs.com/smx801/archive/2009/06/03/1495739.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值