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