《連連看-JAVA課程設(shè)計報告.doc》由會員分享,可在線閱讀,更多相關(guān)《連連看-JAVA課程設(shè)計報告.doc(16頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 課程設(shè)計2013 2014學(xué)年第二學(xué)期設(shè)計題目 連連看游戲程序 院(系) 專 業(yè) 軟件工程 班 級 學(xué)號 學(xué)生姓名 設(shè)計時間 2014年6月24日2014年6月27日指導(dǎo)教師 提交日期 2014年6月27日 目錄目錄21. 課程設(shè)計的目的與要求31.1課程設(shè)計目的與要求31.2課程設(shè)計內(nèi)容31.3課程設(shè)計的實(shí)驗(yàn)環(huán)境31.4課程設(shè)計的預(yù)備知識42.系統(tǒng)模塊結(jié)構(gòu)圖42.1 模塊設(shè)計52.1.1 菜單控制模塊52.1.2 算法模塊62.1.3 界面顯示模塊83.詳細(xì)設(shè)計83.1總體算法思路83.2代碼實(shí)現(xiàn)94.小結(jié)181. 課程設(shè)計的目的與要求1.1課程設(shè)計目的與要求1.掌握J(rèn)AVA語言中面向?qū)ο?/p>
2、的概念,并能在程序中熟練運(yùn)用。2. 了解面向?qū)ο蟪绦蛟O(shè)計(JAVA)的基本概念以及運(yùn)用面向?qū)ο蠹夹g(shù)進(jìn)行程序設(shè)計的基本思想。 3. 能正確編寫和調(diào)試JAVA程序。4. 了解在JAVA環(huán)境下進(jìn)行程序設(shè)計的基本思想和方法。1.2課程設(shè)計內(nèi)容1.設(shè)計一個連連看的游戲程序。2.在JAVA環(huán)境下,將上述程序使用GUI、數(shù)據(jù)結(jié)構(gòu)等內(nèi)容完成3.設(shè)計思路:(1)界面設(shè)計1)初始測試界面可以考慮使用簡單的按鈕來代表連連看游戲中的圖標(biāo)。2)布局可以考慮使用GRID方式。3)設(shè)計菜單選擇連連看難度等內(nèi)容,具體可參照QQ連連看,也可自定義。4)考慮完善界面,例如動畫等。(2)代碼設(shè)計1)本設(shè)計的核心為練練看算法的設(shè)計,
3、可以考慮數(shù)據(jù)結(jié)構(gòu)中的圖的遍歷章節(jié),合理設(shè)計算法,將界面中各按鈕的分布映射入數(shù)學(xué)矩陣進(jìn)行路徑規(guī)劃。(可以上網(wǎng)搜索相關(guān)算法)。2)完成連連看游戲的圖形、算法等代碼的設(shè)計。4.實(shí)驗(yàn)步驟(包括操作方法、數(shù)據(jù)處理)(1)界面設(shè)計(2)算法設(shè)計(3)代碼設(shè)計1.3課程設(shè)計的實(shí)驗(yàn)環(huán)境硬件要求能運(yùn)行Windows xp/7操作系統(tǒng)的微機(jī)系統(tǒng)。JAVA程序設(shè)計語言及相應(yīng)的集成開發(fā)環(huán)境, ECLIPSE開發(fā)工具。1.4課程設(shè)計的預(yù)備知識熟悉JAVA語言及ECLIPSE開發(fā)工具。2.系統(tǒng)模塊結(jié)構(gòu)圖根據(jù)對“連連看”游戲的分析,該游戲可分為三個模塊:算法模塊、界面顯示模塊、控制模塊。如下圖3-1所示: 連連看游戲界面顯
4、示模塊控制模塊算法模塊2.1 模塊設(shè)計2.1.1控制模塊(1). 開始游戲 (2). 游戲結(jié)束后重新開始 (3). 提示 (4). 不能操作后自動洗牌如下圖3-5所示消圖提示洗牌結(jié)束判斷開始游戲2.1.2 算法模塊在檢驗(yàn)兩個方塊能否消掉的時候,我們要讓兩個方塊同時滿足兩個條件才行,就是兩者配對并且連線成功。如圖4-3所示分 3 種情況:從下面的這三種情況,我們可以知道,需要三個檢測,這三個檢測分別檢測一條直路經(jīng)。這樣就會有三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(兩個轉(zhuǎn)彎點(diǎn))把兩個按鈕連接起來了。 (1)、相鄰 (2)、兩個按鈕分別橫向延伸,如果有一條縱向線能將延伸區(qū)相連則可消
5、除(3)、若(2)失敗兩個按鈕分別縱向延伸,如果有一條橫向線能將延伸區(qū)相連則可消除若以上三步都失敗,說明這兩個按鈕不可以消去。具體判斷流程見下圖(4)、圖片成對加載并打亂將圖片成對的顯示在場景中,并打亂主要用的是Map類。在該類中,用了一個數(shù)組以數(shù)字標(biāo)記的形式來記錄加載的圖片是哪種圖片,在每次加載圖片的時候是一張圖片連續(xù)加載四次,以保證加載圖片成兩對。然后用數(shù)組的隨機(jī)方法將數(shù)組打亂。 (5)、判斷兩圖是否能夠相連兩圖能相連的所有情況: 2.1.3 界面顯示模塊1、提示2、統(tǒng)計分?jǐn)?shù)3、提示是否進(jìn)行下一局或者退出3.詳細(xì)設(shè)計3.1總體算法思路由兩個確定的按鈕。若這兩個按鈕的數(shù)字相等,就開始找它們相
6、連的路經(jīng)。這個找路經(jīng) * 分3種情況:(從下面的這三種情況,我們可以知道,需要三個檢測,這三個檢測分別檢測一條直路經(jīng)。這樣就會有 * 三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(兩個轉(zhuǎn)彎點(diǎn))把兩個按鈕連接起來了) * 1.相鄰 * * 2. 若不相鄰的先在第一個按鈕的同行找一個空按鈕。1).找到后看第二個按鈕橫向到這個空按鈕 * 所在的列是否有按鈕。2).沒有的話再看第一個按鈕到與它同行的那個空按鈕之間是否有按鈕。3).沒有的話,再從 * 與第一個按鈕同行的那個空按鈕豎向到與第二個按鈕的同行看是否有按鈕。沒有的話路經(jīng)就通了,可以消了. * * 3.若2失敗后,再在第一個按鈕的同列
7、找一個空按鈕。1).找到后看第二個按鈕豎向到這個空按鈕所在的行是否有按鈕。 * 2).沒有的話,再看第一個按鈕到與它同列的那個空按鈕之間是否有按鈕。3).沒有的話,再從與第一個按鈕同列的 * 那個空按鈕橫向到與第二個按鈕同列看是否有按鈕。沒有的話路經(jīng)就通了,可以消了。 * * 若以上三步都失敗,說明這兩個按鈕不可以消去。 *3.2代碼實(shí)現(xiàn)1、MainFrame.javajbPrompt.addActionListener(new ActionListener()/提示按鈕增加行為監(jiān)聽Overridepublic void actionPerformed(ActionEvent arg0) po
8、int sp = new point();point ep = new point();game.Tip(sp, ep);jlbsp.x-1sp.y-1.setBorder(BorderFactory.createLineBorder(Color.black);jlbep.x-1ep.y-1.setBorder(BorderFactory.createLineBorder(Color.black); /每提示一次減10分game.deleteScore(10); ); class event implements ActionListener/消除兩個相同的圖片,若相同,則分?jǐn)?shù)加20分;若不同
9、,不作反應(yīng) Overridepublic void actionPerformed(ActionEvent arg0) /重寫接口方法/獲取點(diǎn)擊位置myJButton jlbNext = (myJButton) arg0.getSource(); /輸出坐標(biāo)System.out.println(+jlbNext.xPoint+,+jlbNext.yPoint+); if(flag)if(game.linkOK(jlbFront.xPoint+1,jlbFront.yPoint+1,jlbNext.xPoint+1,jlbNext.yPoint+1)if(game.needRandom()gam
10、e.random(); /通過needRandom()調(diào)用,實(shí)現(xiàn)抖動,并且重置界面for(int i=0;i10;i+)for(int j=0;j10;j+)if(game.getMyMap()i+1j+1!=0)jlbij.setIcon(imageIcongame.getMyMap()i+1j+1-1); if(game.isWin()/贏的時候,提示按鈕功能被屏蔽jbPrompt.setEnabled(false); int n =JOptionPane.showConfirmDialog(null, 你的分?jǐn)?shù)是+game.getScore()+是否想再來一局?,提示,JOptionPa
11、ne.YES_NO_OPTION); /再來一局if(n = JOptionPane.YES_OPTION)MainFrame f = new MainFrame();f.setTitle(連連看);f.setVisible(true);f.setSize(800, 850); class myJButton extends JButton/實(shí)現(xiàn)按鈕和圖片的比例吻合的功能/* * */private static final long serialVersionUID = 1L;public int xPoint;public int yPoint;public myJButton(Scale
12、Icon imageIcon)super(imageIcon);public void setPoint(int x,int y)xPoint = x;yPoint = y;class ScaleIcon implements Icon/初始化圖標(biāo)的大小 /private BufferedImage i = null; private Icon icon = null; public ScaleIcon(Icon icon) this.icon = icon; Override public int getIconHeight() return icon.getIconHeight(); Ov
13、erride public int getIconWidth() return icon.getIconWidth(); public void paintIcon(Component c, Graphics g, int x, int y) float wid = c.getWidth(); float hei = c.getHeight(); int iconWid = icon.getIconWidth(); int iconHei = icon.getIconHeight(); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(
14、RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.scale(wid / iconWid, hei / iconHei); icon.paintIcon(c, g2d, 0, 0); 2、Game.javapublic boolean startGame()for(i=0;isizeX*sizeY;i+)int x = (int) (Math.random()*100);int a = savei;savei = savex;savex = a;/產(chǎn)生100張圖片for(i=0
15、;isizeX*sizeY;i+)mapi = savei;/把圖片的坐標(biāo)信息放入map里for(i=1;i=sizeX;i+)for(j=1;j=sizeY;j+)myMapij=map(i-1)*sizeY+(j-1);/把圖片的坐標(biāo)信息放入map里return true;public boolean canLink(int startX,int startY,int endX,int endY,int step,int di)/判斷能否消除int ss;for(int i=0;i4;i+) /橫向搜索int x = startX + dir0i; /縱向搜索int y = startY
16、+ dir1i; /若沒搜索到,則跳出if(xsizeX+1|ysizeY+1)continue;ss = step;if(i!=di)ss = step +1;if(ss =3)continue;if(x=endX&y=endY)return true;elseif(myMapxy = 0 & usedxy != true)usedxy = true;if(canLink(x,y,endX,endY,ss,i)return true;usedxy = false;elsecontinue;return false; public boolean linkOK(int startX,int s
17、tartY,int endX,int endY)/是否能消掉圖片for(int i=0;iused.length;i+)for(int j=0;jusedi.length;j+)usedij=false;/初始時,定義所有圖片都沒用過usedstartXstartY = true;if(myMapstartXstartY!=myMapendXendY)return false;if(canLink(startX,startY,endX,endY,-1,-1)myMapstartXstartY = 0;myMapendXendY = 0;GameScore += 20;return true;e
18、lsereturn false; public boolean Tip(point sp,point ep)/實(shí)現(xiàn)提示功能for(sp.x=1;sp.xsizeX;sp.x+)for(sp.y=1;sp.y=sizeY;sp.y+)for(ep.x=1;ep.x=sizeX;ep.x+)for(ep.y=1;ep.y=sizeY;ep.y+)for(int i=0;iused.length;i+)for(int j=0;jusedi.length;j+)usedij=false;/初始時,定義所有圖片都沒用過usedsp.xsp.y = true;/改變圖片的used屬性,說明此圖片已經(jīng)消除掉
19、了if(myMapsp.xsp.y=0|myMapep.xep.y=0|(sp.x=ep.x&sp.y=ep.y)|myMapsp.xsp.y!=myMapep.xep.y)continue;/若地圖里myMapsp.xsp.y或者myMapsp.xsp.y沒有圖片,則跳出當(dāng)前循環(huán)if(canLink(sp.x,sp.y,ep.x,ep.y,-1,-1)return true;/如果能消除,則返回truereturn false;public void random()/實(shí)現(xiàn)抖動重置功能 for(int i=1;i=sizeX;i+) for(int j=1;jsizeY;j+) if (my
20、Mapij!=0) myMapij = save-k; public boolean needRandom()/判斷是否需要抖動重置,如果無法通過提示功能消除圖片,則就需要抖動重置/point startPoint = null;/point endPoint = null;if(Tip(new point(),new point()return false;return true; 3、Point.javapackage game;public class point public int x,y;4.小結(jié)以上介紹了連連看游戲的設(shè)計代碼及代碼實(shí)現(xiàn),游戲任務(wù)不設(shè)定限定實(shí)際。所有的圖標(biāo)均采用數(shù)組的形式組織。由于時間有限,這個程序還有需要改進(jìn)的地方,比如:添加聲音,圖案比較單一,并且還可以增加一些功能,例如:設(shè)定限定時間,暫停,重來一局,等。這次實(shí)訓(xùn)讓我學(xué)到了許多東西,不僅在理論上對JAVA有了全新的認(rèn)識,在實(shí)踐方面也有了一定的提高。理論與實(shí)踐相結(jié)合,真正做到學(xué)以致用,這次實(shí)訓(xùn)對我以后學(xué)習(xí),找工作有重大意義。相信這些寶貴經(jīng)驗(yàn)會成為我以后的重要基石。這次實(shí)訓(xùn)讓我明白了團(tuán)隊合作的重要性,保證了效率和準(zhǔn)確性。 16 / 16