




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、廣東技術(shù)師范學院天河學院JAVA程序設計課程設計報告貪吃蛇的研究與設計號 20120415432102012041543210 2012041543210本軟件122班鄭英姿小組成員:林盛東郭威彭更明 指導教師:所屬系部:計算機科學與技術(shù)系2014年4月25日貪吃蛇的研究與設計近年來,Java作為一種新的編程語言,以其簡單性、可移植性和平臺無關性等優(yōu)點, 得到了廣泛地應用,特別是 Java與萬維網(wǎng)的完美結(jié)合,使其成為網(wǎng)絡編程和嵌入式編程領域的首選編程語言?!柏澇陨摺庇螒蚴且粋€經(jīng)典的游戲,它因操作簡單、娛樂性強而廣受歡迎。本文基 于Java技術(shù)和NetBeans開發(fā)環(huán)境,開發(fā)了一個操作簡單、界面
2、美觀、功能較齊全的“貪吃蛇”游戲。整個游戲程序分為二個功能模塊,八個類模塊,實現(xiàn)了游戲的開始、暫停、結(jié)束。通過本游戲的開發(fā),達到學習Java技術(shù)和熟悉軟件開發(fā)流程的目的。本文在介紹Java相關技術(shù)和國內(nèi)外發(fā)展現(xiàn)狀的基礎上,對“貪吃蛇”游戲的整個生命 周期的各個開發(fā)階段進行了詳細地介紹。首先,分析了開發(fā)本游戲軟件的可行性,重點 分析本設計所采用的技術(shù)的可行性。其次,從游戲主界面等幾方面,分析了本游戲的功 能需求;從可使用性和安全性方面分析了屬性需求。然后,進行了游戲的概要設計和詳 細設計,這也是本文的重點。概要設計給出二個功能模塊的主框架以及八個類模塊的函 數(shù)調(diào)用關系;詳細設計介紹了 Java2
3、標準運行環(huán)境的配置,重點給出各個類模塊的程序列表,介紹了各個類包含的變量、使用的方法,展示了游戲的界面。為了保證程序代碼的正確性和功能實現(xiàn)的可靠性,本文還介紹了游戲軟件的程序調(diào)試過程和功能測試結(jié)果。關鍵詞:Java ; NetBeans ;貪吃蛇;開發(fā)流程3.1引言1.1課題介紹3.1.2設計的背景和意義4.2系統(tǒng)分析2.1可行性分析.4.2.2系統(tǒng)需求分析2.2.1功能需求性能需求界面需求6.2.3開發(fā)環(huán)境6.3系統(tǒng)概要設計7.3.1程序流程圖7.3.2類模塊設計.8.3.3系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設計3.3.1蛇、食物的表示蛇的移動存儲蛇身的數(shù)據(jù)
4、結(jié)構(gòu)蛇的移動方向如何顯示蛇身蛇身的移動方向吃到食物判定系統(tǒng)詳細設計與實現(xiàn)4.1程序設計....8.1.0101.0.主類Main類 MainGui類 Snake類 Food類Box類 SnakeKeyListener類 Clock類 PropertyPanel4.2各功能界面截圖4.2.1貪吃蛇游戲的基本運行界面4.2.2程序開始運行界面101031.4.1414,14.15測試165.1測試的意義結(jié)論17參考文獻18附錄主要代碼清單1.9161引言
5、1.1課題介紹貪吃蛇是世界知名的益智類小游戲, 選擇這個題目一方面的原因是為了將我們自己 的所學知識加以運用;另一方面,雖然很小就接觸這個游戲,但是它的制作方法對我們 而言還是很神秘的。我們希望通過自己的所學知識把它剖析開來, 通過自己的動手實踐,真正的了解它的本質(zhì)和精髓。希望通過這次實踐,我們能從中提高自己的編程能力。并從中學會從零開始分析設計程序。本游戲的開發(fā)語言為Java。開發(fā)工具選用NetBeans。Java是一種簡單的,面向 對象的,分布式的,解釋型的,健壯安全的,結(jié)構(gòu)中立的,可移植的,性能優(yōu)異、多線 程的動態(tài)語言。這里采用Java作為開發(fā)語言主要是基于Java的面向?qū)ο蠛涂梢浦残浴?/p>
6、NetBeans是一個開放源代碼的、基于 Java的可擴展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構(gòu)建開發(fā)環(huán)境。數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種 特定關系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或 者存儲效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關。類是 面向?qū)ο蟪绦蛟O計語言中的一個概念。類(Class)實際上是對某種類型的對象定義變量和方法的原型。它表示對現(xiàn)實生 活中一類具有共同特征的事物的抽象,是面向?qū)ο缶幊痰幕A。類是對某個對象的定義。它包含有關對象動作方式的信息,包括它的名稱、方法、 屬性和
7、事件。實際上它本身并不是對象,因為它不存在于內(nèi)存中。當引用類的代碼運行 時,類的一個新的實例,即對象,就在內(nèi)存中創(chuàng)建了。雖然只有一個類,但能從這個類 在內(nèi)存中創(chuàng)建多個相同類型的對象。1.2設計的背景和意義貪吃蛇游戲一款非常經(jīng)典的手機游戲,因為它比較簡單有趣,無論老少都比較適合。貪 吃蛇的設計對每一個Java語言設計者進行語言提高和進階都是一個很好的鍛煉機會。貪吃蛇游戲的設計比較復雜,它涉及面廣、牽涉方面多,如果不好好考慮和設計, 將難以成功開發(fā)出這個游戲。在這個游戲的設計中,牽涉到圖形界面的顯示與更新、數(shù) 據(jù)的收集與更新,并且在這個游戲的開發(fā)中,還要應用類的繼承機制以及一些設計模式。因此,如何
8、設計和開發(fā)好這個貪吃蛇游戲,對于提高Java開發(fā)水平和系統(tǒng)的設計能力有極大的幫助。在設計開發(fā)過程中,需要處理好各個類之間的繼承關系,還要處理各個 類相應的封裝,并且還要協(xié)調(diào)好各個模塊之間的邏輯依賴關系和數(shù)據(jù)通信關系。正是因為如此,本次畢業(yè)設計的目的在于學習Java程序設計基本技術(shù),學習用NetBeans開發(fā)Java程序的相關技術(shù),熟悉游戲“貪吃蛇”的需求,熟悉項目開發(fā)的完整過程。學會怎樣進行一個項目的需求分析、概要設計、詳細設計等軟件開發(fā)過程, 熟練地掌握Java程序設計的基本技術(shù)和方法,熟練地掌握NetBeans環(huán)境的使用方法, 培養(yǎng)起初步的項目分析能力和程序設計能力。2系統(tǒng)分析2.1可行性
9、分析貪吃蛇游戲是一種簡單的大眾的游戲,自從計算機實現(xiàn)以來,深受廣大電腦玩家的 喜愛,做一個簡單的貪吃蛇小游戲。貪吃蛇的核心算法時如何實現(xiàn)移動和吃掉食物,沒有碰到食物的時候,把當前運動方向上的下個節(jié)點入隊,并以蛇節(jié)點的顏色繪制這個節(jié)點,然后把頭指針所指的節(jié) 點出隊,并以游戲框架內(nèi)部背景色重繪出隊的節(jié)點,這樣就可以達到移動的效果。而在 吃到食物的時候,貝U只需把食物入隊即可。實現(xiàn)貪吃蛇的基本的蛇身移動、吃到食物身 體增長、和碰到墻壁或自身死亡,能夠暫停和開始。本次設計我將主要運用java語言來完成。Java語言是一種跨平臺,適合于分布式計算環(huán)境的面向?qū)ο缶幊陶Z言,用Java寫的應用程序不用修改就可
10、在不同的軟硬件平臺上運行。由于Java主要用于網(wǎng)絡應用程序開發(fā),因此對安全性有較高的要求。如果沒有安全保證,用戶從網(wǎng)絡下載程序執(zhí)行就非常危險。Java通過自己的安全機制防止了病 毒程序的產(chǎn)生和下載程序?qū)Ρ镜叵到y(tǒng)的威脅破壞。2.2系統(tǒng)需求分析221功能需求本系統(tǒng)主要是完成貪吃蛇游戲的基本操作。用戶可以自己練習和娛樂。本系統(tǒng)需要 滿足以下幾點要求:(1) 利用方向鍵來改變蛇的運行方向。(2) 空格鍵暫停或繼續(xù)游戲,并在隨機的地方產(chǎn)生食物。 吃到食物就變成新的蛇體,碰到墻或者自身則游戲結(jié)束,否則正常運行。2.2.2性能需求本軟件在設計方面本著方便、實用及娛樂性高的宗旨,在對界面進行設計的過程中, 始
11、終堅持清晰明了,在性能方面能夠?qū)崿F(xiàn)效率高,不易出錯等優(yōu)點。223界面需求游戲主界面模塊:主要包括游戲圖形區(qū)域界面、游戲開始按鈕、暫停游戲按鈕、關 閉按鈕。游戲的主界面力求美觀,爽心悅目。游戲控制模塊:主要完成控制游戲的開始、暫停、退出等功能,這部分做到易懂、易操作而且準確率咼,不易出錯。游戲的主界面是進入游戲后,能夠給玩家第一感官的部分,主要包括游戲圖形區(qū)域 界面、游戲的速度選擇更新界面、游戲分數(shù)的顯示更新界面、新生方塊的預覽、游戲開 始按鈕、暫停游戲按鈕、退出游戲按鈕以及游戲排行榜按鈕。從很大程度上決定了玩家 對游戲的興趣問題,因此,游戲的主界面力求美觀,爽心悅目。游戲控制模塊是游戲的中心環(huán)
12、節(jié),主要完成控制游戲的開始、暫停、退出等功能。為了能夠給玩家一個很好的游戲環(huán)境,這部分做到易懂、易操作。2.3開發(fā)環(huán)境操作系統(tǒng)及版本:Win dows7工具軟件:jdk1.7,NetBeans編程語言:JAVA語言3系統(tǒng)概要設計3.1程序流程圖圖1游戲處理流程3.2類模塊設計本系統(tǒng)共包括8個類文件。java源文件及其功能如表所示。表3.1 java源文件及其功能序號文件名主要功能1Mai n該文件為程序入口,含有main方法。2Mai nGui主界面類,該類用來創(chuàng)建游戲的用戶界面,繼承自JFrame類。對主窗口的屬性的設置、注冊監(jiān)聽者等3Sn akeKeyListe ner蛇的監(jiān)聽器,根據(jù)按鍵
13、改變蛇的方向、速度等設置4Food該文件實現(xiàn)組成蛇身的單位-食物。5Box該文件實現(xiàn)蛇的活動場所6Snake該文件實現(xiàn)蛇類,包含有關蛇的方法屬性7Clock該文件為工具類,實現(xiàn)時間,速度的控制8PropertyPanelsettingPanel的可視化設置.設置游戲運行狀態(tài),移動 以及分數(shù)更新,實現(xiàn)上下左右移動的方法接口。3.3系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設計 3.3.1 蛇、食物的表示我們可以把顯示區(qū)域想象成一個大大的表格,里面的格子就是組成蛇的基本單位,一個格子可以代表一個食物,使用坐標來區(qū)分這些格子。332蛇的移動蛇向前移動一步,可以看作是蛇頭前面增加了一個節(jié)點,蛇的尾巴上少了一個節(jié)點(即去尾, 加頭)
14、3.3.3存儲蛇身的數(shù)據(jù)結(jié)構(gòu)由于要區(qū)分蛇頭和蛇尾,因此這個數(shù)據(jù)結(jié)構(gòu)必須是有序的。另一方面,我們需要經(jīng)常的訪問第一個和最后一個節(jié)點,所以LinkedList最合適。因為它有 getFirst() ,getLast(),和removeLast()方 法。3.3.4蛇的移動方向這里我們用int型常這里討論蛇的移動方向控制。蛇下一步移動到哪里,是由方向來控制的。量來表示蛇的移動方向。因為我們是根據(jù)原蛇頭的坐標和方向來確定新蛇頭的坐標。在原坐標的基y-1.礎上,根據(jù)蛇頭的運動方向來確定新蛇頭的坐標,比如向上移動就是3.3.5如何顯示蛇身顯示蛇身,其實就是填充用顏色填充格子。需要4個參數(shù),像素坐標x,像素
15、坐標y,格子寬度,格子高度。像素坐標就是矩形左上角的坐標3.3.6蛇身的移動方向(1)相反方向和上一次移動的方向相反的方向稱為相反方向,這種輸入應該忽略。這樣可以防止蛇從自己的身體中穿過。(2 )無效方向在蛇的這一次移動之后和下一次移動之前這個時間間隔內(nèi)輸入了多個非相反方向,只有最后個是有效方向,其他的都是無效方向。蛇的最終運動方向以有效方向為準。337 吃到食物判定這里通過判定坐標是否重合來判斷,只需要判斷蛇頭是否和食物重合就可以了,因為蛇的身體都是走蛇頭走過的地方。4系統(tǒng)詳細設計與實現(xiàn)4.1程序設計4.1.1 主類 Main(1)主類為此程序的入口,定義了Ma in的對象frame,開始運
16、行此程序。(2)源代碼見文件 Mai n. Java4.1.2 類 MainGui(1 )成員變量見表4.1表4.1主要成員變量成員變量描述變量類型名稱設置面板P rivate sett ingPanelsett ingPanel按鍵監(jiān)聽p rivate keyListe nerkeyListe ner蛇場對象P rivate BoxBox主窗口高度intwin dowHeightwin dowHeight主窗口寬度int win dowWidthwin dowWidth(2 )方法見表4.2表4.2主要方法方法名功能addListe ner()注冊監(jiān)聽getBox()更新蛇長getSetti
17、 ngPan el()更新方向4.1.3 類 Snake(1)成員變量見表4.3表4.3主要成員變量成員變量描述變量類型名稱上下左右(方向)IntUP、DOWN、LEFT、RIGHT蛇體Li nkedListv Pointbody蛇場Boxbox前進方向intdirect ion是否活著boolea nislive顏色Colorsn akeColor下一節(jié)點坐標P oi ntn extSite(2 )方法見表4.4表4.4主要方法方法名功能ini t()初始化蛇,方向初始化為向右,增加初始的節(jié)點coun tNewSite()計算下一個位置drawMe()將蛇畫出stareNewGame()死亡
18、之后重新開始游戲4.1.4 類 Food(1)成員變量見表4.5表4.5 主要成員變量成員變量描述變量類型名稱顏色foodColorColor表4.6主要方法方法名功能drawMeO將食物畫出n ewMe()重新產(chǎn)生一個食物4.1.5 類 Box蛇場類。繼承自JPanel,Box,蛇的活動場所,也是食物出現(xiàn)的地方.重寫了該類的paint()方Timer控制,每隔delay時間,執(zhí)行:法,當重繪時時會調(diào)用蛇、食物、網(wǎng)格的繪制方法。由定時器1.重新計算一下位置 2.繪制新圖像3.更新屬性面板的顯示,即該游戲的主要原理。屬性面板的時間 由countTimer中獲取,運行在另外一個線程中,減小計時的誤
19、差4.1.6 類 SnakeKeyListener此類為蛇的監(jiān)聽類,實現(xiàn)蛇運動的監(jiān)聽,根據(jù)按鍵改變蛇的方向、速度等設置該類包含控制器和處理按鍵邏輯,控制器,控制Box, Snake, Food.負責游戲的邏輯.處理按鍵事件,可以處理Snake觸發(fā)的事件,該類覆蓋keyPressed()方法:處理按鍵事件,根據(jù)按鍵不同, 發(fā)出不同的指令:UP:改變蛇的移動方向為向上DOWN:改變蛇的移動方向為向下LEFT:改變蛇的移動方向為向左RIGHT:改變蛇的移動方向為向右newGameO開始新游戲的方法源代碼見文件 Sn akeKeyListe ner.java4.1.7 類 Clock主要功能是計時。源
20、代碼見文件Globel.java4.1.8 類 PropertyPanelsettingPanel的可視化設置.設置游戲運行狀態(tài),移動以及分數(shù)更新,實現(xiàn)上下左右移動的方法接口。源代碼見文件 Prop erty Pan el.java4.2各功能界面截圖 4.2.1貪吃蛇游戲的基本運行界面圖4.1初始界面圖4.2控制面板4.2.2程序開始運行界面(1 )按enter鍵開始游戲,并有暫停和繼續(xù)功能:圖4.4開始游戲(地圖1)(2)、在蛇運動過程中可以按F11、F12或Z、X進行減速或加速。(3)、當蛇運動過程中碰到壁時會死亡,選擇是否繼續(xù)。如圖(3)游戲過程中,若蛇頭碰到蛇尾則游戲結(jié)束,選擇是否繼
21、續(xù)5測試 5.1測試的意義系統(tǒng)測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程,成功的測試是發(fā)現(xiàn)了至今尚未發(fā)現(xiàn)的錯誤的測試。應根據(jù)開發(fā)各階段的需求、測試的目的就是希望能以最少的人力和時間發(fā)現(xiàn)潛在的各種錯誤和缺陷。設計等文檔或程序的內(nèi)部結(jié)構(gòu)精心設計測試用例,并利用這些實例來運行程序,以便發(fā)現(xiàn)錯誤。系 統(tǒng)測試是保證系統(tǒng)質(zhì)量和可靠性的關鍵步驟,是對系統(tǒng)開發(fā)過程中的系統(tǒng)分析系統(tǒng)設計和實施的最后復查。根據(jù)測試的概念和目的,在進行信息系統(tǒng)測試時應遵循以基本原則。(1)擬定測試計劃。在制定測試計劃時,要充分考慮整個項目的開發(fā)時間和開發(fā)進童以及一些人為因素和客觀條件等,使得測試計劃是可行的。測試計劃的內(nèi)容主要有測試的內(nèi)容、
22、進度安排、測試所需的環(huán)境和條件、測試培訓安排等。(3) 根據(jù)測試大綱設計和生成測試用例。在設計測試用例的時候,可綜合利用前面介紹的測試用例和設計技術(shù),產(chǎn)生測試設計說明文檔,其內(nèi)容主要有被測項目、輸人數(shù)據(jù)、測試過程、預期輸出鄉(xiāng)士里絕 結(jié)果等。(4) 實施測試。測試的實施階段是由一系列的測試周期組成的。在每個測試周期中,測試人員和開發(fā)人員將依據(jù)預先編制好的測試大綱和準備好的測試用例,對被測軟件或設備進行完整的測試。(5) 生成測試報告。測試完成后,要形成相應的測試報告,主要對測試進行概要說明,列出測試的結(jié)論,指出缺陷和錯誤,另外,給出一些建議,如可采用的修改方法,各項修改預計的工作量及修改的負責人
23、員。程序運行正常,沒有發(fā)現(xiàn)什么錯誤。6結(jié)論通過這次課程設計,我對上學期所學的JAVA語言程序設計有一個更深刻的了解,將所學的知識應用于實踐,由于所學知識有限,為了使游戲能夠能夠?qū)崿F(xiàn)自己預先的構(gòu)想,我們這組通過上網(wǎng)找代碼和去圖書館借書找程序,比較畫好的流程圖及功能模塊,不斷閱讀修改代碼使程序達到預期所要實現(xiàn)的目標,完成課程設計后,可以感覺到自己對Java程序的又有了新的認識。在做Java設計之前也有做過其他的課程設計,大多規(guī)模很小。綜合運用以前所學習的知識,設計一個JAVA小游戲即貪吃蛇,并能實現(xiàn)以下的功能:游戲背景及樣式的控制、蛇與食物的顏色控制、游戲的速度控制、游戲暫停、游戲重新開始、游戲的
24、結(jié)束。因為其各個模塊間的聯(lián)系十分緊密,代碼重復執(zhí)行率高,當經(jīng)過無數(shù)次的調(diào)試、修改后, 能最終看到成品,有無比自豪的心情。總之,通過本次的課程設計,使我平時學到的理 論知識得到了很好地升華,理論與實際得到一次很好的結(jié)合,為我今后參加工作打下了 堅實的基礎,使我受益匪淺。參考文獻1Narcisio Tumushabe , TAN Guan-zheng An overview of authentication security features in ASP. NET, School of Computer Science and InformationTechno logy2003(3) 2A
25、nders Hejlsberg Scott Wiltamuth P eter Golde. The C# P rogrammi ngLanguageM. POSTS&TELECOM Press ,2008.3 Karli Watson. Beginning Visual C# 2005 M. Wrox,20054 馬蘇拉,許錦興.校友通信錄的UML建模和C#實現(xiàn)J.計算機與數(shù)字工程,2008年第 12期徐龍.基于ASP.NET技術(shù)的電子留言板設計與實現(xiàn)J.電腦知識與技術(shù),2009年第25 期 劉震.廣播電視大學校友錄系統(tǒng)的實現(xiàn)J.江西廣播電視大學學報,2009年第1期7 馬駿,鄭逢斌,
26、沈夏炯.C#網(wǎng)絡應用高級編程.人民郵電出版社,20098 梅曉冬,顏燁青.Visual C#網(wǎng)絡編程技術(shù)與實踐.清華大學出版社,2008.9 張軍偉.基于三層框架的C# ASP.NE工程序設計J.電腦編程技巧與維護,2010年第9 期10 劉克成,張凌曉.C#程序設計中國鐵道出版社,2009.11 劉艾俠.基于A的web service 調(diào)用J.科技信息,2010,第23期12 任艷斐 基于VS.NET動態(tài)移動 Web查詢系統(tǒng)的設計,通信技術(shù)2008年4期13王西鋒,張曉孿.應用程序中數(shù)據(jù)庫自動備份的實現(xiàn)J.現(xiàn)代電子技術(shù)2008年附錄主要代碼清單Mai nGuiimport java.awt.
27、BorderLayout;import java.awt.Dime nsion;import java.awt.Toolkit;import javax.swi ngJFrame;import mys nake.box.Box;import mys nake.c on tral.S nakeKeyListe ner;import mys nake.sett in ggro und.PropertyPan el;p ublic class Mai nGui exte nds JFrame intwin dowHeight;/加數(shù)字是為了顯示效果,下同int win dowWidth;p riva
28、te Box box = new Box(this);Sn akeKeyListe ner keyListe ner = new Sn akeKeyListe ner(this);p rivate PropertyPanel sett ingPanel = new PropertyPan el();public Mai nGui() super(” 貪吃蛇 1.0");setDefaultCloseO peratio n( JFrame.EXIT_ON_CLOSE);wi ndowWidth = 880 + 17;win dowHeight = 600 + 40;Toolkit ki
29、t = T oolkit.getDefaultToolkit();/定義工具包Dime nsion scree nSize = kit.getScree nSize();/獲取屏幕的尺寸int scree nWidth = scree nSize.width;/獲取屏幕的寬int scree nH eight = scree nSize.height;/獲取屏幕的高setLocatio n(scree nWidth / 2 - win dowWidth / 2,scree nH eight / 2 - win dowHeight / 2);/設置窗口居中顯示setSize(wi ndowWid
30、th, wi ndowHeight);setLayout (new BorderLayout();add(box, BorderLayout.CENTER);add(setti ngPanel, BorderLayout.SOUTH);addListe ner();setVisible(true);getBox().requestFocus();import java.awt.eve nt.Act ion Liste ner;p ublic Box getBox() return box;p rivate void addListe ner() this.addKeyListe ner(key
31、Liste ner);box.addKeyListe ner(keyListe ner);sett ingPan el.addKeyListe ner(keyListe ner);sett ingPan el.getRuleText().addKeyListe ner(keyListe ner);p ublic PropertyPanel getSett ingPan el() retur n sett ingPan el;Box.javaimport mys nake.Ma in Gui;import java.awt.Color;import java.awt.Gra phics;impo
32、rt java.awt.eve nt.Act ionEvent;import javax.swi ngJ Pan el;import javax.swi ng.Timer;import mysn ake.setti nggro un d.Clock;p ublic class Box exte nds JPanel Mai nGui gui;p rivate Sn ake sn ake;p rivate Food food;p rivate Timer timer;p rivate int delay = 100;private Color backgrou ndColor = Color.D
33、ARK_GRAY;private Color webColor = Color.DARK_GRAY;p rivate int webStyle = 1;p rivate Clock clock;public Box(Mai nGui in Gui) gui = in Gui;sn ake = new Sn ake(this);food = new Food(this);setBackgro un d(backgro un dColor);timer = new Timer(delay, new Acti on Liste ner() p ublic void actionP erformed(
34、Acti onEvent e) gets nake().cou ntNewSite();repain t();up date Prop erty(););clock = new Clock();clock.getTimeThread().start();Override p ublic void pain t(Gra phics g) setBackgro un d(getBackgro un dColor();super.pain t(g);pai ntBackgrou ndRect(g, getWebStyle();getS nake().drawMe(g);getFood().drawM
35、e(g);p rivate void pain tBackgro un dRect(Gra phics g, int style) g.setColor(getWebColor();switch (style) case 0:return;case 1:for (int i = 0; i < getWidth(); i += 20) for (int j = 0; j < getHeight(); j += 20) g.fill3DRect(i, j, 20, 20, true);break;case 2:for (int i = 0; i < getWidth(); i +
36、= 20) for (int j = 0; j < getHeight(); j += 20) g.fill3DRect(i, j, 20, 20, false);break;case 3:for (int i = 0; i < getWidth(); i += 20) g.drawL in e(i, 0, i, getHeight();for (int i = 0; i < getHeight(); i += 20) g.drawL in e(0, i, getWidth(), i);break;p rivate void up date Prop erty() gui.g
37、etSett ingPan el().getS nakeLe ngthLabel().setText("” +gets nake().getBody().size();switch (gui.getBox().getS nake().getDirecti on() case Snake.DIRECTION DOWN:gui.getSett ingPan el().getDirectio nLabel().setText(”下,J");break;case Snake.DIRECTION LEFT:gui.getSett ingPan el().getDirect ion L
38、abel().setText("左,J ");break;case Snake.DIRECTION RIGHT:右,gui.getSett ingPan el().getDirectio nLabel().setText(” break;case Snake.DIRECTION UP:gui.getSett ingPan el().getDirect ion Label().setText("上,t");break;gui.getSett ingPan el().getS nakeSiteLabel().setText("("+ (g
39、etS nake().getBody().getLast().x + 20) / 20+ (getS nake().getBody().getLast().y + 20) / 20 + ")");gui.getSetti ngPan el().getFoodSiteLabel().setText("("+ (getFood().x + 20) / 20+ (getFood().y + 20) / 20 + ")");秒");gui.getSett ingPan el().getTimeLabel().setText(getC
40、lock().getTime()+"gui.getSett ingPan el().getS peedLabel().setText(”格 /"+getTimer().getDelay()+"毫秒");p ublic Sn ake getS nake() retur n sn ake;p ublic Timer getTimer() retur n timer;return food;public Clock getClock() retur n clock;p ublic Color getBackgro un dColor() retur n bac
41、kgro un dColor;public in t getWebStyle() return webStyle;public Color getWebColor() retur n webColor;Food.javaimport java.awt.Color;import java.awt.Gra phics;import java.awt .Point;import java.util.Ra ndom;p ublic class Food exte nds Point Box box;private Color foodColor = Color.GREEN;p ublic Food(B
42、ox in Box) box = in Box;init();p ublic void in it() this.x = 200;this.y = 60;p ublic void n ewMe() boolea n isC on ti nu eCycle;do int tempX = (new Ra ndom(). next In t(box.getWidth() - 20);int tempY = (new Ran dom(). next In t(box.getHeight() - 20);this.x = tempX - tempX % 20;this.y = tempY - tempY
43、 % 20;isContinu eCycle = false;for (P oi nt p : box.getS nake().getBody() if (p. equals( Poi nt) this) isContinu eCycle = true; while (isC on ti nu eCycle);p ublic void drawMe(Gra phics g) g.setColor(getFoodColor();g.fill3DRect(box.getFood().x, box.getFood().y, 20, 20, true);public Color getFoodColo
44、r() retur n foodColor;四.San ke.javaimport java.awt.Color;import java.awt.Gra phics;import java.awt .Point;import java.util.L in kedList;import javax.swi ng.J Op tio nPane;p ublic class Sn ake public static final int DIRECTION _UP = 1;public static final int DIRECTION_DOWN = -1;public static final in
45、t DIRECTION_LEFT = 2;public static final int DIRECTION_RIGHT = -2;p rivate Lin kedList <Point> body = new Lin kedList <Poin t>();p rivate int direct ion;p rivate Color sn akeColor = Color.RED;p rivate boolea n isLive = true;Poi nt nextSite;Box box;public Snake(Box in Box) box = in Box;in
46、it();p rivate void in it() setDirectio n(DIRECTION_RIGHT);body.add( new Poin t(20, 60);body.add( new Poin t(40, 60);body.add( new Poin t(60, 60);body.add( new Poin t(80, 60);nextSite = new Poi nt(100, 60);p ublic void coun tNewSite() if (!isLive) talk in gdead();頭部增加一個節(jié)點getBody().addLast( new P oi n
47、t(n extSite.x, nextSite.y);/ if (n extSite.equals(box.getFood() box.getFood( ).n ewMe(); else getBody().remove();/移除最后一個節(jié)點switch (getDirectio n() case DIRECTION UP:nextSite.y -= 20;break;case DIRECTION DOWN:nextSite.y += 20;break;case DIRECTION LEFT:nextSite.x -= 20;break;case DIRECTION RIGHT:nextSi
48、te.x += 20;break;if (n extSite.x < 0) nextSite.x = (box.getWidth() / 20 - 1) * 20; else if (n extSite.x > box.getWidth()-20) nextSite.x = 0;if (n extSite.y < 0) nextSite.y = (box.getHeight() / 20 - 1) * 20; else if (n extSite.y > box.getHeight()-20) nextSite.y = 0;for (Point p : getBody(
49、) if (n extSite.equals( p) setlsLive(false);p ublic void drawMe(Gra phics g) g.setColor(s nakeColor);for (Point b : getBodyO) g.fill3DRect(b.x, b.y, 20, 20, true);p rivate void talk in gdead() box.getTimer().st op();int yourChoice = JOp tio nPan e.showC on firmDialog(box,"是否再來一局”,"死了 一&quo
50、t;JOp tio nPan e.YES_NO_ OP TION);if(yourChoice = JOp tio nPan e.YES_ OP TION)startNewGame();elseSystem.exit(0);p rivate void startNewGame() getBody().clear();this.i nit();box.getFood().i nit();box.getTimer().setDelay(100);box.getClock().setTime(0);setlsLive(true);public Lin kedList< Poi nt> g
51、etBody() retur n body;p ublic void setBody(L in kedList <Point> body) this.body = body;p ublic int getDirect ion() return directio n;p ublic void setDirect ion (i nt direct ion) this.directio n = direct ion;p ublic boolea n islsLive() return isLive;p ublic void setlsLive(boolea n isLive) this.
52、isLive = isLive;public Color getS nakeColor() retur n sn akeColor;五.Sn akeKeyListe ner.javacase KeyEve nt.VK_S:import java.awt.eve nt.KeyEve nt;import java.awt.eve nt.KeyListe ner;import mys nake.Mai nGui;import mys nake.box.S nake;p ublic class Sn akeKeyListe ner imp leme nts KeyListe ner Mai nGui
53、gui;public Sn akeKeyListe ner(Mai nGui in Gui) gui = in Gui;p ublic void keyP ressed(KeyEve nt e) switch (e.getKeyCodeO) case KeyEve nt.VK_DOWN:if (gui.getBox().getS nake().getDirectio n() = Sn ake.DIRECTION _UP) return;gui.getBox().getS nake().setDirectio n(Sn ake.DIRECTION_DOWN);break;case KeyEve nt.VK_W: case KeyEve nt.VK_ UP:if (gui.getBox().getS nake().getDire
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中介轉(zhuǎn)租門面合同范本
- 路牌設備轉(zhuǎn)讓合同范本
- 租房合同范本家具
- 團隊代運營合同范本
- 水電小區(qū)轉(zhuǎn)租合同范本
- 舞臺搭建協(xié)議合同范本
- 科技類網(wǎng)站設計中的未來感表達
- 2025年度連鎖便利店合作開店協(xié)議書
- 二零二五年度機場擺渡車司機勞務合同
- 2025年度旅游景區(qū)經(jīng)營權(quán)轉(zhuǎn)讓與旅游產(chǎn)品開發(fā)協(xié)議
- FZ/T 81013-2016寵物狗服裝
- 市政級安全管理
- 《社保知識培訓》教學課件
- 肌力與肌張力課件
- 學生檔案登記表
- is620p系列伺服用戶手冊-v0.2綜合版
- 電信渠道管理人員考核管理辦法
- 勘察工作內(nèi)容及方案
- 八年級數(shù)學(上冊)整式計算題練習100道無答案_新人教版
- 托管中心學生家長接送登記表
- 橋梁施工危險源辨識與防控措施
評論
0/150
提交評論