




已閱讀5頁,還剩28頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
蘭州商學院隴橋學院 本科生畢業論文(設計)論文(設計)題目:JAVA游戲程序設計 系 別:信息管理系 專 業 (方 向):計算機科學與技術(網絡工程)年 級、 班:08級網絡工程班 學 生 姓 名: 指 導 教 師: 2011年5月2日聲 明本人鄭重聲明:所呈交的畢業論文(設計)是本人在導師的指導下取得的成果。因本畢業論文(設計)引起的法律后果完全由本人承擔。本畢業論文(設計)成果歸蘭州商學院隴橋學院所有。 特此聲明畢業論文(設計)作者簽名: 年 月 日連連看游戲設計摘 要本文用Java來設計與實現簡單的連連看游戲的基本功能,玩家可以在游戲區域中通過鼠標來選取相同的兩個圖片,采用特定的消除規則對它們進行消除的操作,當游戲區域中的所有圖片對都被消除后玩家即可勝利。文章對該游戲的算法以及游戲圖片的繪制、畫線等進行詳細的介紹,實現比較簡單。文章重點內容是:如何設置整個游戲的界面,如何控制連連看游戲中隨機圖片的生成且每種圖片必須為偶數個。游戲開始后,判斷鼠標兩次點擊的圖片能否消去。如何畫出一條線連接這兩個相同的圖片。最后能夠實現簡單的不同的玩法和闖關的功能,增強游戲的趣味興。關鍵詞 連連看 Java 游戲 重點內容AbstractUse java for this design and implementation of the simplest lianliankan games, players can the basic functions in the region through the mouse to choose two identical images, in particular the rules for them to be eliminated. when the area in all the pictures to all the players can be eliminated. on the game of the algorithm and a drawn game, drawing a line waiting for detailed information, the relatively simple.The article is focused on the issues : for placing the entire game interface , how to control was a series of view game generated and random photo in every kind of photo must even-numbered . After the start of the game , can judge the photo of the mouse two hits.How to draw a line linking these two identical photo . Final simple different can be achieved and break through the barrier of functional , enhance the taste xing of the game .Key words Linking up , Java , game Key contents目 錄1 引言.1.1游戲介紹1.2設計目的.1.3主要問題.1.4開發環境.2 需求分析3 可行性研究.4 功能模塊設計.4.1總體模塊.4.2基本類的UML圖5 詳細設計5.1界面設計 5.11開始按鈕5.12暫定按鈕.5.13求助按鈕5.14結束按鈕.5.15重排按鈕.5.16標簽.5.17記分器.5.2畫圖分析.5.3偶數個圖片、重排分析與設計5.4消去算法的分析與設計. 5.41初始化工作. 5.42水平判斷. 5.43垂直判斷5.5畫線的分析與設計.5.6鼠標單擊事件分析與設計5.7幫助算法分析與設計5.8不同玩法的分析分析和設計.6 編碼.7 測試.7.1限時功能的測試7.2畫線測試.7.3圖形的移動測試7.4消除測試.8總結.參考文獻.附錄1.引言: 1.1游戲介紹:連連看來源于街機游戲四川麻將和中國龍,是給一堆圖案中的相同圖案進行配對的簡單游戲,在2003年,一個叫做朱俊的網友將這種形式搬到了PC上,立刻成為辦公一族的新寵,并迅速傳遍了世界各地。飽受工作壓力的人們沒有太多的時間進行復雜的游戲,而對于這種動動鼠標就能過關的游戲情有獨鐘。之后村子的連連看風靡版,阿達的連連看奧運版,連連看反恐版,還有敏敏連連看,水晶連連看等遍地開花,造就了一個連連看的新世界。連連看游戲有多種地圖樣式和道具系統、大大加強了游戲的可玩性,是一款老少皆宜的休閑佳品。 1.2設計目的:游戲旨在學習和鞏固面向對象的程序設計方法,充分體會JAVA在程序設計方面的強大功能和獨特之處。了解用JAVA開發項目的一般過程,培養運用JAVA解決實際問題的工作能力。功能簡單,趣味較大。另外也通過本程序將我四年來所學到專業知識和其他方面的知識融入到實際應用中。1.3主要問題: 開始制作游戲時,主要要解決的問題有以下幾個方面:如何設置整個游戲的界面;如何控制連連看游戲中隨機圖片的生成且每種圖片必須為偶數個;游戲開始后,判斷鼠標兩次點擊的圖片能否消去,即圖片是否相同且圖片之間路徑的判斷. 1.3開發環境: 開發語言:JAVA 開發的集成環境:MyEclipse2、需求分析:隨著信息化產業的不斷發展,人們水平不斷的提高。游戲成為當今時代不可缺少的一部分,它既能減輕人們的壓力也能鍛煉人們的判斷能力和反應能力。不管在那個小游戲網站連連看總是排在玩家歡迎的前幾位,因為它適合于大眾的集體休閑,趣味益志和娛樂。它看似簡單但卻變化無窮,令人上癮。連連看游戲作為一種益智類游戲,由于規則簡單,容易學會,再加上界面上豐富的圖像顯示動畫效果在上班族的辦公電腦上風靡多時,而它的主要功能是使得人們在緊張的工作之余能夠調節人們的心情。連連看游戲有很多的好處。游戲不在是靜態的,而是動態的了。而且在此基礎上游戲變得更加的華麗。無形中增強了游戲的可玩性。 3、可行性研究: 在技術方面Java是當今最為流行的語言,能夠實現連連看游戲。隨著計算機硬件的不斷的提升,連連看要求的配置已不再是問題。因為是本人設計的論文,因此不考慮經濟問題。4、功能模塊: 4.1總體模塊圖1.1為游戲所有要實現的功能:游戲界面的設計。不同的玩法設計。畫出圖形、相連接的線。按照規則尋找連線相消算法。連連看系統圖1.14.2基本類的UML圖Gameboolean is_playing;boolean is_pausing;int time_count;void init() void start() void stop() void pause() void timer() void help() void re_order() 圖 4.11tactic String name int time_limit int flower_count int score Tactic(String name, int time_limit, int flower_count) void start()void stop()void move()void mouse(int x, int y) void randomize(int a)void timer()boolean connect(int x, int y) void re_order() void help() 圖4 .22簡述兩個UML圖:圖4.21為Game的基本類建模圖 ,Game類游戲是游戲界面中使用的基本功能,游戲中開始、暫停、幫助、結束、重排,得分記分器等基本功能。圖4.22為tactic的基本建模圖。作為一個連連看游戲基本的屬性當然的有,有花的個數,花的名字,每次出現在屏幕上面的花的個數,玩家消去的花的個數,玩家的成績,點擊鼠標事件的做的事件,這些都是tactic類的基本的屬性。5 詳細設計5.1界面設計 游戲界面有很多種,因為時間的有限,本人采用java.中JFrame類實現的窗體,比較簡單。5.1窗體的基本布置窗體利用JFrame調出窗體,設置成滿屏,背景設置為灰色。窗體上應該有開始、暫停、求助、結束、重排等按鈕,并且應該還有一個標簽,標簽的內容就是得分或者成績后面緊跟的是記分器。這些控件在使用之前必須先進行事情的監聽,在實現的過程中,通過接口現實監聽。將每個控件都添加到面板panel中采用borderlayout布局,控件放在相對于窗體南面的方向居中。因為Java中panel默認的布局是flowlayout布局因次無需在將控件進行調正。每個控件的簡單功能如下:5.11開始按鈕:開始即是游戲的開始。游戲剛開始,暫定,求助,結束,重排按鈕都是不可用的,當點擊開始后其他的按鈕才會出現可用的情況。并且為了能夠使程序結構清晰,所以采用start()方法進行調用。start()方法包含time()方法的調用,drawImage()方法等。start()方法的具體實現如下:void start() is_playing = true;tactic = factory(String)comboBox.getSelectedItem();time_count = tactic.time_limit;progressBar.setMaximum(tactic.time_limit);progressBar.setValue(tactic.time_limit);timer.start();startButton.setEnabled(false);stopButton.setEnabled(true);pauseButton.setEnabled(true);helpButton.setEnabled(true);reOrderButton.setEnabled(true);panel.start();panel.drawImage();5.12暫停按鈕:暫停按鈕能夠實現暫停的功能,使的進行游戲的時間不在變動,同時彈出消息框,為了能夠使得程序結構清晰,將暫停的方法設計在pause()方法中。當點擊暫停按鈕時調用pause()方法。具體的pause()方法如下: void pause() is_pausing = true;MessageBox(繼續游戲);is_pausing = false;5.13求助按鈕:求助找出規則下的相同的花色,點擊求助能夠實現簡單的求助功能。同理這兒使用help()方法,使得結構簡單明了。help()方法是static類中方法相同所以調用static類中的help()方法即可。這個我們將在幫助算法中講述。5.14結束按鈕:結束此次游戲,應該分為三種:一種是點擊結束按鈕結束,一種是游戲獲勝結束,還有一種是記分器時間到,游戲結束。當點擊結束按鈕時,其他的按鈕變為不可用,只有開始的按鈕可用。并且在結束后,記分器停止,重畫界面,調用repaint()方法。停止的具體方法如下:void stop() is_playing = false;MessageBox(游戲結束!);/消息對話框progressBar.setValue(0);startButton.setEnabled(true);stopButton.setEnabled(false);pauseButton.setEnabled(false);helpButton.setEnabled(false);reOrderButton.setEnabled(false);timer.stop();panel.repaint();5.15重排按鈕:就是在此次游戲的基礎上,將畫面進行隨機的重新排序,調用方法re_order()方法。tatic類中的方法與這個方法相同,所以我們同樣也在算法的設計中講述。5.16標簽:標簽在這兒是所有控件中是功能最為簡單的控件。它的功能很簡單,就是標記記分器的作用、給標簽初始化值為:積分或者得分即可。為了能夠美觀些,可以設置字體的顏色為:黃色或者紅色。標簽只需添加在記分器的前面即可。5.17記分器:由ProgressBar控件構成,有time類進行控制,應當注意的time使用采用毫秒值。在編程時通過測試,確定具體的值。該值為1000每次減去1。游戲開始的時候,矩形框全填滿。由time()方法對填充進行控制。通過創建另一個線程在游戲進行的時候實現計時功能。并且調用了thread.sleep()方法來控制計時器的進度。按時間進行減少,或者按照成績進行增加。如果時間到了,計分沒有設定的時間快,則游戲失敗,游戲結束。必須將計分的功能和記分器減少設計在一起,記分器隨著時間到減少,但是當成績增加記分器增加,都顯示在ProgressBar控件上面看見。這樣游戲才能具有可玩性。開始按鈕中只需調用此方法即可。具體的方法實現如下:/開始游戲自動調用,記時開始。void timer() if (is_pausing)return;if (is_playing) /時間每次減少delay / 1000time_count -= delay / 1000;if (time_count = 0) progressBar.setValue(time_count);tactic.timer(); elsestop();具體的界面圖形如圖1: 圖15.2畫圖分析與設計在Java中Graphics 類是所有圖形上下文的抽象基類,允許應用程序在組件以及閉屏圖像上進行繪制。利用Graphics類調動的連連看圖片。應當注意的是四周留出畫線的(效果見下圖),利用Java中的畫筆。paint方法畫出圖形,應該注意得是在圖像畫完之后利用dispose()方法釋放掉系統資源。首現調用panel的start()方法將每行,每列的數組的值初始化為-1,計算圖片的長度,寬度。通過測試劃定區域,確定坐標,畫出圖形。方法簡單稱述:start()方法是控制四周空出一周用于畫線,初始化方面板。每次開始程序自動調用paint方法,paint方法調用drawImage(g, i, j)方法描述圖片的坐標和大小以及位置。drawImage()方法畫出圖形。drawImage()申請兩個數組分別存ground和grd存放行數和列數。對grd數組初始化值為:-1。代表的是沒有圖片。通過比較兩個數組的值不同來畫出圖形。grdij數組中的值不等于 groundij的值,為了節省資源,每次都只畫出,被消掉的部分。這個用于不同的玩法中。最后調用dispose()方法釋放資源。Paint()方法負責畫出圖形。drawImage(Graphics g, int r, int c)方法是對圖形的范圍進行具體的描述。具體的相互調用的四個方法如下:/初始化面板void start() for (int i = 1; i rows - 1; i+)for (int j = 1; j cols - 1; j+)grdij = -1;/面板的初始化public void paint(Graphics g) super.paint(g);if (game.is_playing) for (int i = 1; i rows - 1; i+)for (int j = 1; j cols - 1; j+)drawImage(g, i, j);/畫出圖形public void drawImage() Graphics g = getGraphics();for (int i = 1; i rows - 1; i+)for (int j = 1; j cols - 1; j+) if (grdij != groundij) drawImage(g, i, j); grdij = groundij; g.dispose();/圖形范圍描述void drawImage(Graphics g, int r, int c) int no = groundrc;int DX = (c - 1) * (dImageWidth + dXInterval) + dLeftMargin;/左邊距int DY = (r - 1) * (dImageHeight + dYInterval) + dTopMargin; /上邊距離int SX = no % 14 * (sImageWidth + sXInterval) + 3;/裁的寬度int SY = no / 14 * (sImageHeight + sYInterval) + 2;/裁的高度if (groundrc != -1) g.drawImage(image, DX, DY,DX + dImageWidth, DY + dImageHeight, SX, SY, SX + sImageWidth, SY + sImageHeight, this); else g.setColor(GROUND_COLOR); g.fillRect(DX, DY, dImageWidth, dImageHeight);5.3偶數個圖片、重排分析與設計 要出現偶數個圖片我們可以將圖片的放入二維數組中,通過同時出現相同的兩張的方式,實現數組圖片的偶數。將這個數組變為一個一維數組隨機的打亂調換。這樣就能控制出現偶數個圖片,并且為了使得圖片能夠重排,每次只需將這個數組每次的圖片將隨機的調換即可。但是該注意的是要保證圖片的坐標不變。這樣的算法應該注意的問題是必須是偶數列不然有可能多出一列沒法消除。要達到的效果如下:get_flower()方法隨機的取出圖片。init_array(int a)方法存放圖片的二維數組,并且通過 aij+1=aij復制使得出現偶數個圖片。randomize(int a)方法變換數組將存放圖片的二維數組變換為一維并且使得出現的這些圖片隨機的進行調換位置,同時利用這個方法將圖片的坐標記下隨機的打亂數組中的圖片,從而實現重排的功能。具體的實現方法如下:/取花int get_flower() return (int)(Math.random() * flower_count);void init_array(int a) int i, j; /初始化整個數組復值全為-1表示沒有圖片for (i = 0; i rows; i+)for (j = 0; j cols; j+)aij = -1; /四周空出,取圖片,同時出現兩張相同的圖片for (i = 1; i rows - 1; i+) for (j = 1; j cols - 1; j+) if (aij = -1) aij = get_flower(); aij + 1 = aij; aicols - 1 = -1; randomize(a); void randomize(int a) int i, j, k, t;int b = new int(rows - 2) * (cols - 2);k = -1;/變為一維數組for (i = 1; i rows - 1; i+)for (j = 1; j cols - 1; j+)if (aij != -1)b+k = aij;/取出圖片隨機打亂調換位置 for (i = 0; i k; i+)j = (int) (Math.random() * k);t = bi;bi = bj;bj = t;k = 0; /打亂的圖片存入二維數組中,保證坐標不變。for (i = 1; i rows - 1; i+)for (j = 1; j x2) x1 = x2;x2 = x;y = y1;y1 = y2;y2 = y;/向上判斷,取最大的橫坐標x = x1;/x1向上查找for (i = x1 - 1; i = 0; i-)/沒有圖片if (groundiy1 = -1)x =i;elsebreak;top =x;x = x2;/x2向上查找for (i = x2 - 1; i = 0; i-)/沒有圖片if (groundiy2 = -1) x = i;else break;top = Math.max(top, x); / 向下判斷,取最小的值x = x1;/x1向下查找for (i = x1 + 1; i = rows - 1; i+)/沒有圖片if (groundiy1 = -1)x = i;elsebreak;bottom = x;x = x2;/x2向下查找for (i = x2 + 1; i = rows - 1; i+)/沒有圖片if (groundiy2 = -1)x = i;elsebreak;bottom = Math.min(bottom, x);/查找水平連通線if (top = bottom) for (i = Math.max(x1, top); i = Math.min(x2, bottom); i+) flag = true;for (j = Math.min(y1, y2) + 1; j = Math.max(y1, y2) - 1; j+)/中間有不同色的圖片,不用在判斷if (groundij != -1) flag = false;break;/存放水平直通的節點,為真在進行下列判斷,將判斷過的各個節點存入到數組中,進行畫線時調用。if (flag) int k;int l = 0;/(x1,y1)向上存入節點if (x1 i) for (k = x1; k i) for (k = x1; k = i; k-) linel.row = k;linel.col = y1;+l;/向右存入節點if (y1 y2) for (k = y1; k y2)for (k = y1; k = y2; k-) linel.row = i;linel.col = k;+l;/(x2,y2)向下存入節點 if (i x2) for (k = i; k x2)for (k = i; k = x2; k-) linel.row = k;linel.col = y2; +l;/節點附值,表示沒有圖片 linel.row = -1;return true;/查找最短路徑for (i = x1 - 1; i = top; i-) flag = true;/不判斷x1和x2之間的縱列if (i = x1 & i = x2)continue;/水平判斷for (j = Math.min(y1, y2) + 1; j = Math.max(y1, y2) - 1; j+)if (groundij != -1) flag = false;break;if (flag) int k;int l = 0;/取x1聯通向上的節點if (x1 i) for (k = x1; k i) for (k = x1; k = i; k-) linel.row = k;linel.col = y1;+l/取y1聯通向右的節點if (y1 y2) for (k = y1; k y2)for (k = y1; k = y2; k-) linel.row = i;linel.col = k;+l; /取x2聯通向下的節點if (i x2) for (k = i; k x2)for (k = i; k = x2; k-) linel.row = k;linel.col = y2;+l; /節點賦值,表示沒有圖片linel.row = -1;return true;/和上面相同從六個方向判斷,存放節點,查找最短路徑。最后節點賦值,用于后續使用for (i = x2 + 1; i = x1 & i = x2)continue; /橫向行判斷 for (j = Math.min(y1, y2) + 1; j = Math.max(y1, y2) - 1; j+) if (groundij != -1) flag = false; break; if (flag) int k; int l = 0; /存x1上面的節點 if (x1 i) for (k = x1; k i) for (k = x1; k = i; k-) linel.row = k; linel.col = y1; +l; /y1到 y2的節點存放 if (y1 y2) for (k = y1; k y2) for (k = y1; k = y2; k-) linel.row = i; linel.col = k; +l; /x2上面節點的存放 if (i x2) for (k = i; k x2)for(k = i; k = x2; k-) linel.row = k;linel.col = y2;+l;/節點賦值linel.row = -1;return true;5.43垂直判斷 水平判斷排除了三種情況,垂直的判斷就要判斷6種情況。 用上述同樣的思想,先是取的兩個圖片左邊的最大的值。取的左邊的最小的值,然后判斷縱向判斷。然后從六個方向判斷,判斷是通路的節點存入到數組中,給節點賦值,并且返回真。可能出現的情況會有如下的三種。 /交換位置if (y1 y2) x = x1;x1 = x2;x2 = x;y = y1;y1 = y2;y2 = y;/ 與上面同樣的思想,向左取最大的y = y1;for (j = y1 - 1; j = 0; j-)/沒有圖片if (groundx1j = -1)y = j;elsebreak; left = y; y = y2;for (j = y2 - 1; j = 0; j-) /沒有圖片if (groundx2j = -1) y = j;else break; left = Math.max(left, y);/ 與上面同樣的思想,向右取最大的y = y1;for (j = y1 + 1; j = cols - 1; j+) /沒有圖片if (groundx1j = -1)y = j;elsebreak;right = y;y = y2;for (j = y2 + 1; j = cols - 1; j+) /沒有圖片if (groundx2j = -1) y = j; elsebreak;right = Math.min(right, y);/沿著橫向,查找垂直連通線for (j = Math.max(y1, left); j = Math.min(y2, right); j+) flag = true;/縱向查看是否聯通for (i = Math.min(x1, x2) + 1; i = Math.max(x1, x2) - 1; i+)if (groundij != -1) flag = false;break;if (flag)int k;int l = 0;/豎直方向的垂直聯通if (y1 j) for (k = y1; k j)for (k = y1; k = j; k-) linel.row = x1;linel.col = k;+l;if (x1 x2) for (k = x1; k x2)for (k = x1; k = x2; k-) linel.row = k;linel.col = j;+l;if (j y2) for (k = j; k y2)for (k = j; k = y2; k-) linel.row = x2;linel.col = k;+l;linel.row
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備設施包保管理制度
- 設計公司內控管理制度
- 設計單位現場管理制度
- 設計項目人員管理制度
- 診所醫療器械管理制度
- 診斷試劑風險管理制度
- 試驗示范基地管理制度
- 財務資金收支管理制度
- 貨倉搬運安全管理制度
- 貨物海關代理管理制度
- 2024年黃岡團風縣招聘城區社區工作者真題
- 2025年山東省高考歷史試卷真題
- 2025至2030中國農膜行業發展分析及發展前景與投資報告
- 2025圖解《政務數據共享條例》V1.0學習解讀
- 2025電商平臺店鋪轉讓合同模板
- 2025年人教版(2024)初中英語七年級下冊期末考試測試卷及答案
- (2025)事業編考試題庫(附含答案)
- 女性美學課堂企業制定與實施新質生產力項目商業計劃書
- 高端私人定制服務方案
- 2025年保密知識競賽考試題庫300題(含答案)
- 部編版2024-2025學年四年級下冊語文期末測試卷(含答案)
評論
0/150
提交評論