JAVA拼圖游戲課程設計.doc
《JAVA拼圖游戲課程設計.doc》由會員分享,可在線閱讀,更多相關《JAVA拼圖游戲課程設計.doc(44頁珍藏版)》請在裝配圖網(wǎng)上搜索。
學年論文 (JAVA面向對象程序設計 2015-2016 第二學期) 題 目: JAVA課程設計 作 者: 陳炳宏 所在學院: 信息科學與工程學院 專業(yè)年級: 信息安全14-1 指導教師: 楊晴雯 職 稱: 副教授 2016年6月 4 日 基于JAVA的拼圖游戲的設計 摘要 拼圖游戲是一款非常經(jīng)典的小游戲,因為它比較簡單有趣,老少皆宜。拼圖游戲的設計對每一個Java語言設計者進行語言提高和進階都是一個很好的鍛煉機會。 拼圖游戲的設計比較復雜,它涉及面廣、牽涉方面多,如果不好好考慮和設計,將難以成功開發(fā)出這個游戲。在這個游戲的設計中,牽涉到圖形界面的顯示與更新、數(shù)據(jù)的收集與更新,并且在這個游戲的開發(fā)中,還要應用類的繼承機制以及一些設計模式。因此,如何設計和開發(fā)好這個拼圖游戲,對于提高Java開發(fā)水平和系統(tǒng)的設計能力有極大的幫助。在設計開發(fā)過程中,需要處理好各個類之間的繼承關系,還要處理各個類相應的封裝,并且還要協(xié)調(diào)好各個模塊之間的邏輯依賴關系和數(shù)據(jù)通信關系。 關鍵詞:拼圖游戲 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 二、概要設計 7 1.拼圖游戲流程圖 7 2.設計思路 7 3.主要類文件說明 8 三、詳細設計 9 1.建立MenuFrame菜單首頁類 9 2.建立CardFrame首頁說明類 10 3.建立ShowImage目標圖顯示類 11 4.建立Grades分數(shù)記錄類 11 5.建立split原圖劃分類移動點擊事件類 12 6.建立ButtonClick拼圖移動點擊事件類 13 7.建立Gameover判斷游戲結束類 14 8.建立Puzzle拼圖游戲主類 14 四、調(diào)試分析 16 1.程序的運行 16 2.游戲測試 16 五、用戶手冊 17 1.游戲三個狀態(tài) 17 2.游戲菜單選項 18 3.游戲提示框 20 六、測試結果 22 七、附錄(源碼) 24 課程設計題目:基于JAVA的拼圖游戲 1、 需求分析 1.程序分析 本游戲是一個Java語言的拼圖游戲,在eclipse上使用JAVA語言編寫并且利用Java Swing設計顯示。拼圖中有一個格子是空的,其他格子內(nèi)隨機放置由目標圖片切割成的若干個小圖片,圖片按照不同難度結合目標圖片分辨率進行切割。用戶通過點擊空位置中周圍的任何非空圖塊來移動非空圖塊到空位置,一直重復直到拼回目標圖片的樣子后游戲成功,記錄名次分數(shù)。 2.執(zhí)行方式 在開始游戲之前,可以選擇游戲等級后再點擊“開始”菜單里的“新游戲”,進行拼圖游戲,被打亂的目標圖片依次設置到拼圖中的各個按鈕中,利用按鈕的點擊事件,點擊可移動的,設置按鈕背景圖片為空,臨近按鈕設置背景圖片為剛點擊按鈕背景圖片,重復以往,直到方塊一行一行的按圖片的原始樣子拼好即可完成該游戲。 游戲拼完后,會彈出一個“信息”框,顯示你玩游戲所用的步數(shù)與時間,點擊“確定”后,會彈出一個“輸入”框,可以在里面輸入游戲者的姓名,單擊“確定”后會彈出游戲的記錄框。 3.程序執(zhí)行的命令包括 (1) 菜單開始: 包括菜單項新游戲,游戲記錄,退出游戲,顯示背景圖片; (2) 菜單選擇: 包括菜單項等級選擇和背景圖片選擇,其中等級選擇包括難、中、易三個子菜單項,背景圖片包含已添加到images文件夾下的圖片菜單項; (3) 菜單關于: 包含幫助和關于兩個菜單項; (4) 按鈕點擊事件: 用于接收按鈕圖片移動請求并做出相應移動; (5) 游戲記錄存儲: 游戲結束后,在不同難度下,如果打破紀錄的記錄會被寫入Game.rc文件中; (6) panel面板顯示: 用于不同頁面間的切換顯示; 4.測試數(shù)據(jù) (1) 目標圖片如圖1: 圖1 目標圖片 (2) 難度:難度易游戲如圖2: 圖2 難度易游戲圖片 (3) 難度普通游戲如圖3: 圖3 難度普通游戲圖片 (4) 難度難游戲如圖4: 圖4 難度難游戲圖片 2、 概要設計 1. 拼圖游戲流程圖 游戲結束 窗體顯示 圖片放置 動作事件的監(jiān)聽 事件響應 是 否 開始游戲 拼圖完整 圖5 JAVA拼圖游戲框架圖 2. 設計思路 為實現(xiàn)上述游戲功能,首先需要寫出MenuFrame首頁,在該布局里添加基礎選項和標簽,并添加到程序首頁布局上,然后CardFrame繼承MeauFrame并設置程序說明和焦點事件以完成暫停繼續(xù),接著設計ShowImage類用于顯示原來圖像,設計Grades類來記錄游戲者游戲信息以及最終成績并借助Arg傳遞到Game.rc文件中,其中包含Data類用來輔助Grades保存數(shù)據(jù),設計split類來劃分圖塊,接著設計ButtonClick來實現(xiàn)圖片的點擊移動事件,其中引用point類輔助設置移動,并引用設計GameOver實現(xiàn)游戲過程中的計時、暫停、結束等功能并返回,最后設計Puzzle主類繼承于CarFrame類用于添加上述各種點擊事件并調(diào)用相關功能,包括在模板顯示由split類劃分的傳到拼圖矩陣后的整個拼圖圖塊,最后完善整個功能需要。 3. 主要類文件說明 本程序包含8個主要模塊: 1) ButtonClick.class 該類主要是實現(xiàn)鼠標事件,讓玩家在用鼠標點擊能夠移動拼圖的小圖片,移動到周圍空格的地方 2) CardFrame.class 該類主要實現(xiàn),初始界面的相關提示信息。 3)GameOver.class 該類主要實現(xiàn)游戲過程中的計時、暫停、結束等功能,游戲結束時的信息。 4) split.class 該類主要實現(xiàn)圖片的提取與切割的功能。 5)Grades.class 該類主要實現(xiàn)成績記錄的初始化,在拼圖成功后可記錄游戲者姓名的功能,并直接提取等級、步數(shù)與時間等信息的功能。保存成績記錄信息,以便游戲者查看。 6)MenuFrame.class 該類主要實現(xiàn)有主菜單與子菜單的功能。并設置相關的快捷鍵功能。 7)Puzzle.class 該類是該游戲程序的主程序,從游戲界面大小到游戲過程中出現(xiàn)的所有信息框等相關功能都到了實現(xiàn),調(diào)用相關類實現(xiàn)其功能。 8)ShowImage.class 該類用于新建窗口顯示目標圖像。 3、 詳細設計 1.建立MenuFrame菜單首頁類 菜單首頁的建立完成了以下設計,設置主頁菜單結構、設置菜單位于桌面位置和退出方式、設置快捷鍵、點擊事件選擇難度,默認普通、添加開始子菜單點擊事件好快捷鍵、添加難度選擇子菜單項并調(diào)用點擊事件、添加文件選擇點擊事件、關于菜單設置、圖片預覽點擊事件設置更新,很好的構建了整個游戲的架構,下面列出該類的菜單結構和一些重要的方法代碼:(省略非關鍵代碼,可在文末源代碼查看) public abstract class MenuFrame extends JFrame{//設置主頁菜單結構 ....... private JMenu [] m = { new JMenu("開始(B)").......}; private JMenu [] mm = { new JMenu("等級(L)").......}; public MenuFrame(){//設置菜單位于桌面位置和退出方式 super("拼圖游戲");addMenu(); ....... this.getToolkit().getScreenSize().width/3 - this.getWidth()/3}; private void addMenu(){//設置快捷鍵 m[0].setMnemonic(B);initMenuBegin() .......} private void menuLevelClick(String nm){//點擊事件選擇難度,默認普通 type = 3;if (nm.equals("困難")).......} private void initMenuBegin(){//添加開始子菜單點擊事件好快捷鍵 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(){//添加難度選擇子菜單項并調(diào)用點擊事件 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(){//添加文件選擇點擊事件 ....... 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(){//關于菜單設置 JMenuItem [] mI = { new JMenuItem("幫助(H)"), new JMenuItem("關于(A)")}....... mI[0].addActionListener(new ActionListener().......} public void updateMenuBegin(){//圖片預覽點擊事件設置更新 if (!update){{m[0].remove(2);return;} JMenuItem mi = new JMenuItem("圖片預覽(S)"); mi.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){menuShowClick();); .......} 2. 建立CardFrame首頁說明類 首頁說明類繼承于首頁菜單類,并加以完善,并且設置了聚集事件,以完成暫停和繼續(xù)完成,最后定義聚焦事件為無限次。下面列出該類的說明結構和一些重要的方法代碼:(省略非關鍵代碼,可在文末源代碼查看) public abstract class CardFrame extends MenuFrame{ //繼承于首頁菜單類,并加以完善 ....... public CardFrame(){//設置首頁提示標簽 ....... JLabel label; label = new JLabel("請輸入你的圖片到"); label.setBounds(10, 15, 190, 30); ....... JButton button = new JButton("繼 續(xù)"); button.addActionListener(new ActionListener(){//設置聚集事件,以完成暫停和繼續(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目標圖顯示類 目標圖片顯示類主要調(diào)用前面選擇的目標圖片,并且新建標簽顯示出來。 public class ShowImage extends JFrame//調(diào)用前面選擇的目標圖片,新建標簽顯示出來{ public ShowImage(String fn){ super("預覽"); 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分數(shù)記錄類 分數(shù)紀錄類實現(xiàn)了以下功能:首先用Data來新建數(shù)組,然后構造方法,用于后面接收前面穿過來的難度,接著新建文檔用于存放記錄,并且初始化成績排名讀取文件現(xiàn)有的記錄,然后判斷該難度下游戲結束后,時間和步數(shù)是否最少,是否打破紀錄,接著顯示更新后的排名,最后調(diào)用顯示現(xià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){//構造方法,用于后面接收前面穿過來的難度 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){//用于改難度下游戲結束后,時間和步數(shù)是否最少,是否打破紀錄 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原圖劃分類移動點擊事件類 原圖花分類里,首先按照難度不同,根據(jù)不同的尺寸進行原圖劃分判斷如果沒被劃分過,則對圖案劃分并返回,接著新建圖片文件夾,并返回已建立,最后引用選中的圖片文件夾里的圖片,并且根據(jù)難度不同,對圖片進行劃分,并且寫入到圖片數(shù)組 BufferedImage[][]中去。 public class Split{//建立劃分類,按照難度不同,根據(jù)不同的尺寸進行原圖劃分 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ù)難度不同,對圖片進行劃分,并且寫入到圖片數(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拼圖移動點擊事件類 ButtonClick拼圖移動點擊事件類先將按鈕點擊事件鏈接接口,然后判斷點擊的非空按鈕周圍是否為空,如果為空就先把該非空按鈕設置圖案為空,然后將空白的按鈕設置為剛才的圖案,并且判斷是否成功。 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)//判斷點擊的非空按鈕周圍是否為空,如果為空就先把該非空按鈕設置圖案為空{(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判斷游戲結束類 public class GameOver{//引入游戲結束標志,暫停標志,和圖片矩陣等 private boolean gameOver; private boolean stop; private int [][] matrix; ....... public GameOver (Puzzle frm){//構造方法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)在的拼圖是否與目標圖案一樣,一樣則返回結束標志 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(){//暫停就停止計時 Date d = new Date(); if (stop)now = d.getTime(); else countTime += d.getTime() - now; stop = !stop;} public int getStep(){//返回耗費步數(shù) return step;} public long getTime(){//返回耗費時間 return countTime / 1000;}} 8.建立Puzzle拼圖游戲主類 拼圖游戲主類繼承于首頁說明類,首先利用構造方法,用于顯示拼圖界面,接著調(diào)用以下不同方法:調(diào)用游戲開始方法、調(diào)用游戲結束方法,并且顯示時間和步數(shù)、調(diào)用失去焦點方法,然后暫停游戲、調(diào)用獲得焦點方法,然后繼續(xù)游戲。 接著調(diào)用以下點擊事件:選擇圖片點擊事件、并且調(diào)用顯示拼圖界面、記錄顯示點擊事件,顯示當前記錄、目標圖片顯示點擊事件,顯示目標圖片標簽、退出游戲點擊事件、幫助點擊事件、版本信息點擊事件,并顯示。最后建立拼圖主程序對象運行。 public class Puzzle extends CardFrame{//繼承于首頁說明類 ....... public Puzzle(){//構造方法,用于顯示拼圖界面 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)用游戲結束方法,并且顯示時間和步數(shù) updateMenuBegin();initMenuBackground(); start = false; JOptionPane.showMessageDialog(null, "時間:" + gOver.getTime() + "s\n" + "步數(shù):" + gOver.getStep()); Grades g = new Grades(this); g.set((int)gOver.getTime(), gOver.getStep());} protected void FrameLostFocus(){//調(diào)用失去焦點方法,然后暫停游戲。 if (start && index){ nextCard();if (gOver != null) gOver.pause(); index = false;}} protected void FrameGetFocus(){//調(diào)用獲得焦點方法,然后激素游戲。 nextCard();if (gOver != null) gOver.pause(); index = true;} public void menuNewClick(){//選擇圖片點擊事件,并且調(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(){//記錄顯示點擊事件顯示當前記錄 Grades g = new Grades(this);g.show();} public void menuShowClick(){//目標圖片顯示點擊事件,顯示目標圖片標簽 new ShowImage(getFilename());} public void menuExitClick(){//退出游戲點擊事件 System.exit(0);} public void menuHelpClick(){//幫助點擊事件 ....... JOptionPane.showMessageDialog(null, help0 + help1);} public void menuAboutClick(){//版本信息點擊事件,并顯示 ....... JOptionPane.showMessageDialog(null, version + author + email);} public static void main(String [] argv){//建立拼圖主程序對象 Puzzle app = new Puzzle();}} 4、 調(diào)試分析 1.程序的運行 將文件Arg.java,ButtonClick.java,CardFrame.java,GameOver.java,Grades.java,Matrix.java,MenuFrame.java,point.java,Puzzle.java,ShowImage.java,Split.java及background保存到同一個文件夾中。利用javac命令對文件進行編譯,使用命令如下:Javac Puzzle.java,之后,利用java命令執(zhí)行程序,使用命令如下:Java Puzzle,便得到拼圖程序運行界面?;蛘咧苯釉贓clipse上運行。 2.游戲測試 (1)游戲測試中第一個難題就是上傳到游戲中目標圖片不能進行很好的劃分,后來在計算了圖片的大小后,設置劃分大小,解決了這一個問題,但是只能適配這一個分辨率下的圖片,以后可以增加分類劃分。 (2)本程序的模塊劃分很合理,思路很清晰,布局簡介,盡可能的簡化操作。各類之間的繼承和相互調(diào)用關系,使得程序各類利用率很高,幾乎沒有重復之處,可視性和可調(diào)性更多。并且界面操作簡介方便。 (3)本程序的主程序同功能程序的銜接十分自然,算法效率高。 (4)本實習作業(yè)采用JAVA圖形界面游戲的一般設計方法,將程序劃分為八個主要類:使得設計時思路清晰,實現(xiàn)時調(diào)試順利,各類具有較好的可重用性,我也確實得到了一次良好的程序設計訓練。 5、 用戶手冊 1.游戲三個狀態(tài) 1)游戲初始狀態(tài) 當游戲剛運行時,會出現(xiàn)如下界面,本游戲中已經(jīng)存在了三張圖片,如過游戲者想拼自己感興趣的圖片的話,可以將自己的圖片放入到“background”(背景圖片)文件夾中,再進行“選擇”->“背景圖片”中選擇你自己的圖片,然后選擇“等級”->“困難”或“普通”或“簡單”,進行等級選擇,最后選擇“開始”->“新游戲”就可以拼自己想拼的圖了。初始窗口如圖6所示: 圖6 游戲初始窗口 2)游戲進行狀態(tài) 當游戲者選擇好圖片與等級后,就可以進行拼圖游戲了及進入游戲的進行圖 圖7 游戲進行狀態(tài) 態(tài)。如圖7所示: 3)游戲暫停狀態(tài) 當游戲者,在游戲過程中半途暫停游戲的話,將出現(xiàn)如圖8所示的游戲暫停狀態(tài)的界面。當游戲者又想繼續(xù)游戲時,直接單擊界面上的“繼續(xù)”字樣,就可以繼續(xù)游戲了。 圖8 游戲暫停狀態(tài) 2. 游戲菜單選項 1)“開始”菜單。包括了,“新游戲”、“成績記錄”、“圖片預覽”、“退出游戲”。如圖9所示。 “新游戲”:單擊可以開始游戲,如圖10所示游戲進行狀態(tài)。 “成績記錄”:單擊可以查看游戲者的游戲最佳成績記錄。如圖8所示。初始的成績記錄。 “圖片預覽”:在游戲過程中可以單擊預覽圖片,對照著拼,如圖11所示。 “退出游戲”:游戲者要結束游戲可直接單擊退出游戲。 圖9 游戲開始菜單 圖10 游戲最佳成績記錄 圖11 目標圖片預覽 2)“選擇”菜單。包括了,“等級”、“背景圖片”。如圖12所示。當運行 圖12 選擇菜單 游戲時,如果沒有把“background”這個文件夾放入主程序的目錄下,在運行游戲選擇背景圖片時,將沒有圖片可選,這是可以按照“初始狀態(tài)”界面上的提示進行操作。若正常的有“background”在主程序路徑下的話,運行游戲選擇背景圖片的話,就可以選擇圖片了,界面如圖13所示。 “等級”:在游戲者開始游戲之前,要進行游戲等級選擇,共有困難、普通、簡單三種選擇。其圖片的切割塊數(shù),會根據(jù)選擇的等級不同,而有所不同。 “背景圖片”:這里保存了所要拼的所有圖片。在游戲前要進行選擇。 圖13 選擇菜單 3)“關于”菜單。包括了“幫助”、“關于”兩個下拉菜單。 “幫助”:在游戲時,可以單擊查看游戲的簡單規(guī)則。 “關于”:可查看該游戲的版本、作者、與作者的Email的相關信息 3.游戲提示框 1)提示信息窗口 當游戲者運行游戲時,如果沒有把“background”這個文件夾放入主程序的目錄下,在運行游戲選擇背景圖片時,將沒有圖片可選,若此時直接“開始”->“新游戲”,將會彈出如下提示信息框。界面如圖14所示。 圖14 提示信息框 2)拼圖成功界面,若選擇abc.jpg圖片拼圖時,若拼圖成功,界面如圖15所示。 圖15 拼圖成功 3)成績記錄輸入框 當游戲者完成拼圖游戲后,將出現(xiàn)一個成績記錄框(“輸入”框),輸入游戲者的姓名。如圖16所示。輸入后單擊確定按鈕,將彈出總的成績記錄框。 圖16 輸入名字 如圖17所示: 圖17 成績記錄框 6、 測試結果 (1) 易破紀錄測試結果如圖18,輸入記錄如圖19,最終成績記錄如圖20: 圖片18 易難度破紀錄圖 圖片19輸入易記錄圖 圖片20最終成績記錄圖 (2)普通破紀錄測試結果如圖21,輸入記錄如圖22,最終成績記錄如圖23: 圖片21 普通破紀錄測試結果圖 圖片22 普通輸入紀錄圖 圖片23 最終成績記錄圖 (3)困難游戲過程和顯示圖片如圖24: 圖24 困難難度游戲進行圖 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- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- JAVA 拼圖游戲 課程設計
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://ioszen.com/p-6686272.html