




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、大連商務(wù)職業(yè)學(xué)院信息技術(shù)與藝術(shù)設(shè)計學(xué)院 畢業(yè)設(shè)計題目 java貪吃蛇小游戲開發(fā) 專 業(yè) 軟件技術(shù) 學(xué) 號 932008 姓 名 望月 指 導(dǎo) 教 師 鴻鵠 2012年3月1日 摘 要 近年來,java作為一種新的編程語言,以其簡單性、可移植性和平臺無關(guān)性等優(yōu)點,得到了廣泛地應(yīng)用,特別是java與萬維網(wǎng)的完美結(jié)合,使其成為網(wǎng)絡(luò)編程和嵌入式編程領(lǐng)域的首選編程語言。jbuilder是borland公司用于快速開發(fā)java應(yīng)用的一款優(yōu)秀的集成開發(fā)環(huán)境,它以其友好的開發(fā)界面、強(qiáng)大的組件支持等優(yōu)點,得到廣大程序員的接受和認(rèn)可。 “貪吃蛇”游戲是一個經(jīng)典的游戲,它因操作簡單、娛樂性強(qiáng)而廣受歡迎。本文基于ja
2、va技術(shù)和jbuilder開發(fā)環(huán)境,開發(fā)了一個操作簡單、界面美觀、功能較齊全的“貪吃蛇”游戲。通過本游戲的開發(fā),達(dá)到學(xué)習(xí)java技術(shù)和熟悉軟件開發(fā)流程的目的。本文在介紹java相關(guān)技術(shù)和國內(nèi)外發(fā)展現(xiàn)狀的基礎(chǔ)上,對“貪吃蛇”游戲的整個生命周期的各個開發(fā)階段進(jìn)行了詳細(xì)地介紹。首先,分析了開發(fā)本游戲軟件的可行性,重點分析本設(shè)計所采用的技術(shù)的可行性。其次,從游戲主界面等幾方面,分析了本游戲的功能需求;從可使用性和安全性方面分析了屬性需求。然后,進(jìn)行了游戲的概要設(shè)計和詳細(xì)設(shè)計,這也是本文的重點。概要設(shè)計給出二個功能模塊的主框架以及六個類模塊的函數(shù)調(diào)用關(guān)系;詳細(xì)設(shè)計介紹了java2標(biāo)準(zhǔn)運(yùn)行環(huán)境的配置,重點
3、給出各個類模塊的程序流程圖以及uml圖,列表介紹了各個類包含的變量、使用的方法,展示了游戲的界面。為了保證程序代碼的正確性和功能實現(xiàn)的可靠性,本文還介紹了游戲軟件的程序調(diào)試過程和功能測試結(jié)果。關(guān)鍵詞:java貪吃蛇 貪吃蛇小游戲 貪吃蛇jdk 目 錄摘要.i1.引言.21.1開發(fā)工具.21.2應(yīng)用環(huán)境.22.系統(tǒng)需求分析.32.1需求分析.32.2可行性分析.33.系統(tǒng)概要設(shè)計.43.1設(shè)計目標(biāo).43.2系統(tǒng)功能模塊.44.系統(tǒng)詳細(xì)設(shè)計.64.1程序設(shè)計.64.2程序源代碼.104.3各功能界面截圖.235.系統(tǒng)測試.29 5.1測試的意義.295.2測試過程.295.3測試結(jié)果.30參考文獻(xiàn)
4、.31致謝.321.引言1.1 開發(fā)工具 sun microsystems公司在推出java語言的同時,推出了一套開發(fā)工具jdk。sun提供的基于字符模式的java開發(fā)工具包jdk: java開發(fā)工具(jdk)是許多java專家最初使用的開發(fā)環(huán)境。java是平臺無關(guān)的語言是指用java寫的應(yīng)用程序不用修改就可在不同的軟硬件平臺上運(yùn)行。 java源程序編寫借助于記事本,editpuls,ultraedit等第三方編輯工具。 所有的java文件編輯、編譯、調(diào)試、解釋運(yùn)行都是通過使用字符命令來執(zhí)行操作。jdk由一個標(biāo)準(zhǔn)類庫和一組建立,測試及建立文檔的java實用程序組成。其核心javaapi是一些預(yù)
5、定義的類庫,開發(fā)人員需要用這些類來訪問java語言的功能。jdk 是整個java的核心,包括了java運(yùn)行環(huán)境(java runtimeenvirnment),一堆java工具和java基礎(chǔ)的類庫(rt.jar)。不論什么java應(yīng)用服務(wù)器實質(zhì)都是內(nèi)置了某個版本的jdk。因此掌握jdk是學(xué)好java的第一步。 jdk里面是java類庫和java的語言規(guī)范,它提供的是無論你用何種開發(fā)軟件寫java程序都必須用到的類庫和java語言規(guī)范.沒有jdk,你的java程序根本就不能用。 最主流的jdk是sun公司發(fā)布的jdk,除了sun之外,還有很多公司和組織都開發(fā)了自己的jdk,例如ibm公司開發(fā)的j
6、dk,bea公司的jrocket,還有g(shù)nu組織開發(fā)的jdk等等。其中ibm的jdk包含的jvm(java virtual machine)運(yùn)行效率要比sunjdk包含的jvm高出許多。而專門運(yùn)行在x86平臺的jrocket在服務(wù)端運(yùn)行效率也要比sunjdk好很多。但不管怎么說,我們還是需要先把sun jdk掌握好。1.2 應(yīng)用環(huán)境(1)操作系統(tǒng):solaris、windows nt、windows 95等(2). 應(yīng)用軟件:jdk1.52.系統(tǒng)需求分析2.1 需求分析本系統(tǒng)主要是完成貪吃蛇游戲的基本操作。用戶可以自己練習(xí)和娛樂。本系統(tǒng)需要滿足以下幾點要求:(1) 利用方向鍵來改變蛇的運(yùn)行方向
7、。 (2) 空格鍵暫停或繼續(xù)游戲,并在隨機(jī)的地方產(chǎn)生食物。 (3) 吃到食物就變成新的蛇體,碰到壁或自身則游戲結(jié)束,否則正常運(yùn)行。2.2 可行性分析貪吃蛇游戲是一種簡單的大眾的游戲,自從計算機(jī)實現(xiàn)以來,深受廣大電腦玩家的喜愛,做一個簡單的貪吃蛇小游戲。 貪吃蛇的核心算法時如何實現(xiàn)移動和吃掉食物,沒有碰到食物的時候,把當(dāng)前運(yùn)動方向上的下個節(jié)點入隊,并以蛇節(jié)點的顏色繪制這個節(jié)點,然后把頭指針?biāo)傅墓?jié)點出隊,并以游戲框架內(nèi)部背景色重繪出隊的節(jié)點,這樣就可以達(dá)到移動的效果。而在吃到食物的時候,則只需把食物入隊即可。實現(xiàn)貪吃蛇的基本的蛇身移動、吃到食物身體增長、和碰到墻壁或自身死亡,能夠暫停和開始。本次
8、設(shè)計我將主要運(yùn)用java語言來完成。java語言是一種跨平臺,適合于分布式計算環(huán)境的面向?qū)ο缶幊陶Z言,用java寫的應(yīng)用程序不用修改就可在不同的軟硬件平臺上運(yùn)行。由于java主要用于網(wǎng)絡(luò)應(yīng)用程序開發(fā),因此對安全性有較高的要求。如果沒有安全保證,用戶從網(wǎng)絡(luò)下載程序執(zhí)行就非常危險。java通過自己的安全機(jī)制防止了病毒程序的產(chǎn)生和下載程序?qū)Ρ镜叵到y(tǒng)的威脅破壞。3.系統(tǒng)概要設(shè)計3.1 設(shè)計目標(biāo)本軟件是針對貪吃蛇小游戲的java程序,利用方向鍵來改變蛇的運(yùn)行方向,空格鍵暫?;蚶^續(xù)游戲,并在隨機(jī)的地方產(chǎn)生食物,吃到食物就變成新的蛇體,碰到壁或自身則游戲結(jié)束,否則正常運(yùn)行。3.2 系統(tǒng)功能模塊 本游戲系統(tǒng)共
9、包括1個java源文件和7個類文件。1. 類之間的關(guān)系如圖1所示。 snakegamesnakeframesnakerunnablestatusrunnablesnakepanelnodesnake圖1類之間的關(guān)系2java源文件及其功能如表所示。表1 java源文件及其功能序號文件名主要功能1snakegame該文件為程序入口,含有main方法。2snakeframe實現(xiàn)菜單控制運(yùn)行等總體要求,實現(xiàn)方向鍵控制蛇的方向,空格鍵控制游戲暫?;蚶^續(xù),還有分?jǐn)?shù)等。 3snake 該文件實現(xiàn)蛇的結(jié)構(gòu)和具體運(yùn)動,如判斷食物是否和怎樣被吃掉及判斷后的動作。 4node該文件實現(xiàn)組成蛇身的單位-食物。5sn
10、akepanel該文件實現(xiàn)畫板功能,用紅藍(lán)間隔畫蛇身。 6statusrunnable該文件為記錄狀態(tài)的線程。 7snakerunnable該文件為蛇運(yùn)動以及記錄分?jǐn)?shù)的線程。 4.系統(tǒng)詳細(xì)設(shè)計4.1 程序設(shè)計1.主類snakegame (1)主類為此程序的入口,定義了snakeframe的對象frame,開始運(yùn)行此程序。 (2)源代碼見文件snakegame.java2.類snakeframe(1)成員變量見表2表2 主要成員變量成員變量描述變量類型名稱狀態(tài)標(biāo)簽private jlabelstatuslabel分?jǐn)?shù)標(biāo)簽private jlabelscorelabel蛇面板private jpa
11、nelsnakepanel速度標(biāo)簽private jlabelspeedlabel蛇類對象private snakesnake菜單條private jmenubarbar游戲菜單jmenugamemenu幫助菜單jmenuhelpmenu速度菜單jmenuspeedmenu新菜單項jmenuitemnewitem暫停菜單項jmenuitempauseitem關(guān)于菜單項jmenuitemaboutitem慢菜單項jmenuitemslowitem中間菜單項jmenuitemmiditem快菜單項jmenuitemfastitem開始菜單項jmenuitembeginitem幫助菜單項jmenui
12、temhelpitem (2)方法見表3表3 主要方法方法名功能snakepanel()創(chuàng)建蛇的面板addkeylistener監(jiān)視器setbounds()設(shè)置尺寸jlabel()設(shè)置標(biāo)簽jmenu()創(chuàng)建菜單jmenuitem構(gòu)造菜單項 3類snake (1)成員變量見表4表4 主要成員變量成員變量描述變量類型名稱是否運(yùn)動booleanisrun蛇體arraylistbody食物nodefood方向intderection分?jǐn)?shù)intscore狀態(tài)intstatus速度intspeed慢public static final intslow中public static final intmid
13、快public static final intfast運(yùn)動中public static final intrunning已暫停public static final intpaused游戲結(jié)束public static final intgameover左public static final intleft上public static final intup右public static final intright下public static final intdown (2)方法見表5表5 主要方法方法名功能iseaten()判斷食物是否被蛇吃掉,如果食物在蛇運(yùn)行方向的正前方,并且與蛇頭
14、接觸,則被吃掉iscollsion()判斷是否碰撞makefood()在隨機(jī)的地方產(chǎn)生食物changederection(int newder)改變運(yùn)行方向move()蛇在運(yùn)行中所采取的措施 4. 類node (1)成員變量見表6表6 主要成員變量成員變量描述變量類型名稱食物塊寬public static final intw食物塊高public static final inth橫坐標(biāo)intx縱坐標(biāo)inty (2)源代碼見文件snakegame.java5.類snakepanel 此類為畫蛇的面板類,是實現(xiàn)紅藍(lán)間隔畫蛇身算法的類。 源代碼見文件源代碼見文件snakegame.java6.類s
15、tatusrunnable 此類為線程的子類,實現(xiàn)記錄狀態(tài)的功能。 源代碼見文件snakegame.java 7.類snakerunnable 此類為線程的子類,實現(xiàn)蛇運(yùn)動以及記錄分?jǐn)?shù)的功能。 4.2 程序源代碼import java.awt.color;import java.awt.component;import java.awt.graphics;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.awt.event.keyevent;import java.awt.eve
16、nt.keylistener;import java.util.arraylist;import javax.swing.borderfactory;import javax.swing.jframe;import javax.swing.jlabel;import javax.swing.jmenu;import javax.swing.jmenubar;import javax.swing.jmenuitem;import javax.swing.jpanel;public class snakegame public static void main(string args) snake
17、frame frame = new snakeframe(); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true); / -記錄狀態(tài)的線程class statusrunnable implements runnable public statusrunnable(snake snake, jlabel statuslabel, jlabel scorelabel) this.statuslabel = statuslabel; this.scorelabel = scorelabel; thi
18、s.snake = snake; public void run() string sta = ; string spe = ; while (true) switch (snake.status) case snake.running: sta = running; break; case snake.paused: sta = paused; break; case snake.gameover: sta = gameover; break; statuslabel.settext(sta); scorelabel.settext( + snake.score); try thread.s
19、leep(100); catch (exception e) private jlabel scorelabel; private jlabel statuslabel; private snake snake;/ -蛇運(yùn)動以及記錄分?jǐn)?shù)的線程class snakerunnable implements runnable public snakerunnable(snake snake, component component) this.snake = snake; ponent = component; public void run() while (true) try s
20、nake.move(); component.repaint(); thread.sleep(snake.speed); catch (exception e) private snake snake; private component component;class snake boolean isrun;/ -是否運(yùn)動中 arraylist body;/ -蛇體 node food;/ -食物 int derection;/ -方向 int score; int status; int speed; public static final int slow = 500; public s
21、tatic final int mid = 300; public static final int fast = 100; public static final int running = 1; public static final int paused = 2; public static final int gameover = 3; public static final int left = 1; public static final int up = 2; public static final int right = 3; public static final int d
22、own = 4; public snake() speed = snake.slow; score = 0; isrun = false; status = snake.paused; derection = snake.right; body = new arraylist(); body.add(new node(60, 20); body.add(new node(40, 20); body.add(new node(20, 20); makefood(); / -判斷食物是否被蛇吃掉 / -如果食物在蛇運(yùn)行方向的正前方,并且與蛇頭接觸,則被吃掉 private boolean isea
23、ten() node head = body.get(0); if (derection = snake.right & (head.x + node.w) = food.x & head.y = food.y) return true; if (derection = snake.left & (head.x - node.w) = food.x & head.y = food.y) return true; if (derection = snake.up & head.x = food.x & (head.y - node.h) = food.y) return true; if (de
24、rection = snake.down & head.x = food.x & (head.y + node.h) = food.y) return true; else return false; / -是否碰撞 private boolean iscollsion() node node = body.get(0); / -碰壁 if (derection = snake.right & node.x = 280) return true; if (derection = snake.up & node.y = 0) return true; if (derection = snake.
25、left & node.x = 0) return true; if (derection = snake.down & node.y = 380) return true; / -蛇頭碰到蛇身 node temp = null; int i = 0; for (i = 3; i body.size(); i+) temp = body.get(i); if (temp.x = node.x & temp.y = node.y) break; if (i body.size() return true; else return false; / -在隨機(jī)的地方產(chǎn)生食物 public void
26、makefood() node node = new node(0, 0); boolean isinbody = true; int x = 0, y = 0; int x = 0, y = 0; int i = 0; while (isinbody) x = (int) (math.random() * 15); y = (int) (math.random() * 20); x = x * node.w; y = y * node.h; for (i = 0; i body.size(); i+) if (x = body.get(i).x & y = body.get(i).y) br
27、eak; if (i body.size() isinbody = true; else isinbody = false; food = new node(x, y); / -改變運(yùn)行方向 public void changederection(int newder) if (derection % 2 != newder % 2)/ -如果與原來方向相同或相反,則無法改變 derection = newder; public void move() if (iseaten() / -如果食物被吃掉 body.add(0, food);/ -把食物當(dāng)成蛇頭成為新的蛇體 score += 10
28、; makefood();/ -產(chǎn)生食物 else if (iscollsion()/ -如果碰壁或自身 isrun = false; status = snake.gameover;/ -結(jié)束 else if (isrun) / -正常運(yùn)行(不吃食物,不碰壁,不碰自身) node node = body.get(0); int x = node.x; int y = node.y; / -蛇頭按運(yùn)行方向前進(jìn)一個單位 switch (derection) case 1: x -= node.w; break; case 2: y -= node.h; break; case 3: x += n
29、ode.w; break; case 4: y += node.h; break; body.add(0, new node(x, y); / -去掉蛇尾 body.remove(body.size() - 1); / -組成蛇身的單位,食物class node public static final int w = 20; public static final int h = 20; int x; int y; public node(int x, int y) this.x = x; this.y = y; / -畫板class snakepanel extends jpanel sna
30、ke snake; public snakepanel(snake snake) this.snake = snake; public void paintcomponent(graphics g) super.paintcomponent(g); node node = null; for (int i = 0; i snake.body.size(); i+) / -紅藍(lán)間隔畫蛇身 if (i % 2 = 0) g.setcolor(color.blue); else g.setcolor(color.yellow); node = snake.body.get(i); g.fillrec
31、t(node.x, node.y, node.h, node.w);/ *試用* node = snake.food; g.setcolor(color.red); g.fillrect(node.x, node.y, node.h, node.w); class snakeframe extends jframe private jlabel statuslabel; private jlabel speedlabel; private jlabel scorelabel; private jpanel snakepanel; private snake snake; private jme
32、nubar bar; jmenu gamemenu; jmenu helpmenu; jmenu speedmenu; jmenuitem newitem; jmenuitem pauseitem; jmenuitem beginitem; jmenuitem helpitem; jmenuitem aboutitem; jmenuitem slowitem; jmenuitem miditem; jmenuitem fastitem; public snakeframe() init(); actionlistener l = new actionlistener() public void actionperformed(actionevent e) if (e.getsource() = pauseitem) snake.isrun = false; if (e.getsource() = beginitem) snake.isrun =
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025附條件借款合同樣式
- 門窗鋁材購銷合同協(xié)議
- 集體商品林流轉(zhuǎn)合同協(xié)議
- 食品鋪底銷售合同協(xié)議
- 項目安全責(zé)任合同協(xié)議
- 除塵布袋供貨合同協(xié)議
- 食品銷售公司合同協(xié)議
- 隨車叉車轉(zhuǎn)讓合同協(xié)議
- 預(yù)定樣板間合同協(xié)議
- 陪診代理加盟合同協(xié)議
- 2024-2025年遼寧省面試真題
- 2024年高考真題河北卷化學(xué)試題(原卷版)
- 2024年高考真題-地理(河北卷) 含答案
- 《建筑施工現(xiàn)場環(huán)境與衛(wèi)生標(biāo)準(zhǔn)》JGJ146-2013
- 水泵房設(shè)施設(shè)備巡檢標(biāo)準(zhǔn)記錄表
- 2024年浙江省中考科學(xué)試卷
- 醫(yī)學(xué)教材 《瘧疾》課件
- 比較思想政治教育智慧樹知到期末考試答案章節(jié)答案2024年西南大學(xué)
- JG-T+100-1999塔式起重機(jī)操作使用規(guī)程
- 山東省濟(jì)南市高新區(qū)2023-2024學(xué)年八年級下學(xué)期期末物理試題
- DLT 5285-2018 輸變電工程架空導(dǎo)線(800mm以下)及地線液壓壓接工藝規(guī)程
評論
0/150
提交評論