JAVA实现拼图游戏
生活随笔
收集整理的這篇文章主要介紹了
JAVA实现拼图游戏
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
JAVA實(shí)現(xiàn)拼圖游戲 package?org.test;
/**
?*?<p>Title:?LoonFramework</p>
?*?<p>Description:拼圖圖像處理[未優(yōu)化](優(yōu)化算法已內(nèi)置于loonframework-game框架中。)</p>
?*?<p>Copyright:?Copyright?(c)?2007</p>
?*?<p>Company:?LoonFramework</p>
?*?@author?chenpeng??
?*?@email:ceponline@yahoo.com.cn?
?*?@version?0.1
?*/
import?java.awt.Canvas;
import?java.awt.Color;
import?java.awt.Event;
import?java.awt.Frame;
import?java.awt.Graphics;
import?java.awt.Image;
import?java.awt.MediaTracker;
import?java.awt.image.BufferedImage;
import?org.loon.framework.game.helper.ImageHelper;
public?class?BlockImage?extends?Canvas?{
????/**
?????*?
?????*/
????private?static?final?long?serialVersionUID?=?1L;
????private?Image?_img;
????private?Image?_img2;
????private?Graphics?bg;
????private?Image?backimage;
????private?int?blocks[];
????private?boolean?isEvent;
????private?MediaTracker?mt;
????private?int?_width;
????private?int?_height;
????private?int?_RS;
????private?int?_CS;
????private?Image?screen?=?null;
????private?Graphics?later?=?null;
????private?int?_objWidth;
????private?int?_objHeight;
????private?int?_COUNT;
????/**
?????*?析構(gòu)函數(shù),內(nèi)部調(diào)用init方法。
?????*?
?????*?@param?bImage
?????*?@param?overImage
?????*?@param?cs
?????*?@param?rs
?????*/
????public?BlockImage(Image?bImage,?Image?overImage,?int?cs,?int?rs)?{
????????init(bImage,?overImage,?cs,?rs);
????}
????/**
?????*?初始化拼圖參數(shù)。
?????*?
?????*?@param?bImage
?????*?@param?overImage
?????*?@param?cs
?????*?@param?rs
?????*/
????public?void?init(Image?bImage,?Image?overImage,?int?cs,?int?rs)?{
????????//?列數(shù)
????????_CS?=?cs;
????????//?行數(shù)
????????_RS?=?rs;
????????//?加載拼圖用圖像。
????????_img?=?bImage;
????????//?獲得實(shí)際窗體寬。
????????_width?=?_img.getWidth(null);
????????//?獲得實(shí)際窗體高。
????????_height?=?_img.getHeight(null);
????????//?獲得單塊圖像寬。
????????_objWidth?=?_width?/?_CS;
????????//?獲得單塊圖像高。
????????_objHeight?=?_height?/?_RS;
????????//?本程序直接使用backimage上一塊圖形區(qū)域緩沖選擇項(xiàng),所以實(shí)際背景圖像高=圖形高+額外圖塊高。
????????backimage?=?new?BufferedImage(_width,?_height?+?_objHeight,?1);
????????//?獲得生成的圖形
????????later?=?backimage.getGraphics();
????????//?再創(chuàng)建一塊圖像區(qū)域,作為圖像緩存用。
????????screen?=?new?BufferedImage(_width,?_height,?1);
????????//?獲得緩存的圖形
????????bg?=?screen.getGraphics();
????????//?獲得等同圖片總數(shù)的數(shù)組。
????????_COUNT?=?_CS?*?_RS;
????????blocks?=?new?int[_COUNT];
????????//?初始化為非點(diǎn)擊。
????????isEvent?=?false;
????????//?加載完成拼圖的顯示圖。
????????_img2?=?overImage;
????????//?初始化圖塊參數(shù)。
????????for?(int?i?=?0;?i?<?_COUNT;?i++)?{
????????????blocks[i]?=?i;
????????}
????????//?載入MediaTracker,用以跟蹤圖像狀態(tài)。
????????mt?=?new?MediaTracker(this);
????????//?加載被跟蹤的圖像。
????????mt.addImage(_img,?0);
????????mt.addImage(_img2,?0);
????????//?同步載入。
????????try?{
????????????mt.waitForID(0);
????????}?catch?(InterruptedException?interruptedexception)?{
????????????return;
????????}
????????//?隨機(jī)生成圖像面板內(nèi)容。
????????rndPannel();
????}
????/**
?????*?描繪窗體圖像。
?????*/
????public?void?paint(Graphics?g)?{
????????//?檢查圖像載入。
????????if?(mt.checkID(0))?{
????????????//?描繪底層背景。
????????????bg.drawImage(backimage,?0,?0,?null);
????????????//?判斷是否觸發(fā)完成事件。
????????????if?(!isEvent)?{
????????????????//?設(shè)置背景色。
????????????????bg.setColor(Color.black);
????????????????//?循環(huán)繪制小圖片于背景緩存中。
????????????????for?(int?i?=?0;?i?<?_CS;?i++)?{
????????????????????for?(int?j?=?0;?j?<?_RS;?j++)
????????????????????????bg.drawRect(i?*?_objWidth,?j?*?_objHeight,?_objWidth,
????????????????????????????????_objHeight);
????????????????}
????????????}
????????????//?僅當(dāng)完成事件觸發(fā)并且有勝利圖片時(shí),載入完成提示。
????????????if?(isEvent?&&?_img2?!=?null)?{
????????????????bg.drawImage(_img2,?0,?0,?null);
????????????}
????????}
????????//?舉凡繪制圖像時(shí),應(yīng)遵循顯示圖像僅繪制一次的基本原則,一次性的將背景繪制到窗體。
????????//?簡單來說,也就是采取[雙緩存]的方式,所有復(fù)雜操作皆在緩存區(qū)完成,也只有這樣才能避免產(chǎn)生延遲閃爍。
????????g.drawImage(screen,?0,?0,?this);
????????g.dispose();
????}
????/**
?????*?變更圖像。
?????*/
????public?void?update(Graphics?g)?{
????????paint(g);
????}
????/**
?????*?鼠標(biāo)點(diǎn)擊事件。
?????*/
????public?boolean?mouseDown(Event?event,?int?i,?int?j)?{
????????if?(isEvent)
????????????return?true;
????????//?換算點(diǎn)擊位置與小圖片。
????????int?k?=?i?/?_objWidth;
????????int?l?=?j?/?_objHeight;
????????copy(0,?0,?0,?_RS);
????????copy(k,?l,?0,?0);
????????copy(0,?_RS,?k,?l);
????????int?i1?=?blocks[0];
????????//?換算選中圖片存儲區(qū)。
????????blocks[0]?=?blocks[l?*?_CS?+?k];
????????blocks[l?*?_CS?+?k]?=?i1;
????????int?j1;
????????for?(j1?=?0;?j1?<?_COUNT;?j1++)?{
????????????if?(blocks[j1]?!=?j1)?{
????????????????break;
????????????}
????????}
????????if?(j1?==?_COUNT)
????????????isEvent?=?true;
????????repaint();
????????return?true;
????}
????public?boolean?mouseUp(Event?event,?int?i,?int?j)?{
????????return?true;
????}
????public?boolean?mouseDrag(Event?event,?int?i,?int?j)?{
????????return?true;
????}
????/**
?????*?copy換算后的圖像區(qū)域。
?????*?
?????*?@param?i
?????*?@param?j
?????*?@param?k
?????*?@param?l
?????*/
????void?copy(int?i,?int?j,?int?k,?int?l)?{
????????later.copyArea(i?*?_objWidth,?j?*?_objHeight,?_objWidth,?_objHeight,
????????????????(k?-?i)?*?_objWidth,?(l?-?j)?*?_objHeight);
????}
????/**
?????*?事件觸發(fā)狀態(tài)。
?????*?@return
?????*/
????public?boolean?isEvent()?{
????????return?isEvent;
????}
????public?void?setEvent(boolean?isEvent)?{
????????this.isEvent?=?isEvent;
????}
????/**
?????*?隨機(jī)生成面板圖片。
?????*?
?????*/
????void?rndPannel()?{
????????later.drawImage(_img,?0,?0,?this);
????????for?(int?i?=?0;?i?<?(_COUNT?*?_CS);?i++)?{
????????????int?j?=?(int)?((double)?_CS?*?Math.random());
????????????int?k?=?(int)?((double)?_RS?*?Math.random());
????????????int?l?=?(int)?((double)?_CS?*?Math.random());
????????????int?i1?=?(int)?((double)?_RS?*?Math.random());
????????????copy(j,?k,?0,?_RS);
????????????copy(l,?i1,?j,?k);
????????????copy(0,?_RS,?l,?i1);
????????????int?j1?=?blocks[k?*?_CS?+?j];
????????????blocks[k?*?_CS?+?j]?=?blocks[i1?*?_CS?+?l];
????????????blocks[i1?*?_CS?+?l]?=?j1;
????????}
????}
????public?static?void?main(String[]?args)?{
????????Frame?frm?=?new?Frame("簡單的JAVA拼圖效果實(shí)現(xiàn)[由Loonframework框架提供]");
????????frm.setSize(480,?500);
????????frm.setResizable(false);
????????/**
?????????*?PS:ImageHelper.loadImage為Loonframework框架中helper下方法,為不依賴于javax擴(kuò)展包而開發(fā)。
?????????*?可使用ImageIO相關(guān)方法代替。
?????????*/
????????//?加載圖像。
????????Image?backImage?=?ImageHelper.loadImage("C:/backimage.jpg",?true);
????????Image?overImage?=?ImageHelper.loadImage("C:/over.gif",?true);
????????//?BlockImage中參數(shù)分別為?用于分解的拼圖,完成后顯示文字,拆分圖片為分幾列,分拆分圖片為幾行。
????????//建議使用正方形圖片作為背景圖。
????????frm.add(new?BlockImage(backImage,?overImage,?4,?4));
????????backImage?=?null;
????????overImage?=?null;
????????//?顯示窗體。
????????frm.setVisible(true);
????}
}
?
詳細(xì)操作參見源碼注釋,所用圖片如下(也可自由選取圖形):
本代碼算法支持自由成比例分隔圖像行列,效果若下:
posted on 2007-10-16 19:37 cping 閱讀(...) 評論(...) 編輯 收藏
/**
?*?<p>Title:?LoonFramework</p>
?*?<p>Description:拼圖圖像處理[未優(yōu)化](優(yōu)化算法已內(nèi)置于loonframework-game框架中。)</p>
?*?<p>Copyright:?Copyright?(c)?2007</p>
?*?<p>Company:?LoonFramework</p>
?*?@author?chenpeng??
?*?@email:ceponline@yahoo.com.cn?
?*?@version?0.1
?*/
import?java.awt.Canvas;
import?java.awt.Color;
import?java.awt.Event;
import?java.awt.Frame;
import?java.awt.Graphics;
import?java.awt.Image;
import?java.awt.MediaTracker;
import?java.awt.image.BufferedImage;
import?org.loon.framework.game.helper.ImageHelper;
public?class?BlockImage?extends?Canvas?{
????/**
?????*?
?????*/
????private?static?final?long?serialVersionUID?=?1L;
????private?Image?_img;
????private?Image?_img2;
????private?Graphics?bg;
????private?Image?backimage;
????private?int?blocks[];
????private?boolean?isEvent;
????private?MediaTracker?mt;
????private?int?_width;
????private?int?_height;
????private?int?_RS;
????private?int?_CS;
????private?Image?screen?=?null;
????private?Graphics?later?=?null;
????private?int?_objWidth;
????private?int?_objHeight;
????private?int?_COUNT;
????/**
?????*?析構(gòu)函數(shù),內(nèi)部調(diào)用init方法。
?????*?
?????*?@param?bImage
?????*?@param?overImage
?????*?@param?cs
?????*?@param?rs
?????*/
????public?BlockImage(Image?bImage,?Image?overImage,?int?cs,?int?rs)?{
????????init(bImage,?overImage,?cs,?rs);
????}
????/**
?????*?初始化拼圖參數(shù)。
?????*?
?????*?@param?bImage
?????*?@param?overImage
?????*?@param?cs
?????*?@param?rs
?????*/
????public?void?init(Image?bImage,?Image?overImage,?int?cs,?int?rs)?{
????????//?列數(shù)
????????_CS?=?cs;
????????//?行數(shù)
????????_RS?=?rs;
????????//?加載拼圖用圖像。
????????_img?=?bImage;
????????//?獲得實(shí)際窗體寬。
????????_width?=?_img.getWidth(null);
????????//?獲得實(shí)際窗體高。
????????_height?=?_img.getHeight(null);
????????//?獲得單塊圖像寬。
????????_objWidth?=?_width?/?_CS;
????????//?獲得單塊圖像高。
????????_objHeight?=?_height?/?_RS;
????????//?本程序直接使用backimage上一塊圖形區(qū)域緩沖選擇項(xiàng),所以實(shí)際背景圖像高=圖形高+額外圖塊高。
????????backimage?=?new?BufferedImage(_width,?_height?+?_objHeight,?1);
????????//?獲得生成的圖形
????????later?=?backimage.getGraphics();
????????//?再創(chuàng)建一塊圖像區(qū)域,作為圖像緩存用。
????????screen?=?new?BufferedImage(_width,?_height,?1);
????????//?獲得緩存的圖形
????????bg?=?screen.getGraphics();
????????//?獲得等同圖片總數(shù)的數(shù)組。
????????_COUNT?=?_CS?*?_RS;
????????blocks?=?new?int[_COUNT];
????????//?初始化為非點(diǎn)擊。
????????isEvent?=?false;
????????//?加載完成拼圖的顯示圖。
????????_img2?=?overImage;
????????//?初始化圖塊參數(shù)。
????????for?(int?i?=?0;?i?<?_COUNT;?i++)?{
????????????blocks[i]?=?i;
????????}
????????//?載入MediaTracker,用以跟蹤圖像狀態(tài)。
????????mt?=?new?MediaTracker(this);
????????//?加載被跟蹤的圖像。
????????mt.addImage(_img,?0);
????????mt.addImage(_img2,?0);
????????//?同步載入。
????????try?{
????????????mt.waitForID(0);
????????}?catch?(InterruptedException?interruptedexception)?{
????????????return;
????????}
????????//?隨機(jī)生成圖像面板內(nèi)容。
????????rndPannel();
????}
????/**
?????*?描繪窗體圖像。
?????*/
????public?void?paint(Graphics?g)?{
????????//?檢查圖像載入。
????????if?(mt.checkID(0))?{
????????????//?描繪底層背景。
????????????bg.drawImage(backimage,?0,?0,?null);
????????????//?判斷是否觸發(fā)完成事件。
????????????if?(!isEvent)?{
????????????????//?設(shè)置背景色。
????????????????bg.setColor(Color.black);
????????????????//?循環(huán)繪制小圖片于背景緩存中。
????????????????for?(int?i?=?0;?i?<?_CS;?i++)?{
????????????????????for?(int?j?=?0;?j?<?_RS;?j++)
????????????????????????bg.drawRect(i?*?_objWidth,?j?*?_objHeight,?_objWidth,
????????????????????????????????_objHeight);
????????????????}
????????????}
????????????//?僅當(dāng)完成事件觸發(fā)并且有勝利圖片時(shí),載入完成提示。
????????????if?(isEvent?&&?_img2?!=?null)?{
????????????????bg.drawImage(_img2,?0,?0,?null);
????????????}
????????}
????????//?舉凡繪制圖像時(shí),應(yīng)遵循顯示圖像僅繪制一次的基本原則,一次性的將背景繪制到窗體。
????????//?簡單來說,也就是采取[雙緩存]的方式,所有復(fù)雜操作皆在緩存區(qū)完成,也只有這樣才能避免產(chǎn)生延遲閃爍。
????????g.drawImage(screen,?0,?0,?this);
????????g.dispose();
????}
????/**
?????*?變更圖像。
?????*/
????public?void?update(Graphics?g)?{
????????paint(g);
????}
????/**
?????*?鼠標(biāo)點(diǎn)擊事件。
?????*/
????public?boolean?mouseDown(Event?event,?int?i,?int?j)?{
????????if?(isEvent)
????????????return?true;
????????//?換算點(diǎn)擊位置與小圖片。
????????int?k?=?i?/?_objWidth;
????????int?l?=?j?/?_objHeight;
????????copy(0,?0,?0,?_RS);
????????copy(k,?l,?0,?0);
????????copy(0,?_RS,?k,?l);
????????int?i1?=?blocks[0];
????????//?換算選中圖片存儲區(qū)。
????????blocks[0]?=?blocks[l?*?_CS?+?k];
????????blocks[l?*?_CS?+?k]?=?i1;
????????int?j1;
????????for?(j1?=?0;?j1?<?_COUNT;?j1++)?{
????????????if?(blocks[j1]?!=?j1)?{
????????????????break;
????????????}
????????}
????????if?(j1?==?_COUNT)
????????????isEvent?=?true;
????????repaint();
????????return?true;
????}
????public?boolean?mouseUp(Event?event,?int?i,?int?j)?{
????????return?true;
????}
????public?boolean?mouseDrag(Event?event,?int?i,?int?j)?{
????????return?true;
????}
????/**
?????*?copy換算后的圖像區(qū)域。
?????*?
?????*?@param?i
?????*?@param?j
?????*?@param?k
?????*?@param?l
?????*/
????void?copy(int?i,?int?j,?int?k,?int?l)?{
????????later.copyArea(i?*?_objWidth,?j?*?_objHeight,?_objWidth,?_objHeight,
????????????????(k?-?i)?*?_objWidth,?(l?-?j)?*?_objHeight);
????}
????/**
?????*?事件觸發(fā)狀態(tài)。
?????*?@return
?????*/
????public?boolean?isEvent()?{
????????return?isEvent;
????}
????public?void?setEvent(boolean?isEvent)?{
????????this.isEvent?=?isEvent;
????}
????/**
?????*?隨機(jī)生成面板圖片。
?????*?
?????*/
????void?rndPannel()?{
????????later.drawImage(_img,?0,?0,?this);
????????for?(int?i?=?0;?i?<?(_COUNT?*?_CS);?i++)?{
????????????int?j?=?(int)?((double)?_CS?*?Math.random());
????????????int?k?=?(int)?((double)?_RS?*?Math.random());
????????????int?l?=?(int)?((double)?_CS?*?Math.random());
????????????int?i1?=?(int)?((double)?_RS?*?Math.random());
????????????copy(j,?k,?0,?_RS);
????????????copy(l,?i1,?j,?k);
????????????copy(0,?_RS,?l,?i1);
????????????int?j1?=?blocks[k?*?_CS?+?j];
????????????blocks[k?*?_CS?+?j]?=?blocks[i1?*?_CS?+?l];
????????????blocks[i1?*?_CS?+?l]?=?j1;
????????}
????}
????public?static?void?main(String[]?args)?{
????????Frame?frm?=?new?Frame("簡單的JAVA拼圖效果實(shí)現(xiàn)[由Loonframework框架提供]");
????????frm.setSize(480,?500);
????????frm.setResizable(false);
????????/**
?????????*?PS:ImageHelper.loadImage為Loonframework框架中helper下方法,為不依賴于javax擴(kuò)展包而開發(fā)。
?????????*?可使用ImageIO相關(guān)方法代替。
?????????*/
????????//?加載圖像。
????????Image?backImage?=?ImageHelper.loadImage("C:/backimage.jpg",?true);
????????Image?overImage?=?ImageHelper.loadImage("C:/over.gif",?true);
????????//?BlockImage中參數(shù)分別為?用于分解的拼圖,完成后顯示文字,拆分圖片為分幾列,分拆分圖片為幾行。
????????//建議使用正方形圖片作為背景圖。
????????frm.add(new?BlockImage(backImage,?overImage,?4,?4));
????????backImage?=?null;
????????overImage?=?null;
????????//?顯示窗體。
????????frm.setVisible(true);
????}
}
?
詳細(xì)操作參見源碼注釋,所用圖片如下(也可自由選取圖形):
本代碼算法支持自由成比例分隔圖像行列,效果若下:
posted on 2007-10-16 19:37 cping 閱讀(...) 評論(...) 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/cping1982/archive/2007/10/16/2258107.html
總結(jié)
以上是生活随笔為你收集整理的JAVA实现拼图游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu下NDK环境配置
- 下一篇: 融云聊天 php_thinkphp整合系