JAVA拼圖游戲課程設(shè)計(jì).doc
《JAVA拼圖游戲課程設(shè)計(jì).doc》由會員分享,可在線閱讀,更多相關(guān)《JAVA拼圖游戲課程設(shè)計(jì).doc(44頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
學(xué)年論文 (JAVA面向?qū)ο蟪绦蛟O(shè)計(jì) 2015-2016 第二學(xué)期) 題 目: JAVA課程設(shè)計(jì) 作 者: 陳炳宏 所在學(xué)院: 信息科學(xué)與工程學(xué)院 專業(yè)年級: 信息安全14-1 指導(dǎo)教師: 楊晴雯 職 稱: 副教授 2016年6月 4 日 基于JAVA的拼圖游戲的設(shè)計(jì) 摘要 拼圖游戲是一款非常經(jīng)典的小游戲,因?yàn)樗容^簡單有趣,老少皆宜。拼圖游戲的設(shè)計(jì)對每一個(gè)Java語言設(shè)計(jì)者進(jìn)行語言提高和進(jìn)階都是一個(gè)很好的鍛煉機(jī)會。 拼圖游戲的設(shè)計(jì)比較復(fù)雜,它涉及面廣、牽涉方面多,如果不好好考慮和設(shè)計(jì),將難以成功開發(fā)出這個(gè)游戲。在這個(gè)游戲的設(shè)計(jì)中,牽涉到圖形界面的顯示與更新、數(shù)據(jù)的收集與更新,并且在這個(gè)游戲的開發(fā)中,還要應(yīng)用類的繼承機(jī)制以及一些設(shè)計(jì)模式。因此,如何設(shè)計(jì)和開發(fā)好這個(gè)拼圖游戲,對于提高Java開發(fā)水平和系統(tǒng)的設(shè)計(jì)能力有極大的幫助。在設(shè)計(jì)開發(fā)過程中,需要處理好各個(gè)類之間的繼承關(guān)系,還要處理各個(gè)類相應(yīng)的封裝,并且還要協(xié)調(diào)好各個(gè)模塊之間的邏輯依賴關(guān)系和數(shù)據(jù)通信關(guān)系。 關(guān)鍵詞:拼圖游戲 Java語言 開發(fā) The design of JAVA software based on the puzzle Abstract: Jigsaw puzzle is a very classic game, because it is easy and fun, both old and young, are more suitable. Jigsaw design language for each Java language designers to improve and advance is an excellent exercise opportunities. Puzzle design is more complex, its scope, and involves many more, if you do not think and design, would be difficult to successfully developed this game. In the design of the game involves display of the graphical interface and updating, data is collected and updated, and in the development of this game, class inheritance mechanism, and some design patterns you want to apply. Therefore, how to design and develop this jigsaw puzzle, for raising the level of Java development, and system design capabilities are of great help. During the process of design and development, you need to handle the inheritance relationships between the classes, also have to deal with each type of appropriate packaging, and also to coordinate the various logical dependencies between modules and data communication. Keywords:Jigsaw puzzle Java language develop 目錄 一、需求分析 4 1.程序分析 4 2.執(zhí)行方式 4 3.程序執(zhí)行的命令包括 4 4.測試數(shù)據(jù) 5 二、概要設(shè)計(jì) 7 1.拼圖游戲流程圖 7 2.設(shè)計(jì)思路 7 3.主要類文件說明 8 三、詳細(xì)設(shè)計(jì) 9 1.建立MenuFrame菜單首頁類 9 2.建立CardFrame首頁說明類 10 3.建立ShowImage目標(biāo)圖顯示類 11 4.建立Grades分?jǐn)?shù)記錄類 11 5.建立split原圖劃分類移動點(diǎn)擊事件類 12 6.建立ButtonClick拼圖移動點(diǎn)擊事件類 13 7.建立Gameover判斷游戲結(jié)束類 14 8.建立Puzzle拼圖游戲主類 14 四、調(diào)試分析 16 1.程序的運(yùn)行 16 2.游戲測試 16 五、用戶手冊 17 1.游戲三個(gè)狀態(tài) 17 2.游戲菜單選項(xiàng) 18 3.游戲提示框 20 六、測試結(jié)果 22 七、附錄(源碼) 24 課程設(shè)計(jì)題目:基于JAVA的拼圖游戲 1、 需求分析 1.程序分析 本游戲是一個(gè)Java語言的拼圖游戲,在eclipse上使用JAVA語言編寫并且利用Java Swing設(shè)計(jì)顯示。拼圖中有一個(gè)格子是空的,其他格子內(nèi)隨機(jī)放置由目標(biāo)圖片切割成的若干個(gè)小圖片,圖片按照不同難度結(jié)合目標(biāo)圖片分辨率進(jìn)行切割。用戶通過點(diǎn)擊空位置中周圍的任何非空圖塊來移動非空圖塊到空位置,一直重復(fù)直到拼回目標(biāo)圖片的樣子后游戲成功,記錄名次分?jǐn)?shù)。 2.執(zhí)行方式 在開始游戲之前,可以選擇游戲等級后再點(diǎn)擊“開始”菜單里的“新游戲”,進(jìn)行拼圖游戲,被打亂的目標(biāo)圖片依次設(shè)置到拼圖中的各個(gè)按鈕中,利用按鈕的點(diǎn)擊事件,點(diǎn)擊可移動的,設(shè)置按鈕背景圖片為空,臨近按鈕設(shè)置背景圖片為剛點(diǎn)擊按鈕背景圖片,重復(fù)以往,直到方塊一行一行的按圖片的原始樣子拼好即可完成該游戲。 游戲拼完后,會彈出一個(gè)“信息”框,顯示你玩游戲所用的步數(shù)與時(shí)間,點(diǎn)擊“確定”后,會彈出一個(gè)“輸入”框,可以在里面輸入游戲者的姓名,單擊“確定”后會彈出游戲的記錄框。 3.程序執(zhí)行的命令包括 (1) 菜單開始: 包括菜單項(xiàng)新游戲,游戲記錄,退出游戲,顯示背景圖片; (2) 菜單選擇: 包括菜單項(xiàng)等級選擇和背景圖片選擇,其中等級選擇包括難、中、易三個(gè)子菜單項(xiàng),背景圖片包含已添加到images文件夾下的圖片菜單項(xiàng); (3) 菜單關(guān)于: 包含幫助和關(guān)于兩個(gè)菜單項(xiàng); (4) 按鈕點(diǎn)擊事件: 用于接收按鈕圖片移動請求并做出相應(yīng)移動; (5) 游戲記錄存儲: 游戲結(jié)束后,在不同難度下,如果打破紀(jì)錄的記錄會被寫入Game.rc文件中; (6) panel面板顯示: 用于不同頁面間的切換顯示; 4.測試數(shù)據(jù) (1) 目標(biāo)圖片如圖1: 圖1 目標(biāo)圖片 (2) 難度:難度易游戲如圖2: 圖2 難度易游戲圖片 (3) 難度普通游戲如圖3: 圖3 難度普通游戲圖片 (4) 難度難游戲如圖4: 圖4 難度難游戲圖片 2、 概要設(shè)計(jì) 1. 拼圖游戲流程圖 游戲結(jié)束 窗體顯示 圖片放置 動作事件的監(jiān)聽 事件響應(yīng) 是 否 開始游戲 拼圖完整 圖5 JAVA拼圖游戲框架圖 2. 設(shè)計(jì)思路 為實(shí)現(xiàn)上述游戲功能,首先需要寫出MenuFrame首頁,在該布局里添加基礎(chǔ)選項(xiàng)和標(biāo)簽,并添加到程序首頁布局上,然后CardFrame繼承MeauFrame并設(shè)置程序說明和焦點(diǎn)事件以完成暫停繼續(xù),接著設(shè)計(jì)ShowImage類用于顯示原來圖像,設(shè)計(jì)Grades類來記錄游戲者游戲信息以及最終成績并借助Arg傳遞到Game.rc文件中,其中包含Data類用來輔助Grades保存數(shù)據(jù),設(shè)計(jì)split類來劃分圖塊,接著設(shè)計(jì)ButtonClick來實(shí)現(xiàn)圖片的點(diǎn)擊移動事件,其中引用point類輔助設(shè)置移動,并引用設(shè)計(jì)GameOver實(shí)現(xiàn)游戲過程中的計(jì)時(shí)、暫停、結(jié)束等功能并返回,最后設(shè)計(jì)Puzzle主類繼承于CarFrame類用于添加上述各種點(diǎn)擊事件并調(diào)用相關(guān)功能,包括在模板顯示由split類劃分的傳到拼圖矩陣后的整個(gè)拼圖圖塊,最后完善整個(gè)功能需要。 3. 主要類文件說明 本程序包含8個(gè)主要模塊: 1) ButtonClick.class 該類主要是實(shí)現(xiàn)鼠標(biāo)事件,讓玩家在用鼠標(biāo)點(diǎn)擊能夠移動拼圖的小圖片,移動到周圍空格的地方 2) CardFrame.class 該類主要實(shí)現(xiàn),初始界面的相關(guān)提示信息。 3)GameOver.class 該類主要實(shí)現(xiàn)游戲過程中的計(jì)時(shí)、暫停、結(jié)束等功能,游戲結(jié)束時(shí)的信息。 4) split.class 該類主要實(shí)現(xiàn)圖片的提取與切割的功能。 5)Grades.class 該類主要實(shí)現(xiàn)成績記錄的初始化,在拼圖成功后可記錄游戲者姓名的功能,并直接提取等級、步數(shù)與時(shí)間等信息的功能。保存成績記錄信息,以便游戲者查看。 6)MenuFrame.class 該類主要實(shí)現(xiàn)有主菜單與子菜單的功能。并設(shè)置相關(guān)的快捷鍵功能。 7)Puzzle.class 該類是該游戲程序的主程序,從游戲界面大小到游戲過程中出現(xiàn)的所有信息框等相關(guān)功能都到了實(shí)現(xiàn),調(diào)用相關(guān)類實(shí)現(xiàn)其功能。 8)ShowImage.class 該類用于新建窗口顯示目標(biāo)圖像。 3、 詳細(xì)設(shè)計(jì) 1.建立MenuFrame菜單首頁類 菜單首頁的建立完成了以下設(shè)計(jì),設(shè)置主頁菜單結(jié)構(gòu)、設(shè)置菜單位于桌面位置和退出方式、設(shè)置快捷鍵、點(diǎn)擊事件選擇難度,默認(rèn)普通、添加開始子菜單點(diǎn)擊事件好快捷鍵、添加難度選擇子菜單項(xiàng)并調(diào)用點(diǎn)擊事件、添加文件選擇點(diǎn)擊事件、關(guān)于菜單設(shè)置、圖片預(yù)覽點(diǎn)擊事件設(shè)置更新,很好的構(gòu)建了整個(gè)游戲的架構(gòu),下面列出該類的菜單結(jié)構(gòu)和一些重要的方法代碼:(省略非關(guān)鍵代碼,可在文末源代碼查看) public abstract class MenuFrame extends JFrame{//設(shè)置主頁菜單結(jié)構(gòu) ....... private JMenu [] m = { new JMenu("開始(B)").......}; private JMenu [] mm = { new JMenu("等級(L)").......}; public MenuFrame(){//設(shè)置菜單位于桌面位置和退出方式 super("拼圖游戲");addMenu(); ....... this.getToolkit().getScreenSize().width/3 - this.getWidth()/3}; private void addMenu(){//設(shè)置快捷鍵 m[0].setMnemonic(B);initMenuBegin() .......} private void menuLevelClick(String nm){//點(diǎn)擊事件選擇難度,默認(rèn)普通 type = 3;if (nm.equals("困難")).......} private void initMenuBegin(){//添加開始子菜單點(diǎn)擊事件好快捷鍵 JMenuItem [] mI = { new JMenuItem("新游戲(N)").......}; mI[0].setMnemonic(N); ....... mI[0].addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){menuNewClick();}}); mI[1],mI[2].......m[0].add(mI[0]);.......} private void initMenuLevel(){//添加難度選擇子菜單項(xiàng)并調(diào)用點(diǎn)擊事件 JRadioButtonMenuItem [] mi = { new JRadioButtonMenuItem("困難").......}; for (int i = 0; i < 3; i++){ mi[i].addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ JRadioButtonMenuItem mi = (JRadioButtonMenuItem)e.getSource(); menuLevelClick(mi.getText());}});}.......} public void initMenuBackground(){//添加文件選擇點(diǎn)擊事件 ....... File [] list = bkg.listFiles();int j = 0; for (int i = 0; i < list.length; i++){ if (!list[i].isFile() || list[i].isHidden())continue; mi = new JRadioButtonMenuItem(list[i].getName()); mi.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){.......}} private void initMenuAbout(){//關(guān)于菜單設(shè)置 JMenuItem [] mI = { new JMenuItem("幫助(H)"), new JMenuItem("關(guān)于(A)")}....... mI[0].addActionListener(new ActionListener().......} public void updateMenuBegin(){//圖片預(yù)覽點(diǎn)擊事件設(shè)置更新 if (!update){{m[0].remove(2);return;} JMenuItem mi = new JMenuItem("圖片預(yù)覽(S)"); mi.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){menuShowClick();); .......} 2. 建立CardFrame首頁說明類 首頁說明類繼承于首頁菜單類,并加以完善,并且設(shè)置了聚集事件,以完成暫停和繼續(xù)完成,最后定義聚焦事件為無限次。下面列出該類的說明結(jié)構(gòu)和一些重要的方法代碼:(省略非關(guān)鍵代碼,可在文末源代碼查看) public abstract class CardFrame extends MenuFrame{ //繼承于首頁菜單類,并加以完善 ....... public CardFrame(){//設(shè)置首頁提示標(biāo)簽 ....... JLabel label; label = new JLabel("請輸入你的圖片到"); label.setBounds(10, 15, 190, 30); ....... JButton button = new JButton("繼 續(xù)"); button.addActionListener(new ActionListener(){//設(shè)置聚集事件,以完成暫停和繼續(xù) public void actionPerformed(ActionEvent e){ FrameGetFocus();}}); panel[1].add(button, BorderLayout.CENTER); con.add(panel[0], "游戲"); con.add(panel[1], "暫停"); card.show(con, "游戲"); this.addWindowListener(new WindowAdapter(){ public void windowDeactivated(WindowEvent e){ FrameLostFocus();}});} protected void nextCard(){//完成無限次聚焦事件 card.next(con);} protected abstract void FrameLostFocus(); protected abstract void FrameGetFocus();} 3. 建立ShowImage目標(biāo)圖顯示類 目標(biāo)圖片顯示類主要調(diào)用前面選擇的目標(biāo)圖片,并且新建標(biāo)簽顯示出來。 public class ShowImage extends JFrame//調(diào)用前面選擇的目標(biāo)圖片,新建標(biāo)簽顯示出來{ public ShowImage(String fn){ super("預(yù)覽"); Container c = getContentPane(); c.setLayout(new FlowLayout()); String path = Arg.path + "/" + fn; ImageIcon image = new ImageIcon(path); c.add(new JLabel(image)); setDefaultCloseOperation(HIDE_ON_CLOSE); setSize(image.getIconWidth()+10, image.getIconHeight()+30); setVisible(true);}} 4. 建立Grades分?jǐn)?shù)記錄類 分?jǐn)?shù)紀(jì)錄類實(shí)現(xiàn)了以下功能:首先用Data來新建數(shù)組,然后構(gòu)造方法,用于后面接收前面穿過來的難度,接著新建文檔用于存放記錄,并且初始化成績排名讀取文件現(xiàn)有的記錄,然后判斷該難度下游戲結(jié)束后,時(shí)間和步數(shù)是否最少,是否打破紀(jì)錄,接著顯示更新后的排名,最后調(diào)用顯示現(xiàn)有記錄下面列出該類的存儲顯示結(jié)構(gòu)和一些重要的方法代碼:(省略非關(guān)鍵代碼,可在文末源代碼查看) class Data{//用Data來新建數(shù)組 public String name;public int time;public int step;} public class Grades{ private Puzzle app; private Data [] data = { .......}; public Grades(Puzzle m){//構(gòu)造方法,用于后面接收前面穿過來的難度 app = m;} private void creatData(){//新建文檔用于存放記錄,并且初始化成績排名 try{ File file = new File(Arg.rc); if (file.exists()) return; file.createNewFile(); PrintStream fout = new PrintStream(Arg.rc); .......fout.close();} catch (Exception e){.......}} private void readData(){//讀取文件現(xiàn)有的記錄 try{ File file = new File(Arg.rc); Scanner cin = new Scanner(file); data[0].name = cin.next(); ....... catch (Exception e){ JOptionPane.showMessageDialog(null, Arg.rc + " cant read!");}} public void set(int t, int s){//用于改難度下游戲結(jié)束后,時(shí)間和步數(shù)是否最少,是否打破紀(jì)錄 int type = app.getTypee(); creatData(); readData(); if (t > data[type].time || (t == data[type].time && s >= data[type].step)) return; data[type].name = JOptionPane.showInputDialog(null,"你打破了記錄!\n請輸入你的名字。"); try{//顯示更新后的排名 PrintStream f = new PrintStream(Arg.rc); f.printf("%s %d %d\n", data[0].name, data[0].time, data[0].step);.......} catch (Exception e){.......} show();} public void show(){//調(diào)用顯示現(xiàn)有記錄 try{ creatData(); readData(); ....... JOptionPane.showMessageDialog(null, title+h+n+e);} catch (Exception e){....... }}} 5.建立split原圖劃分類移動點(diǎn)擊事件類 原圖花分類里,首先按照難度不同,根據(jù)不同的尺寸進(jìn)行原圖劃分判斷如果沒被劃分過,則對圖案劃分并返回,接著新建圖片文件夾,并返回已建立,最后引用選中的圖片文件夾里的圖片,并且根據(jù)難度不同,對圖片進(jìn)行劃分,并且寫入到圖片數(shù)組 BufferedImage[][]中去。 public class Split{//建立劃分類,按照難度不同,根據(jù)不同的尺寸進(jìn)行原圖劃分 public static final int HARD = 0; public static final int NORMAL = 1; public static final int EASY = 2; public static final String pvo = "png"; public static final int [] level = { 100, 160, 200}; ....... public static Split get(){//判斷如果沒被劃分過,則對圖案劃分并返回.......} public boolean set(String fn){//新建圖片文件夾,并返回已建立 filename = fn; path = Arg.path + "/" + filename; File file = new File(path); return file.exists();} public BufferedImage[][] divid(int type){//引用選中的圖片文件夾里的圖片,并且根據(jù)難度不同,對圖片進(jìn)行劃分,并且寫入到圖片數(shù)組 BufferedImage[][]中去。 try{ BufferedImage image = ImageIO.read(new File(path)); int len = level[type]; int cal = image.getWidth() / len; int row = image.getHeight() / len; BufferedImage [][] subimage = new BufferedImage[row][cal]; for (int i = 0; i < row; i++) for (int j = 0; j < cal; j++) subimage[i][j] = image.getSubimage(j*len, i*len, len, len);return subimage;}.......} 6.建立ButtonClick拼圖移動點(diǎn)擊事件類 ButtonClick拼圖移動點(diǎn)擊事件類先將按鈕點(diǎn)擊事件鏈接接口,然后判斷點(diǎn)擊的非空按鈕周圍是否為空,如果為空就先把該非空按鈕設(shè)置圖案為空,然后將空白的按鈕設(shè)置為剛才的圖案,并且判斷是否成功。 public class ButtonClick implements ActionListener{//按鈕點(diǎn)擊事件鏈接接口 private JButton [][] button; private point pint; private int row; private int cal; private int [][] matrix; private GameOver gOver; private boolean end; public ButtonClick(JButton [][] b, point p, int [][] m, int r, int c, GameOver g) {button = b;pint = p;matrix = m;row = r;cal = c;gOver = g;end = false;} public void actionPerformed(ActionEvent e)//判斷點(diǎn)擊的非空按鈕周圍是否為空,如果為空就先把該非空按鈕設(shè)置圖案為空{(diào) if (end || !pint.neighbor(row, cal)) return; int r = pint.getRow(); int c = pint.getCal(); button[r][c].setIcon(button[row][cal].getIcon()); button[row][cal].setIcon(null); pint.set(row, cal); int t = matrix[r][c]; matrix[r][c] = matrix[row][cal]; matrix[row][cal] = t; end = gOver.judge();}} 7.建立Gameover判斷游戲結(jié)束類 public class GameOver{//引入游戲結(jié)束標(biāo)志,暫停標(biāo)志,和圖片矩陣等 private boolean gameOver; private boolean stop; private int [][] matrix; ....... public GameOver (Puzzle frm){//構(gòu)造方法Main = frm;} public void start(int [][] m){//開始方法,對數(shù)據(jù)初始化 gameOver = false;matrix = m;step = 0;Date d = new Date();now = d.getTime();stop = false;countTime = 0;} public boolean judge(){//比對原來的拼圖,判斷現(xiàn)在的拼圖是否與目標(biāo)圖案一樣,一樣則返回結(jié)束標(biāo)志 if (gameOver)return true; step++; int c = 1; for (int i = 0; i < matrix.length; i++) for (int j = 0; j < matrix[i].length; j++) if (matrix[i][j] != (c++)) return false;{.......return (gameOver = true);} public void pause(){//暫停就停止計(jì)時(shí) Date d = new Date(); if (stop)now = d.getTime(); else countTime += d.getTime() - now; stop = !stop;} public int getStep(){//返回耗費(fèi)步數(shù) return step;} public long getTime(){//返回耗費(fèi)時(shí)間 return countTime / 1000;}} 8.建立Puzzle拼圖游戲主類 拼圖游戲主類繼承于首頁說明類,首先利用構(gòu)造方法,用于顯示拼圖界面,接著調(diào)用以下不同方法:調(diào)用游戲開始方法、調(diào)用游戲結(jié)束方法,并且顯示時(shí)間和步數(shù)、調(diào)用失去焦點(diǎn)方法,然后暫停游戲、調(diào)用獲得焦點(diǎn)方法,然后繼續(xù)游戲。 接著調(diào)用以下點(diǎn)擊事件:選擇圖片點(diǎn)擊事件、并且調(diào)用顯示拼圖界面、記錄顯示點(diǎn)擊事件,顯示當(dāng)前記錄、目標(biāo)圖片顯示點(diǎn)擊事件,顯示目標(biāo)圖片標(biāo)簽、退出游戲點(diǎn)擊事件、幫助點(diǎn)擊事件、版本信息點(diǎn)擊事件,并顯示。最后建立拼圖主程序?qū)ο筮\(yùn)行。 public class Puzzle extends CardFrame{//繼承于首頁說明類 ....... public Puzzle(){//構(gòu)造方法,用于顯示拼圖界面 start = false; this.setSize(200 + fWidth, 200 + fHeight); this.setVisible(true);} private void startGame(){//調(diào)用游戲開始方法 if (start)return; start = true; updateMenuBegin();} public void endGame(){//調(diào)用游戲結(jié)束方法,并且顯示時(shí)間和步數(shù) updateMenuBegin();initMenuBackground(); start = false; JOptionPane.showMessageDialog(null, "時(shí)間:" + gOver.getTime() + "s\n" + "步數(shù):" + gOver.getStep()); Grades g = new Grades(this); g.set((int)gOver.getTime(), gOver.getStep());} protected void FrameLostFocus(){//調(diào)用失去焦點(diǎn)方法,然后暫停游戲。 if (start && index){ nextCard();if (gOver != null) gOver.pause(); index = false;}} protected void FrameGetFocus(){//調(diào)用獲得焦點(diǎn)方法,然后激素游戲。 nextCard();if (gOver != null) gOver.pause(); index = true;} public void menuNewClick(){//選擇圖片點(diǎn)擊事件,并且調(diào)用顯示拼圖界面 Split sp = Split.get();BufferedImage [][] image; if (!sp.set(getFilename()) || (image = sp.divid(getTypee())) == null){JOptionPane.showMessageDialog(null, "圖片不存在!\n請重新選擇~"); } startGame(); ....... Matrix matrix = new Matrix(button, panel[0], len, gOver); matrix.init(image); this.setSize(cal * len + fWidth, row * len + fHeight); this.setVisible(true);} public void menuGradesClick(){//記錄顯示點(diǎn)擊事件顯示當(dāng)前記錄 Grades g = new Grades(this);g.show();} public void menuShowClick(){//目標(biāo)圖片顯示點(diǎn)擊事件,顯示目標(biāo)圖片標(biāo)簽 new ShowImage(getFilename());} public void menuExitClick(){//退出游戲點(diǎn)擊事件 System.exit(0);} public void menuHelpClick(){//幫助點(diǎn)擊事件 ....... JOptionPane.showMessageDialog(null, help0 + help1);} public void menuAboutClick(){//版本信息點(diǎn)擊事件,并顯示 ....... JOptionPane.showMessageDialog(null, version + author + email);} public static void main(String [] argv){//建立拼圖主程序?qū)ο? Puzzle app = new Puzzle();}} 4、 調(diào)試分析 1.程序的運(yùn)行 將文件Arg.java,ButtonClick.java,CardFrame.java,GameOver.java,Grades.java,Matrix.java,MenuFrame.java,point.java,Puzzle.java,ShowImage.java,Split.java及background保存到同一個(gè)文件夾中。利用javac命令對文件進(jìn)行編譯,使用命令如下:Javac Puzzle.java,之后,利用java命令執(zhí)行程序,使用命令如下:Java Puzzle,便得到拼圖程序運(yùn)行界面?;蛘咧苯釉贓clipse上運(yùn)行。 2.游戲測試 (1)游戲測試中第一個(gè)難題就是上傳到游戲中目標(biāo)圖片不能進(jìn)行很好的劃分,后來在計(jì)算了圖片的大小后,設(shè)置劃分大小,解決了這一個(gè)問題,但是只能適配這一個(gè)分辨率下的圖片,以后可以增加分類劃分。 (2)本程序的模塊劃分很合理,思路很清晰,布局簡介,盡可能的簡化操作。各類之間的繼承和相互調(diào)用關(guān)系,使得程序各類利用率很高,幾乎沒有重復(fù)之處,可視性和可調(diào)性更多。并且界面操作簡介方便。 (3)本程序的主程序同功能程序的銜接十分自然,算法效率高。 (4)本實(shí)習(xí)作業(yè)采用JAVA圖形界面游戲的一般設(shè)計(jì)方法,將程序劃分為八個(gè)主要類:使得設(shè)計(jì)時(shí)思路清晰,實(shí)現(xiàn)時(shí)調(diào)試順利,各類具有較好的可重用性,我也確實(shí)得到了一次良好的程序設(shè)計(jì)訓(xùn)練。 5、 用戶手冊 1.游戲三個(gè)狀態(tài) 1)游戲初始狀態(tài) 當(dāng)游戲剛運(yùn)行時(shí),會出現(xiàn)如下界面,本游戲中已經(jīng)存在了三張圖片,如過游戲者想拼自己感興趣的圖片的話,可以將自己的圖片放入到“background”(背景圖片)文件夾中,再進(jìn)行“選擇”->“背景圖片”中選擇你自己的圖片,然后選擇“等級”->“困難”或“普通”或“簡單”,進(jìn)行等級選擇,最后選擇“開始”->“新游戲”就可以拼自己想拼的圖了。初始窗口如圖6所示: 圖6 游戲初始窗口 2)游戲進(jìn)行狀態(tài) 當(dāng)游戲者選擇好圖片與等級后,就可以進(jìn)行拼圖游戲了及進(jìn)入游戲的進(jìn)行圖 圖7 游戲進(jìn)行狀態(tài) 態(tài)。如圖7所示: 3)游戲暫停狀態(tài) 當(dāng)游戲者,在游戲過程中半途暫停游戲的話,將出現(xiàn)如圖8所示的游戲暫停狀態(tài)的界面。當(dāng)游戲者又想繼續(xù)游戲時(shí),直接單擊界面上的“繼續(xù)”字樣,就可以繼續(xù)游戲了。 圖8 游戲暫停狀態(tài) 2. 游戲菜單選項(xiàng) 1)“開始”菜單。包括了,“新游戲”、“成績記錄”、“圖片預(yù)覽”、“退出游戲”。如圖9所示。 “新游戲”:單擊可以開始游戲,如圖10所示游戲進(jìn)行狀態(tài)。 “成績記錄”:單擊可以查看游戲者的游戲最佳成績記錄。如圖8所示。初始的成績記錄。 “圖片預(yù)覽”:在游戲過程中可以單擊預(yù)覽圖片,對照著拼,如圖11所示。 “退出游戲”:游戲者要結(jié)束游戲可直接單擊退出游戲。 圖9 游戲開始菜單 圖10 游戲最佳成績記錄 圖11 目標(biāo)圖片預(yù)覽 2)“選擇”菜單。包括了,“等級”、“背景圖片”。如圖12所示。當(dāng)運(yùn)行 圖12 選擇菜單 游戲時(shí),如果沒有把“background”這個(gè)文件夾放入主程序的目錄下,在運(yùn)行游戲選擇背景圖片時(shí),將沒有圖片可選,這是可以按照“初始狀態(tài)”界面上的提示進(jìn)行操作。若正常的有“background”在主程序路徑下的話,運(yùn)行游戲選擇背景圖片的話,就可以選擇圖片了,界面如圖13所示。 “等級”:在游戲者開始游戲之前,要進(jìn)行游戲等級選擇,共有困難、普通、簡單三種選擇。其圖片的切割塊數(shù),會根據(jù)選擇的等級不同,而有所不同。 “背景圖片”:這里保存了所要拼的所有圖片。在游戲前要進(jìn)行選擇。 圖13 選擇菜單 3)“關(guān)于”菜單。包括了“幫助”、“關(guān)于”兩個(gè)下拉菜單。 “幫助”:在游戲時(shí),可以單擊查看游戲的簡單規(guī)則。 “關(guān)于”:可查看該游戲的版本、作者、與作者的Email的相關(guān)信息 3.游戲提示框 1)提示信息窗口 當(dāng)游戲者運(yùn)行游戲時(shí),如果沒有把“background”這個(gè)文件夾放入主程序的目錄下,在運(yùn)行游戲選擇背景圖片時(shí),將沒有圖片可選,若此時(shí)直接“開始”->“新游戲”,將會彈出如下提示信息框。界面如圖14所示。 圖14 提示信息框 2)拼圖成功界面,若選擇abc.jpg圖片拼圖時(shí),若拼圖成功,界面如圖15所示。 圖15 拼圖成功 3)成績記錄輸入框 當(dāng)游戲者完成拼圖游戲后,將出現(xiàn)一個(gè)成績記錄框(“輸入”框),輸入游戲者的姓名。如圖16所示。輸入后單擊確定按鈕,將彈出總的成績記錄框。 圖16 輸入名字 如圖17所示: 圖17 成績記錄框 6、 測試結(jié)果 (1) 易破紀(jì)錄測試結(jié)果如圖18,輸入記錄如圖19,最終成績記錄如圖20: 圖片18 易難度破紀(jì)錄圖 圖片19輸入易記錄圖 圖片20最終成績記錄圖 (2)普通破紀(jì)錄測試結(jié)果如圖21,輸入記錄如圖22,最終成績記錄如圖23: 圖片21 普通破紀(jì)錄測試結(jié)果圖 圖片22 普通輸入紀(jì)錄圖 圖片23 最終成績記錄圖 (3)困難游戲過程和顯示圖片如圖24: 圖24 困難難度游戲進(jìn)行圖 7、 附錄(源碼) Arg.java public interface Arg { public static final String path = "background"; public static final String rc = "Game.rc"; } ButtonClick.java import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JOptionPane; public class ButtonClick implements ActionListener { private JButton [][] button; private point pint; private int row; private int cal; private int [][] matrix; private GameOver gOver; private boolean end; public ButtonClick(JButton [][] b, point p, int [][] m, int r, int c, GameOver g) { button = b; pint = p; matrix = m; row = r; cal = c; gOver = g; end = false; } public void actionPerformed(ActionEvent e) { if (end || !pint.neighbor(row, cal)) return; int r = pint.getRow(); int c = pint.getCal(); button[r][c].setIcon(button[row][cal].getIcon()); button[row][cal].setIcon(null); pint.set(row, cal); int t = matrix[r][c]; matrix[r][c] = matrix[row][cal]; matrix[row][cal] = t; end = gOver.judge(); } } CardFrame.java import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowAdapter; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; public abstract class CardFrame extends MenuFrame { private CardLayout card; private Container con; protected JPanel [] panel = { new JPanel(), new JPanel() }; public CardFrame() { con = this.getContentPane(); card = new CardLayout(); con.setLayout(card); panel[0].setLayout(null); JLabel label; label = new JLabel("請輸入你的圖片到"); label.setBounds(10, 15, 190, 30); panel[0].add(label); label = new JLabel("\"背景圖片\"文件夾。\n"); label.setBounds(10, 30, 190, 45); panel[0].add(label); label = new JLabel("單擊\"選擇->背景圖片\""); label.setBounds(10, 50, 190, 65); panel[0].add(label); label = new JLabel("選擇圖片。\n"); label.setBounds(10, 65, 190, 80); panel[0].add(label); label = new JLabel("接著, 單擊 \"開始->新游戲\" 可以"); label.setBounds(10, 85, 190, 100); panel[0].add(label); label = new JLabel("開始游戲。"); label.setBounds(10, 100, 190, 115); panel[0].add(label); panel[1].setLayout(new BorderLayout()); JButton button = new JButton("繼 續(xù)"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { FrameGetFocus(); } } ); panel[1].add(button, BorderLayout.CENTER); con.add(panel[0], "游戲"); con.add(panel[1], "暫停"); card.show(con, "游戲"); this.addWindowListener(new WindowAdapter() { public void windowDeactivated(WindowEvent e) { FrameLostFocus(); } } ); } protected void nextCard() { card.next(con); } protected abstract void FrameLostFocus(); protected abstract void FrameGetFocus(); } GameOver.java import java.util.Date; public class GameOver { private boolean- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- JAVA 拼圖游戲 課程設(shè)計(jì)
鏈接地址:http://ioszen.com/p-6686272.html