《連連看-JAVA課程設(shè)計(jì)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《連連看-JAVA課程設(shè)計(jì)報(bào)告.doc(16頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、 課程設(shè)計(jì)2013 2014學(xué)年第二學(xué)期設(shè)計(jì)題目 連連看游戲程序 院(系) 專 業(yè) 軟件工程 班 級 學(xué)號 學(xué)生姓名 設(shè)計(jì)時(shí)間 2014年6月24日2014年6月27日指導(dǎo)教師 提交日期 2014年6月27日 目錄目錄21. 課程設(shè)計(jì)的目的與要求31.1課程設(shè)計(jì)目的與要求31.2課程設(shè)計(jì)內(nèi)容31.3課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境31.4課程設(shè)計(jì)的預(yù)備知識(shí)42.系統(tǒng)模塊結(jié)構(gòu)圖42.1 模塊設(shè)計(jì)52.1.1 菜單控制模塊52.1.2 算法模塊62.1.3 界面顯示模塊83.詳細(xì)設(shè)計(jì)83.1總體算法思路83.2代碼實(shí)現(xiàn)94.小結(jié)181. 課程設(shè)計(jì)的目的與要求1.1課程設(shè)計(jì)目的與要求1.掌握J(rèn)AVA語言中面向?qū)ο?/p>
2、的概念,并能在程序中熟練運(yùn)用。2. 了解面向?qū)ο蟪绦蛟O(shè)計(jì)(JAVA)的基本概念以及運(yùn)用面向?qū)ο蠹夹g(shù)進(jìn)行程序設(shè)計(jì)的基本思想。 3. 能正確編寫和調(diào)試JAVA程序。4. 了解在JAVA環(huán)境下進(jìn)行程序設(shè)計(jì)的基本思想和方法。1.2課程設(shè)計(jì)內(nèi)容1.設(shè)計(jì)一個(gè)連連看的游戲程序。2.在JAVA環(huán)境下,將上述程序使用GUI、數(shù)據(jù)結(jié)構(gòu)等內(nèi)容完成3.設(shè)計(jì)思路:(1)界面設(shè)計(jì)1)初始測試界面可以考慮使用簡單的按鈕來代表連連看游戲中的圖標(biāo)。2)布局可以考慮使用GRID方式。3)設(shè)計(jì)菜單選擇連連看難度等內(nèi)容,具體可參照QQ連連看,也可自定義。4)考慮完善界面,例如動(dòng)畫等。(2)代碼設(shè)計(jì)1)本設(shè)計(jì)的核心為練練看算法的設(shè)計(jì),
3、可以考慮數(shù)據(jù)結(jié)構(gòu)中的圖的遍歷章節(jié),合理設(shè)計(jì)算法,將界面中各按鈕的分布映射入數(shù)學(xué)矩陣進(jìn)行路徑規(guī)劃。(可以上網(wǎng)搜索相關(guān)算法)。2)完成連連看游戲的圖形、算法等代碼的設(shè)計(jì)。4.實(shí)驗(yàn)步驟(包括操作方法、數(shù)據(jù)處理)(1)界面設(shè)計(jì)(2)算法設(shè)計(jì)(3)代碼設(shè)計(jì)1.3課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境硬件要求能運(yùn)行Windows xp/7操作系統(tǒng)的微機(jī)系統(tǒng)。JAVA程序設(shè)計(jì)語言及相應(yīng)的集成開發(fā)環(huán)境, ECLIPSE開發(fā)工具。1.4課程設(shè)計(jì)的預(yù)備知識(shí)熟悉JAVA語言及ECLIPSE開發(fā)工具。2.系統(tǒng)模塊結(jié)構(gòu)圖根據(jù)對“連連看”游戲的分析,該游戲可分為三個(gè)模塊:算法模塊、界面顯示模塊、控制模塊。如下圖3-1所示: 連連看游戲界面顯
4、示模塊控制模塊算法模塊2.1 模塊設(shè)計(jì)2.1.1控制模塊(1). 開始游戲 (2). 游戲結(jié)束后重新開始 (3). 提示 (4). 不能操作后自動(dòng)洗牌如下圖3-5所示消圖提示洗牌結(jié)束判斷開始游戲2.1.2 算法模塊在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿足兩個(gè)條件才行,就是兩者配對并且連線成功。如圖4-3所示分 3 種情況:從下面的這三種情況,我們可以知道,需要三個(gè)檢測,這三個(gè)檢測分別檢測一條直路經(jīng)。這樣就會(huì)有三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(兩個(gè)轉(zhuǎn)彎點(diǎn))把兩個(gè)按鈕連接起來了。 (1)、相鄰 (2)、兩個(gè)按鈕分別橫向延伸,如果有一條縱向線能將延伸區(qū)相連則可消
5、除(3)、若(2)失敗兩個(gè)按鈕分別縱向延伸,如果有一條橫向線能將延伸區(qū)相連則可消除若以上三步都失敗,說明這兩個(gè)按鈕不可以消去。具體判斷流程見下圖(4)、圖片成對加載并打亂將圖片成對的顯示在場景中,并打亂主要用的是Map類。在該類中,用了一個(gè)數(shù)組以數(shù)字標(biāo)記的形式來記錄加載的圖片是哪種圖片,在每次加載圖片的時(shí)候是一張圖片連續(xù)加載四次,以保證加載圖片成兩對。然后用數(shù)組的隨機(jī)方法將數(shù)組打亂。 (5)、判斷兩圖是否能夠相連兩圖能相連的所有情況: 2.1.3 界面顯示模塊1、提示2、統(tǒng)計(jì)分?jǐn)?shù)3、提示是否進(jìn)行下一局或者退出3.詳細(xì)設(shè)計(jì)3.1總體算法思路由兩個(gè)確定的按鈕。若這兩個(gè)按鈕的數(shù)字相等,就開始找它們相
6、連的路經(jīng)。這個(gè)找路經(jīng) * 分3種情況:(從下面的這三種情況,我們可以知道,需要三個(gè)檢測,這三個(gè)檢測分別檢測一條直路經(jīng)。這樣就會(huì)有 * 三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(兩個(gè)轉(zhuǎn)彎點(diǎn))把兩個(gè)按鈕連接起來了) * 1.相鄰 * * 2. 若不相鄰的先在第一個(gè)按鈕的同行找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕橫向到這個(gè)空按鈕 * 所在的列是否有按鈕。2).沒有的話再看第一個(gè)按鈕到與它同行的那個(gè)空按鈕之間是否有按鈕。3).沒有的話,再從 * 與第一個(gè)按鈕同行的那個(gè)空按鈕豎向到與第二個(gè)按鈕的同行看是否有按鈕。沒有的話路經(jīng)就通了,可以消了. * * 3.若2失敗后,再在第一個(gè)按鈕的同列
7、找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕豎向到這個(gè)空按鈕所在的行是否有按鈕。 * 2).沒有的話,再看第一個(gè)按鈕到與它同列的那個(gè)空按鈕之間是否有按鈕。3).沒有的話,再從與第一個(gè)按鈕同列的 * 那個(gè)空按鈕橫向到與第二個(gè)按鈕同列看是否有按鈕。沒有的話路經(jīng)就通了,可以消了。 * * 若以上三步都失敗,說明這兩個(gè)按鈕不可以消去。 *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/消除兩個(gè)相同的圖片,若相同,則分?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)抖動(dòng),并且重置界面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()/贏的時(shí)候,提示按鈕功能被屏蔽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;/初始時(shí),定義所有圖片都沒用過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;/初始時(shí),定義所有圖片都沒用過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)抖動(dòng)重置功能 for(int i=1;i=sizeX;i+) for(int j=1;jsizeY;j+) if (my
20、Mapij!=0) myMapij = save-k; public boolean needRandom()/判斷是否需要抖動(dòng)重置,如果無法通過提示功能消除圖片,則就需要抖動(dòng)重置/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è)計(jì)代碼及代碼實(shí)現(xiàn),游戲任務(wù)不設(shè)定限定實(shí)際。所有的圖標(biāo)均采用數(shù)組的形式組織。由于時(shí)間有限,這個(gè)程序還有需要改進(jìn)的地方,比如:添加聲音,圖案比較單一,并且還可以增加一些功能,例如:設(shè)定限定時(shí)間,暫停,重來一局,等。這次實(shí)訓(xùn)讓我學(xué)到了許多東西,不僅在理論上對JAVA有了全新的認(rèn)識(shí),在實(shí)踐方面也有了一定的提高。理論與實(shí)踐相結(jié)合,真正做到學(xué)以致用,這次實(shí)訓(xùn)對我以后學(xué)習(xí),找工作有重大意義。相信這些寶貴經(jīng)驗(yàn)會(huì)成為我以后的重要基石。這次實(shí)訓(xùn)讓我明白了團(tuán)隊(duì)合作的重要性,保證了效率和準(zhǔn)確性。 16 / 16