熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java實現拼圖游戲

2013-11-23 19:32:25  來源: Java核心技術 

  偶爾幫同學作一個拼圖游戲要求多加注釋實現後加了這麼多注釋直接刪掉太可惜了

  不如拿出來共享一下其實有些注釋就是廢話不過先講一下原理方始讀者了然不惑 :)

  主要利用了Graphics中的

  public abstract boolean drawImage(Image img

  int dx

  int dy

  int dx

  int dy

  int sx

  int sy

  int sx

  int sy

  Color bgcolor

  ImageObserver observer)

  方法(Draws as much of the specified area of the specified image as is currently available scaling it on the fly tofit inside the specified area of the destination drawable surface)大意是把 img 中由 (sx sy)(sx sy)指定的矩形區域畫到 observer 中由(dx dy)(dx dy)指定的矩形區域內(如果兩個指定的大小不同可能會依目的大小為准進行拉伸或壓縮建議相同)   有了上面的方法就可以進行構思拼圖游戲的具體實現了主要是計算上面的個值以下代碼注釋很詳細(或說很羅嗦)有幾點要指出   圖片為隨機打亂一個小子說塊圖片怎麼隨機打亂都能拼成結果有幾次拼了多半個小時都不成(我不太擅長拼圖)所以如果拼不出來請重新開始一下   最後的圖片為拼圖圖片存為 bgjpg 放至同一文件夾下即可如要換圖要改變窗口大小否則會變形   一直另我很郁悶的事情空白的一塊始終顏色是黑色無論我加多少 setcolor語句還望各位大蝦指教   顯示時間未實現繼承Runnable接口實現並不難但 顯示正確圖片繼續游戲 相當於一個暫停按鈕需要線程間的協作 喚醒等待不算太難有需要的就實現否則就掐表吧

  import javaawt*;

  import javaawtevent*;

  import javaawtimageBufferedImage;

  import javaio*;

  import javaximageioImageIO;

  import javautil*;

  import javaxswing*;

  public class Pintu extends JFrame{

  private Image image buff;             //原始圖片緩存圖片

  private Point point = new Point( );         //記錄第九塊圖片位置

  private int[][] map = {{ }{ } { }}; //給破碎圖片標號

  private int sx sy;       // 分割後每一個圖片的寬度和高度

  private Canvas canvas;    //加載圖片容器

  private Graphics gs gb;     //gs 畫出Canvas gb畫出buff圖像

  private boolean isRunning = false;   //游戲是否正在進行

  private JButton start = new JButton(開始新的游戲); // 按鈕

  private JButton show = new JButton(顯示正確圖片); //按鈕

  private JTextArea showTime = new JTextArea(顯示時間);

  private JTextArea showStep = new JTextArea(顯示步驟);

  private JPanel panel = new JPanel(); //裝在上面個按鈕

  private int steps = ;               // 記錄移動的步驟

  public Pintu(String title) {   //構造方法

  super(title);

  try {                     //異常拋出

  image = ImageIOread(new File(bgjpg)); //裝載圖片

  } catch (IOException ex) {

  exprintStackTrace();

  }

  initScreen();   //初始化canvas由於canvas 初始化較復雜所以單獨寫一個方法

  buff = new BufferedImage( BufferedImageTYPE_INT_BGR);//三原色加載

  gb = buffgetGraphics();

  sx = imagegetWidth(this) / ;

  sy = imagegetHeight(this) / ;

  setLayout(new BorderLayout());

  add(panel BorderLayoutSOUTH);

  add(canvas BorderLayoutCENTER);

  panelsetLayout(new GridLayout( ));

  paneladd(start);

  paneladd(show);

  paneladd(showTime);

  paneladd(showStep);

  showTimesetEditable(false);

  showStepsetEditable(false);

  showTimesetFont(new Font(黑體 FontPLAIN ));

  showStepsetFont(new Font(黑體 FontPLAIN ));

  setSize( );

  setResizable(false);

  setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

  }

  void initScreen() {

  canvas = new Canvas() {

  public void paint(Graphics g) {     //覆寫canvas的paint 方法

  gs = getGraphics(); //得到Canvas的Graphics

  if (isRunning) {

  drawScreen();

  } else {

  gdrawImage(image this);

  gsetColor(Colorgray);

  }

  }

  };

  canvasaddMouseListener(new MouseAdapter() {

  //覆寫mousePressed 方法實現鼠標點擊時圖片移動

  public void mousePressed(MouseEvent me) {

  if (!isRunning) return; // 如果未運行說明圖片未分割直接返回

  int x = megetX() / sx y = megetY() / sy;//判斷鼠標點擊的圖片在map中的編號

  int fx = (int) pointgetX() fy = (int) pointgetY();//記錄第九塊圖片(未顯示圖片)的位置

  int canMove = Mathabs(fx x) + Mathabs(fy y); // 如鼠標點擊位置與第九塊圖片(可移動的位置)相鄰則canMove 必為

  if (canMove != ) return; // canMove 不為不能移動圖片

  map[fx][fy] = map[x][y];    //點擊圖片坐標 賦給第九塊圖片

  map[x][y] = ;                  //第九塊圖片給掉 點擊圖片

  pointsetLocation(x y);   //point 坐標改變

  drawScreen();              //重繪屏幕實現圖片移動

  showStepsetText(移動步驟 + ++steps);                 //步驟加一

  }

  });

  //為Start按鈕添加事件

  startaddActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent ae) {

  initMap();

  drawScreen();

  isRunning = true;

  steps = ;

  showStepsetText(移動步驟 + steps);

  showsetLabel(顯示正確圖片);

  }

  });

  //為show按鈕添加事件

  showaddActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent ae) {

  if (showgetLabel()equals(繼續游戲)) {

  drawScreen();

  isRunning = true;

  showsetLabel(顯示正確圖片);

  } else {

  gsdrawImage(image canvas);

  isRunning = false;

  showsetLabel(繼續游戲);

  }

  }

  });

  }

  void initMap() {

  long time = SystemnanoTime();//得到系統當前時間 作為隨機數種子

  javautilRandom rnd = new javautilRandom(time);

  int temp x y x y;

  //隨機交換圖片

  for (int i = ; i < ; i++) {

  x = rndnextInt();

  x = rndnextInt();

  y = rndnextInt();

  y = rndnextInt();

  temp = map[x][y];

  map[x][y] = map[x][y];

  map[x][y] = temp;

  }

  //標記號圖片(即空白圖片)

  outer:

  for (int i = ; i < ; i++)

  for (int j = ; j < ; j++)

  if (map[i][j] == ) {

  pointsetLocation(i j);

  break outer;

  }

  }

  void drawScreen() {

  int sx sy sx sy dx dy dx dy;

  int t t;

  gbsetColor(Colorwhite);

  gbclearRect( sx * sy * );//清空整個緩沖去圖片

  for (int x = ; x < ; x++)

  for (int y = ; y < ; y++)

  if(map[x][y] != ) {

  // 目的地址

  dx = x * sx;     dy = y * sy;       // 移動的左上角坐標

  dx = dx + sx ;   dy = dy + sy ; // 移動的右下角坐標

  // 源地址

  t = map[x][y] % ; t = map[x][y] / ;

  sx = t * sx;    sy = t * sy;   // 移動的左上角圖標

  sx = sx + sx ;   sy = sy + sy ; // 移動的右下角坐標

  gbdrawImage(image dx dy dx dy sx sy sx sy Colorwhite canvas);//繪制緩沖區圖片

  }

  gsdrawImage(buff canvas);//將緩沖區圖片繪制到 canvas 上

  }

  public static void main(String[] args) {

  Pintu pintu = new Pintu(拼圖);

  new Thread(pintu)start();

  pintusetVisible(true);

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27054.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.