日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA实现拼图游戏

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA实现拼图游戏 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
JAVA實現(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;

????????
//?獲得實際窗體寬。
????????_width?=?_img.getWidth(null);
????????
//?獲得實際窗體高。
????????_height?=?_img.getHeight(null);
????????
//?獲得單塊圖像寬。
????????_objWidth?=?_width?/?_CS;
????????
//?獲得單塊圖像高。
????????_objHeight?=?_height?/?_RS;

????????
//?本程序直接使用backimage上一塊圖形區(qū)域緩沖選擇項,所以實際背景圖像高=圖形高+額外圖塊高。
????????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];
????????
//?初始化為非點擊。
????????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;
????????}
????????
//?隨機生成圖像面板內(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ā)并且有勝利圖片時,載入完成提示。
????????????if?(isEvent?&&?_img2?!=?null)?{
????????????????bg.drawImage(_img2,?
0,?0,?null);
????????????}
????????}
????????
//?舉凡繪制圖像時,應(yīng)遵循顯示圖像僅繪制一次的基本原則,一次性的將背景繪制到窗體。
????????
//?簡單來說,也就是采取[雙緩存]的方式,所有復(fù)雜操作皆在緩存區(qū)完成,也只有這樣才能避免產(chǎn)生延遲閃爍。
????????g.drawImage(screen,?0,?0,?this);
????????g.dispose();
????}

????
/**
?????*?變更圖像。
?????
*/
????
public?void?update(Graphics?g)?{
????????paint(g);
????}

????
/**
?????*?鼠標(biāo)點擊事件。
?????
*/
????
public?boolean?mouseDown(Event?event,?int?i,?int?j)?{

????????
if?(isEvent)
????????????
return?true;
????????
//?換算點擊位置與小圖片。
????????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;
????}

????
/**
?????*?隨機生成面板圖片。
?????*?
?????
*/
????
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拼圖效果實現(xiàn)[由Loonframework框架提供]");
????????frm.setSize(
480,?500);
????????frm.setResizable(
false);
????????
/**
?????????*?PS:ImageHelper.loadImage為Loonframework框架中helper下方法,為不依賴于javax擴展包而開發(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);

????}

}
?

詳細操作參見源碼注釋,所用圖片如下(也可自由選取圖形):






本代碼算法支持自由成比例分隔圖像行列,效果若下:



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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。