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