Java拼圖游戲面向?qū)ο笳n程設(shè)計報告.doc
《Java拼圖游戲面向?qū)ο笳n程設(shè)計報告.doc》由會員分享,可在線閱讀,更多相關(guān)《Java拼圖游戲面向?qū)ο笳n程設(shè)計報告.doc(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。
姓 名Name學(xué) 號Student No.20137045班 級Class代碼總行數(shù)Code Lines222項目名稱Item1實驗?zāi)康谋敬握n程設(shè)計旨在通過一個完整項目的開發(fā),鞏固面向?qū)ο蟪绦蛟O(shè)計、軟件工程、數(shù)據(jù)庫技術(shù)等課程的相關(guān)知識,加深學(xué)生對Java語言的理解,尤其是對面向?qū)ο笏枷?、Java編碼規(guī)范、JDBC訪問數(shù)據(jù)庫的理解,使學(xué)生進(jìn)一步掌握環(huán)境構(gòu)建、代碼編寫、文檔閱讀與理解、文檔編寫、軟件測試、發(fā)行與部署等技能,進(jìn)一步提高學(xué)生的學(xué)習(xí)能力、理解能力、表達(dá)能力及溝通能力。2實驗內(nèi)容本次課程設(shè)計選定的實驗項目是使用JAVA語言編寫一個拼圖游戲并實現(xiàn)其基本功能。不用自己手動切割圖片,再進(jìn)行加載。而是應(yīng)用類方法在內(nèi)存中進(jìn)行圖片切割和加載,方便了用戶的使用。 利用了Graphics中的public abstract boolean drawImage()方法把 img 中由 (sx1, sy1)(sx2, sy2)指定的矩形區(qū)域畫到 observer 中由(dx1, dy1)(dx2, dy2)指定的矩形區(qū)域內(nèi)進(jìn)行構(gòu)思拼圖游戲的具體實現(xiàn)。 導(dǎo)入了一個可播放背景音樂的jar包,在玩游戲時可以欣賞背景音樂。3.類圖4.運行界面圖1、游戲初始界面圖2、游戲運行界面圖3、拼圖成功界面5.關(guān)鍵代碼(要求在類的定義以及方法定義的前面給出相關(guān)描述信息)/定義一個Pintu類public class Jpgsaw extends JFrameprivate Image image, buff; /原始圖片,緩存圖片 private int map = 0, 1, 2, 3, 4, 5, 6, 7, 8 ; /定義數(shù)組map,給分割后的圖片標(biāo)號 private Point point = new Point(2, 2); /記錄第九塊圖片位置 private int sx; /分割后每一個圖片的寬度 private int sy; /分割后每一個圖片的高度 private Canvas canvas; /加載圖片容器,定義可以顯式定位子元素使用坐標(biāo)是相對 Canvas 區(qū)域的區(qū)域,繪制圖形 private Graphics gs; /gs畫出Canvas圖片坐標(biāo) private Graphics gb; /gb畫出buff圖像 private boolean isRunning = false; /游戲是否正在進(jìn)行 private JButton start = new JButton(開始新的游戲); / 按鈕1 private JButton show = new JButton(顯示正確圖片); /按鈕2 private JTextArea showStep = new JTextArea(顯示步驟);/設(shè)置步驟顯示 private JPanel panel = new JPanel(); /一般輕量級面板容器,裝在上面2個按鈕 private int steps = 0; / 記錄移動的步驟 public Jpgsaw(String title) /構(gòu)造方法,初始化變量 super(title);/調(diào)用了當(dāng)前類Jpgsaw的父類JFrame的構(gòu)造方法 try /異常拋出 image = ImageIO.read(new File(gg.jpg); /裝載圖片 catch (IOException e) /捕獲自定義的異常 e.printStackTrace(); initScreen(); /用此方法來初始化canvas,由于canvas 初始化較復(fù)雜,所以單獨寫一個方法 buff = new BufferedImage(715, 381, BufferedImage.TYPE_INT_BGR);/Image的一個子類,BufferedImage生成的圖片在內(nèi)存里有一個圖像緩沖區(qū),利用這個緩沖區(qū)我們可以很方便的操作這個圖片 gb = buff.getGraphics();/存在于Image類中,存在于緩沖器中的圖片,設(shè)置坐標(biāo) sx = image.getWidth(this) / 3;/圖片分割后每一個圖片的寬度 sy = image.getHeight(this) / 3;/圖片分割后每一個圖片的高度 setLayout(new BorderLayout();/設(shè)置此布局方法,加入控件 add(panel, BorderLayout.SOUTH);/布置容器的邊框布局,它可以對容器組件進(jìn)行安排,并調(diào)整其大小 add(canvas, BorderLayout.CENTER); panel.setLayout(new GridLayout(1, 4);/把組件按指定的幾行幾列分開,添加其他組件時,會按添加的順序挨個添加到該組件上 panel.add(start); panel.add(show); panel.add(showStep); showStep.setEditable(false);/步驟默認(rèn)false,使調(diào)用這個函數(shù)的控件不能被編輯 showStep.setFont(new Font(黑體, Font.PLAIN, 16);/設(shè)置字體 setSize(720, 425); setResizable(false);/表示生成的窗體大小,不可改變大小 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/執(zhí)行關(guān)閉按鈕,關(guān)閉窗體 /具體實現(xiàn)Canvas,進(jìn)行初始化 void initScreen() canvas = new Canvas() public void paint(Graphics g) /覆寫canvas的paint 方法 gs = getGraphics(); /得到Canvas的Graphics if (isRunning) drawScreen();/運行,調(diào)用此方法 else g.drawImage(image, 0, 0, this);/在指定的位置使用原始物理大小繪制指定的 Image g.setColor(Color.gray);/設(shè)置前景顏色,變?yōu)榛疑?; canvas.addMouseListener(new MouseAdapter() /添加鼠標(biāo)事件監(jiān)聽器 /覆寫mousePressed 方法,實現(xiàn)鼠標(biāo)點擊時,圖片移動 public void mousePressed(MouseEvent me) if (!isRunning) return; / 如果未運行,說明圖片未分割,直接返回 int x = me.getX() / sx;/判斷鼠標(biāo)點擊的圖片在map中的編號 int y = me.getY() / sy; int fx = (int) point.getX();/記錄第九塊圖片(未顯示圖片)的位置 int fy = (int) point.getY(); int canMove = Math.abs(fx - x) + Math.abs(fy - y); / 如鼠標(biāo)點擊位置與第九塊圖片(可移動的位置)相鄰,則canMove 必為 1 if (canMove != 1 ) return; / canMove 不為1,不能移動圖片 mapfxfy = mapxy; /點擊圖片坐標(biāo) 賦給第九塊圖片 mapxy = 8; /第九塊圖片給掉 點擊圖片 point.setLocation(x, y); /point 坐標(biāo)改變 drawScreen(); /重繪屏幕,實現(xiàn)圖片移動 showStep.setText(移動步驟: + +steps); /步驟加一 ); /為Start按鈕添加事件 start.addActionListener(new ActionListener() SuppressWarnings(deprecation)public void actionPerformed(ActionEvent ae) initMap(); drawScreen(); isRunning = true; steps = 0; showStep.setText(移動步驟: + steps); show.setLabel(顯示正確圖片); ); /為show按鈕添加事件 show.addActionListener(new ActionListener() SuppressWarnings(deprecation)public void actionPerformed(ActionEvent ae) if (show.getLabel().equals(繼續(xù)游戲) drawScreen(); isRunning = true; show.setLabel(顯示正確圖片); else gs.drawImage(image, 0, 0, canvas); isRunning = false; show.setLabel(繼續(xù)游戲); ); /容器內(nèi)游戲運行時圖片的顯示方法 void initMap() long time = System.nanoTime();/得到系統(tǒng)當(dāng)前時間 作為隨機(jī)數(shù)種子 java.util.Random rnd = new java.util.Random(time); int temp, x1, y1, x2, y2; /隨機(jī)交換圖片 for (int i = 0; i 100; i+) x1 = rnd.nextInt(3); x2 = rnd.nextInt(3); y1 = rnd.nextInt(3); y2 = rnd.nextInt(3); temp = mapx1y1; mapx1y1 = mapx2y2; mapx2y2 = temp; outer: /標(biāo)記8號圖片(即空白圖片) for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) if (mapij = 8) point.setLocation(i, j); break outer;/跳轉(zhuǎn)到帶有空白標(biāo)號的行 /把整個canvas上的所有對象都繪制一遍 void drawScreen() int sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2; int t1, t2; gb.setColor(Color.white); gb.clearRect(0, 0, sx * 3, sy * 3);/清空整個緩沖區(qū)圖片 for (int x = 0; x 3; x+)/圖片在橫行的顯示 for (int y = 0; y 3; y+)/圖片在列上的顯示 if(mapxy != 8) / 目的地址 dx1 = x * sx; dy1 = y * sy; / 移動的左上角坐標(biāo) dx2 = dx1 + sx - 1; dy2 = dy1 + sy - 1; / 移動的右下角坐標(biāo) / 源地址 t1 = mapxy % 3 ; t2 = mapxy / 3 ; sx1 = t1 * sx; sy1 = t2 * sy; / 移動的左上角圖標(biāo) sx2 = sx1 + sx - 1; sy2 = sy1 + sy - 1; / 移動的右下角坐標(biāo) gb.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, Color.white, canvas);/繪制緩沖區(qū)圖片 gs.drawImage(buff, 0, 0, canvas);/將緩沖區(qū)圖片繪制到 canvas 上 /主方法,實現(xiàn)Jpgsaw類的使用,運行游戲 public static void main(String args) Jpgsaw pintu = new Jpgsaw(JpgsawGame); new Thread().start();/新建一個ThreadStart對象并傳入一個方法給線程調(diào)用 pintu.setVisible(true);/最后調(diào)用,避免組件不顯示,利用線程設(shè)置組件可見 /*播放背景音樂*/public class PlayMe public static void playMe() try String file = /JpgSaw/JpgsawGame/src/test.mp3; /音樂文件路徑 FileInputStream fis = new FileInputStream(file); /路徑設(shè)置 BufferedInputStream bis = new BufferedInputStream(fis);/帶有緩沖區(qū)的輸入流 new Player(bis).play(); /jar包中定義好的播放方法 catch (Exception e) System.out.print(ERROR + e); 6上機(jī)調(diào)試及問題分析1、圖片的存放位置出現(xiàn)錯誤,圖片引用路徑報錯。通過修改路徑,放至同一文件夾下,圖片插入成功。2、圖片導(dǎo)入后,無法自動分開圖片。上網(wǎng)查詢邏輯算法,得到新的圖片分區(qū)。3、由于圖片為隨機(jī)打亂,如果拼的時間較長,只好重新開始游戲。4、代碼中:new Thread(pintu).start();報錯,pintu方法未定義。去掉pintu,改為:new Thread().start();程序運行正常。5、圖片引入之后,分開的圖片,沒有空白處。使用private Canvas canvas; /加載圖片容器,解決了去掉去片中的一塊。6、不足之處,音樂播放一遍后自動關(guān)閉。7心得體會及建議本次實訓(xùn)鞏固了我對前續(xù)課程所學(xué)的知識,加深了我對Java的理解,尤其是對面向?qū)ο笏枷?、Java編程思想、Java編程規(guī)范、Java API文檔的理解,讓我進(jìn)一步掌握了環(huán)境構(gòu)建、代碼編寫、文檔閱讀與理解、文檔編寫等技能,進(jìn)一步提高了學(xué)習(xí)能力、理解能力、表達(dá)能力、溝通能力。由于知識和能力的限制,雖然有悉心準(zhǔn)備和精心設(shè)計修改制作,本程序設(shè)計仍然難免有很多不足和不完善之處。會更加努力使本程序不斷改進(jìn),日臻完善。通過這次的實訓(xùn)我個人的實際操作能力得到了很大一步的提高,并且在思考問題方面也比以前考慮的更全面。這次實訓(xùn)我感覺非常的充足,在這次的實訓(xùn)中,學(xué)到了許多知識,自己不會的問題通過老師、同學(xué)的講解和查詢資料,得到了解決,從中也學(xué)到了許多相關(guān)的知識,擴(kuò)大了自己的知識面,對我自己來說是一個提高和鍛煉的機(jī)會,對以后的學(xué)會添加了信心。在本次實訓(xùn)過程中遇到很多編程技術(shù)層次的問題,老師和同學(xué)都給予了耐心的指導(dǎo),在此表示由衷的感謝。通過實訓(xùn),我認(rèn)識到自己還有很多的知識沒學(xué)好,基礎(chǔ)知識沒理清,而且許多東西,還要去翻書,去上網(wǎng)搜索。而且遇到一些小錯誤運行不出來,就會煩躁不安,覺得有些自暴自棄或者抱怨項目的變態(tài),以后要克服,盡量保持一顆良好的心態(tài),這次實訓(xùn)給我留下了深刻的影響,感謝這次實訓(xùn)帶給我的進(jìn)步。成 績Score教師簽字 日期- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Java 拼圖游戲 面向 對象 課程設(shè)計 報告
鏈接地址:http://ioszen.com/p-9333780.html