網(wǎng)上書店系統(tǒng)畢業(yè)論文
《網(wǎng)上書店系統(tǒng)畢業(yè)論文》由會員分享,可在線閱讀,更多相關(guān)《網(wǎng)上書店系統(tǒng)畢業(yè)論文(24頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、目 錄 摘 要 3 第1章 概 述 4 1.2 主要工作內(nèi)容 4 第二章 開發(fā)工具的簡介 5 2.2 Java語言的特點(diǎn) 5 2.3 Java語言的發(fā)展 7 第三章 系統(tǒng)需求分析 9 3.1 系統(tǒng)的任務(wù)概述 9 3.2 系統(tǒng)的綜合要求 9 3.2.1 硬件平臺 9 3.2.2 軟件平臺 9 第四章 系統(tǒng)詳細(xì)設(shè)計(jì) 10 4.1 界面設(shè)計(jì)的實(shí)現(xiàn) 10 4.1.1 加載圖片 10 4.1.2 分割任意圖片,然后拼圖 11 4.1.3 畫出界面 12 4.2 鼠標(biāo)事件處理 13 4.2.1 判斷鼠標(biāo)點(diǎn)擊的是哪個(gè)拼圖 14 4.2.2
2、 判斷這個(gè)拼圖可以往哪個(gè)方向移動 14 4.2.3 移動該拼圖的事件 15 如果可以移動圖片,那么就編寫以下代碼: 15 public void move(int nRow,int nCol,int nDirection) 15 { switch(nDirection) 15 4.3 判斷游戲的步數(shù)及所用時(shí)間 16 4.3.1記錄所用的步數(shù) 16 4.3.2記錄所用的時(shí)間 16 4.3.3 計(jì)算玩家的分?jǐn)?shù) 17 4.4 讓游戲能夠判斷游戲是否結(jié)束及怎樣重新開始 17 4.4.1游戲怎樣結(jié)束 17 4.4.2 游戲怎樣開始 18 4.5 讓游戲的每次初始化狀態(tài)都
3、不一樣 19 4.6 增加預(yù)覽的功能 19 4.7 添加音響效果 20 4.8 編寫HTML代碼 20 第五章 小結(jié) 22 致 謝 23 參考文獻(xiàn) 24 摘 要 JAVA語言是目前Internet上大型的WEB應(yīng)用程序開發(fā)時(shí)使用得最熱門的編程語言,本文描述了JAVA和JSP技術(shù)的特點(diǎn)以及在互聯(lián)網(wǎng)上的使用情況,介紹這兩種技術(shù)的重要編程方法和兩者之關(guān)的聯(lián)系,并完成一個(gè)基于這種技術(shù)的網(wǎng)上書店系統(tǒng)。 【關(guān)鍵字】JAVA, JavaBeans, Servlet, JSP, 網(wǎng)絡(luò)編程, 電子商務(wù), 網(wǎng)上書店 第1章 概 述 1.1 引言
4、 隨著Internet 的發(fā)展,網(wǎng)絡(luò)已經(jīng)改變了人們學(xué)習(xí)、工作和生活的方式,電子商務(wù)活動正飛速度發(fā)展,它使人類社會進(jìn)入*和“虛擬化”運(yùn)作的電子商務(wù)時(shí)代。網(wǎng)上書店系統(tǒng)是在網(wǎng)絡(luò)上建立一種虛擬的圖書書店,用戶足不出戶就可以購買到自己想要的圖書,使用戶不受時(shí)間、空間的限制,讓用戶可以更方便、更快捷地挑選圖書。同時(shí),網(wǎng)上書店可以推動網(wǎng)上支付、郵政、速遞等服務(wù)行業(yè)的迅速發(fā)展。本文從理論和實(shí)際角度出發(fā),設(shè)計(jì)了基于XML 技術(shù)和. NET 平臺的網(wǎng)上書店系統(tǒng)。 1.2 主要工作內(nèi)容 網(wǎng)上書店系統(tǒng)主要實(shí)現(xiàn)網(wǎng)上購書和后臺管理的書店系統(tǒng),主要功能模塊描述如下: (1) 注冊登錄功能。系統(tǒng)提供免費(fèi)注冊功能
5、。注冊用戶登錄之后,可以修改個(gè)人基本信息、刪除非法用戶以及過期登錄用戶的;用戶必須登錄系統(tǒng)后才可以瀏覽圖書信息。 (2) 書籍管理功能。主要包括顯示書籍信息,增加、刪除或更新數(shù)據(jù)信息。 (3) 圖書瀏覽查詢功能。該功能提供用戶分類書籍查詢功能。用戶登錄系統(tǒng)后,系統(tǒng)應(yīng)提供本店圖書目錄供用戶搜索;用戶根據(jù)搜索條目,系統(tǒng)向用戶提供顯示查找后的書籍詳細(xì)信息。在顯示書籍詳細(xì)信息頁面,系統(tǒng)向用戶提供是否決定購買圖書。 (4) 購物車功能。當(dāng)用戶登錄系統(tǒng)后,系統(tǒng)會為用戶準(zhǔn)備一輛“購物車”。當(dāng)用戶進(jìn)行瀏覽圖書或進(jìn)行搜索到自己想要的書之后,將其添加到購物車中,每次買完后,系統(tǒng)會自動到
6、購物車界面,購物車中要清楚地顯示所購圖書的名稱、數(shù)量、價(jià)格、總價(jià)格信息。該功能還應(yīng)包括是否允許用戶更改當(dāng)前購物車中購買圖書的數(shù)量。用戶點(diǎn)擊“繼續(xù)購物”可以繼續(xù)搜索圖書,單擊“更新”后可以更新購物車的內(nèi)容。 (5) 圖書結(jié)賬功能。當(dāng)用戶購物結(jié)束,系統(tǒng)提供結(jié)賬功能。 第二章 開發(fā)工具的簡介 2.1 XML 技術(shù)的優(yōu)勢 可擴(kuò)展標(biāo)記語言( eXtensible markup language ,XML) 是由萬維網(wǎng)聯(lián)盟(World Wide Web COMsortium ,W3C) 推出用于新一代網(wǎng)絡(luò)數(shù)據(jù)表示、傳遞和交換的標(biāo)準(zhǔn),是Internet 環(huán)境中跨平臺的、依賴于內(nèi)容的技
7、術(shù)。XML 的優(yōu)勢十分顯著, 主要表現(xiàn)在如下幾個(gè)方面: (1) 良好的可讀性。在XML 文檔中,人們可以使用特定的標(biāo)記為數(shù)據(jù)定義相關(guān)的語義。 (2) 數(shù)據(jù)內(nèi)容與形式的分離。在XML 文檔中,數(shù)據(jù)的顯示樣式已從文檔中分離出來,放入相關(guān)的樣式表文件中。如果要改動數(shù)據(jù)的表現(xiàn)形式,就不需要改動數(shù)據(jù)本身,而只要改動控制數(shù)據(jù)顯示的樣式表文件。 (3) 可以輕松跨平臺應(yīng)用。XML 文檔是基于文本的,所以很容易被人和機(jī)器閱讀,也非常容易使用,便于不同設(shè)備和不同系統(tǒng)間的信息交換。XML 可以定義自己的數(shù)據(jù)格式,很容易使用軟件工具去讀、寫、交換這些格式的文檔。 (4) 方便的可擴(kuò)展性。XM
8、L 允許各個(gè)組織或個(gè)人建立適合他們自己需要的標(biāo)記集合或標(biāo)記庫,并且這些標(biāo)記集合可以迅速地投入到互聯(lián)網(wǎng)的使用中。總之,XML 技術(shù)的優(yōu)勢顯著,應(yīng)用之廣泛。XML主要在B2B (企業(yè)對企業(yè)) 或B2C(企業(yè)對客戶) 的電子商務(wù)中應(yīng)用。網(wǎng)上書店主要是把數(shù)據(jù)庫和XML 技術(shù)結(jié)合起來,讓用戶在瀏覽器中以XML 文檔形式向Web服務(wù)器進(jìn)行數(shù)據(jù)交換,Web 服務(wù)器把XML 文檔提交給XML 解析器,后臺處理程序通過XML 文件或數(shù)據(jù)庫訪問數(shù)據(jù)并進(jìn)行處理,后臺處理程序再把處理后的數(shù)據(jù)封裝成XML 文檔返回給客戶端瀏覽器。2.2 Java語言的特點(diǎn) 1. 簡單性 Java是一種簡單的語言。Java取消
9、了其它的許多編程語言中十分繁瑣的和難以理解的內(nèi)容,例如C/C++中的指針,C++中類的多重繼承等。Java語言在外觀上讓大多數(shù)程序員都感到很熟悉,這樣程序員不需要經(jīng)過長時(shí)間訓(xùn)練就能夠?qū)W會使用這種新型的程序開發(fā)工具。Java要求的基本解釋器約為40KB ,若加上基本的程序庫,約為215KB。由于Java程序很小,因此在小型機(jī)上Java程序也能夠很好地執(zhí)行。 2. 面向?qū)ο? Java是一種面向?qū)ο蟮恼Z言。這里的“對象”是指應(yīng)用程序的數(shù)據(jù)及其操作方法。Java程序的設(shè)計(jì)思想不同于C語言基于過程的程序設(shè)計(jì)思想。設(shè)計(jì)面向?qū)ο蟮某绦蛐枰獙⒕幊讨攸c(diǎn)放在資料和接口上。 3. 分布式特性 J
10、ava是一種分布式的語言。Java有一個(gè)很周全的程序庫,且很容易與HTTP和TCP/IP通信協(xié)議相配合。Java應(yīng)用程序能在網(wǎng)絡(luò)上開啟并連結(jié)使用對象,就如同透過URL鏈接使用一個(gè)本地文件系統(tǒng)。利用Java來開發(fā)分布式的網(wǎng)絡(luò)程序是Java的一個(gè)重要應(yīng)用。 4. 健壯性 用Java編寫的程序在多種情況下都能穩(wěn)定地執(zhí)行。Java與C/C++最大的不同點(diǎn)是在于Java有一個(gè)專門的指針模型,它的作用是排除內(nèi)存中的數(shù)據(jù)被覆蓋和毀損的可能性。 5. 安全性 Java是一種安全的網(wǎng)絡(luò)編程語言。Java是被設(shè)計(jì)用于網(wǎng)絡(luò)及分布的環(huán)境中的,所以Java程序的安全性自然是非常重要的。Java擁有數(shù)個(gè)階
11、層的互鎖保護(hù)措施,能有效地防止病毒的侵入和破壞行為的發(fā)生。 6. 結(jié)構(gòu)中立性 眾所周知,網(wǎng)絡(luò)是由很多不同機(jī)型的計(jì)算機(jī)組合而成的。這些計(jì)算機(jī)的CPU和操作系統(tǒng)體系結(jié)構(gòu)均有所不同。因此,要使一個(gè)應(yīng)用程序可以在每一種計(jì)算機(jī)上都能夠執(zhí)行是很難的。所幸的是,Java的編譯器能夠產(chǎn)生一種結(jié)構(gòu)中立的目標(biāo)文件格式,這使得編譯碼能夠在多數(shù)的處理器中執(zhí)行。 7. 可移植性 Java的源代碼和C/C++的源代碼一樣具有可移植性,而且Java的可移植性在相比之下還要更強(qiáng)一些。只要有對應(yīng)系統(tǒng)的解釋器,Java程序就可以在所有的系統(tǒng)上執(zhí)行。Java的原始資料形式的大小是被指定的,例如Java之所以
12、一直用“float”來表示一個(gè)32位字節(jié)的IEEE754的浮點(diǎn)運(yùn)算數(shù)字,正是因?yàn)榻^大多數(shù)的CPU都有此共同特征。Java自帶的程序庫定義了一些可移植的程序接口,這使Java語言具備了很好的可移植性。 8. 解釋型語言 Java的源程序首先由編譯器編譯成字節(jié)碼,之后再由解釋器解釋執(zhí)行。Java解釋器能直接在任何機(jī)器上執(zhí)行Java字節(jié)碼(Byte Codes),因此在進(jìn)行程序鏈接時(shí)節(jié)省了時(shí)間,這對于縮短程序的開發(fā)過程有極大的幫助。 9. 高效性 Java字節(jié)碼能迅速地轉(zhuǎn)換成機(jī)器碼(Machine Code)。Java的這種效能幾乎與C/C++沒有分別。用Java編制的Jav
13、a小應(yīng)用程序可以取代部分CGI腳本(CGI Scripts)的功能,但是考到效率方面的問題,在大多數(shù)的情況下很多客戶端的基本操作還是由腳本語言來完成的。涉及到復(fù)雜算法的計(jì)算以及一些特別的效果,就可以由Applet或者ActiveX來完成。 10. 多線程性 Java語言具有多個(gè)線程,這對于交互回應(yīng)能力和即時(shí)行為是有幫助的。 11. 動態(tài)性 Java比C/C++語言更具有動態(tài)性,更能適應(yīng)時(shí)刻在變的環(huán)境。Java不會因程序庫的更新而重新編譯程序。 2.3 Java語言的發(fā)展 Java自正式問世以來已經(jīng)歷了四年的歷程,時(shí)間雖短,發(fā)展極快。一年一度在美國舊金山召開的世界Java
14、One語言開發(fā)者大會(Java One Developer Conference)盛況空前正說明了這一點(diǎn)。四年中每年的Java One大會,既是了解Java最新技術(shù)動態(tài)、應(yīng)用成果和下一步發(fā)展趨勢的最好場所,又是推動下一年Java快速發(fā)展的重要動力。首屆Java One大會于1996年召開,各屆簡況如下: 1996年5月29-31日,第一屆,出席會議者6500余人,來自工業(yè)界的超過一半。有人評價(jià)說:“這是近年計(jì)算機(jī)界最光輝的一次盛會”。工業(yè)界相當(dāng)看好Java語言,認(rèn)為它的使用將會引起一場軟件革命:從軟件的設(shè)計(jì)風(fēng)格、設(shè)計(jì)方法、設(shè)計(jì)目標(biāo)到設(shè)計(jì)過程,都會產(chǎn)生徹底的變革,“甚至?xí)淖兇诵乔虻纳罘绞?/p>
15、”。 1997年,第二屆,出席會議者10000人。Java的追隨者不斷增加,應(yīng)用開發(fā)迅速起步。 1998年3月24-27日,第三屆,出席會議者14000余人(注冊人數(shù)),注冊門票售價(jià)1195美元,否則1395美元,即使如此,仍有不少人不惜工本,擠入會場。本次會議除了軟件巨頭微軟未參加會議外,幾乎所有的計(jì)算機(jī)公司都參加了。展廳內(nèi)設(shè)300多個(gè)展臺,先后舉行了90場專題討論會,每場參加的人數(shù)從千人至五六千人不等。會議的主題是:通過Java的培訓(xùn)來帶動Java軟件的開發(fā)和技術(shù)研究,從而發(fā)展生產(chǎn)力,獲取高額利潤,提高生活質(zhì)量,推動信息產(chǎn)業(yè)的進(jìn)步。會議展出的內(nèi)容大致如下: Java開發(fā)工具軟件
16、,如:JMF、JDK、Symantec Visual Cafe、Java Dynamic Management Kit、JFC、JNDI、Java Studio 等; 企業(yè)信息管理解決方案軟件,如:EJB(Enterprise JavaBeans); 基于Java技術(shù)的信息家電,如:機(jī)頂盒、Java電話等; 個(gè)人信息綜合服務(wù)(Java戒指)、社會信息綜合查詢亭(Kiosk); 電子商務(wù)軟件、智能卡、Java Card API 等; 網(wǎng)絡(luò)計(jì)算環(huán)境下的Java服務(wù)器軟件、遠(yuǎn)程方法調(diào)用(RMI)、基于Java技術(shù)的移動計(jì)算設(shè)備; JMS(Java Message
17、Service)用于出版、票據(jù)訂閱的軟件; JOS(Java OS)、基于Java技術(shù)的NC和Java Station。 1999年6月15-18日,第四屆,出席會議者達(dá)20000人,300多家廠商參展,舉辦400多場技術(shù)講座,555名演講者慷慨陳詞,精彩紛呈。這次大會的主要特點(diǎn)是: Java框架結(jié)構(gòu)被梳理清晰 本次JavaOne大會上,Sun公司的一個(gè)重大舉措就是公布了Java平臺的最新架構(gòu)。重新定義的Java平臺以Java 2為核心,由面向企業(yè)和服務(wù)器市場的企業(yè)版Java 2(J2EE)、面向傳統(tǒng)PC客戶機(jī)市場的標(biāo)準(zhǔn)版Java 2(J2SE)和面向信息電器等后PC終端
18、設(shè)備市場的Micro版Java 2(J2ME)三大部分組成。其中,J2EE包括Enterprise JavaBeans(EJB)、Java Server Pages & Java Servlets、Java Mail API和Java Massage Service組成。而J2ME則是原有的Personal Java、EmbeddedJava、JavaCard以及剛剛推出的Kjava組成。雖然新框架結(jié)構(gòu)中的內(nèi)容都是已有的,但這樣重新定義和組合,使得Java平臺的概念簡單化,從而變得易于理解,更適合于進(jìn)行市場推廣。 第三章 系統(tǒng)需求分析 3.1 系統(tǒng)的任務(wù)概述 這個(gè)游戲?qū)⒁粡?/p>
19、大圖打散成9張小圖,然后在游戲里任意挑8張圖,貼在9個(gè)位置中的任意位置。通過鼠標(biāo)鍵移動打亂的8張圖片,讓其復(fù)原成原來的順序,玩家就勝利了,游戲結(jié)束。 3.2 系統(tǒng)的綜合要求 3.2.1 硬件平臺 CPU: Pentium II、 Celeron800(或以上)。 內(nèi)存:256MB(或以上)。 顯卡:16MB(或以上)顯存。 硬盤:至少150M剩余空間。 3.2.2 軟件平臺 操作系統(tǒng):Microsoft Windows 2000/XP、Linux等。 開發(fā)工具:JBuilder7.0以上。 文檔工具:Microsoft Word 2000以上簡體中文版。 瀏覽工具:In
20、ternet Explorer 6.0以上。 第四章 系統(tǒng)詳細(xì)設(shè)計(jì) 4.1 界面設(shè)計(jì)的實(shí)現(xiàn) 4.1.1 加載圖片 首先找一張漂亮的圖片,用作拼圖游戲的畫面,大小為360*360像素。 首先定義兩個(gè)常量,來記錄每塊拼圖的大小。在此將大圖片分成3*3的拼圖,則每張拼圖的大小為120*120。并定義以下常量: 每張拼圖的寬:final int IMAGE_WIDTH=120; 每張拼圖的高:final int IMAGE_HEIGHT=120; 再定義10個(gè)圖片對象。其中1個(gè)用來裝入總的大圖片,9個(gè)用來裝入每個(gè)拼圖的圖片:image [] m_
21、Image=new Image[9]; 為大圖定義:image m_ImaAll; 在init()中填寫裝入圖片的代碼,如總圖的名稱為:pintu.jpg代碼如下: m_ImaAll=getImage(getCodeBase(),“img\\pintu.jpg”); 通過圖像處理工具把整個(gè)圖像分成了9個(gè)小圖像,分別命名為0.jpg-8.jpg,然后 分別加載,如圖: 總圖:pintu.jpg 以下是分圖:0.jpg 1.jpg 2.jpg
22、 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 用以下代碼加載8張圖片: for(int i=0;i<9;i++) { m_Image[i]=getImage(getCodeBase(),"img/"+i+".jpg"); } 將第2行第2列的拼圖初始化為第8個(gè)拼圖。將第3行第2列的拼圖初始化為無。 ImageNo[1][1]=7; ImageNo[2][1]=NO_IMAGE;
23、 并對paint方法進(jìn)行處理: if(ImageNo[i][j]==NO_IMAGE)g.fill3DRect(x,y,IMAGE_WIDTH,IMAGE_HEIGHT,true) ; else{ g.drawImage(m_Image[ImageNo[i][j]],x,y,this) ; g.drawRect(x,y,IMAGE_WIDTH,IMAGE_HEIGHT) ; } 4.1.2 分割任意圖片,然后拼圖 private void jbInit() throws Exception { m_ImaAll=getImage(getCo
24、deBase(),"img\\Image00001.jpg"); for(int i=0;i<9;i++) { m_Image[i]=createImage(IMAGE_WIDTH,IMAGE_HEIGHT); Graphics g=m_Image[i].getGraphics() ; int nRow=i/3; int nCol=i%3; g.drawImage(m_ImaAll,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,nCol*IMAGE_WIDTH,nRow*IMA
25、GE_HEIGHT,(nCol+1)*IMAGE_WIDTH,(nRow+1)*IMAGE_HEIGHT,this); } } 4.1.3 畫出界面 一、分割界面 在4.1.1中介紹了怎樣分割并加載圖片,圖片裝載完畢后,下一步設(shè)計(jì)界面,并畫出來。 讓界面在左邊留下一定的區(qū)域用來顯示游戲的一些信息,如玩家走了多少步了,玩家是否已經(jīng)贏了,等等;然后在右邊將拼圖的圖片畫出,可以定義一個(gè)常量來標(biāo)識左邊提示信息區(qū)域的寬度,代碼為: final int LEFTX=120; 為了標(biāo)識現(xiàn)在各個(gè)拼圖的排列情況,本設(shè)計(jì)定義一個(gè)二位數(shù)組: int ImageNo[][]=new int[3]
26、[3]; 數(shù)組下標(biāo)表明了這個(gè)地方為哪張拼圖,如項(xiàng)ImageNo[i][j]表明第(i+1)行第(j+1)列上的拼圖為第ImageNo[i][j]張拼圖。 定義一個(gè)常量,當(dāng)ImageNo的某一項(xiàng)等于這個(gè)常量時(shí),表明這個(gè)位置的拼圖為空: final int NO_IMAGE=-1; 定義一個(gè)方法,用來初始化各個(gè)拼圖的排列情況,將拼圖按順序排列在各個(gè)位置上。 public void initData() { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { ImageNo[i][j]=i*3+j; }}} 二、畫左邊的提示信
27、息區(qū)域 在Applet的paint()方法里寫代碼,按照數(shù)組所提供的信息來畫出界面。 將當(dāng)前顏色設(shè)置為深紅色,并填充左邊的提示信息區(qū)域并設(shè)置區(qū)域里的字體為華文行楷,大小20,粗體,白色,顯示位置坐標(biāo)10,40: Color c=new Color(150,0,0); g.setColor(c ); g.fillRect(0,0,LEFTX,IMAGE_HEIGHT*3); g.setFont(new Font("華文行楷",Font.BOLD ,20)) ; g.setColor(Color.white ) ; g
28、.drawString("步數(shù):"+nStep,10,40) ; 三、畫出拼圖區(qū)域 遍歷ImageNo[i][j]數(shù)組,按數(shù)組里所表述的拼圖的排列順序畫出拼圖區(qū)域: for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { int x=j*IMAGE_WIDTH+LEFTX; int y=i*IMAGE_HEIGHT; g.drawImage(m_Image[ImageNo[i][j]],x,y,this) ; g.drawRect(x,y,IMAGE_WIDT
29、H,IMAGE_HEIGHT) ; }} 4.2 鼠標(biāo)事件處理 本設(shè)計(jì)將增加對鼠標(biāo)的事件處理,這樣才能使游戲玩起來,能夠判斷游戲是否結(jié)束。 游戲應(yīng)該讓玩家在用鼠標(biāo)點(diǎn)擊能夠移動的拼圖時(shí),移動拼圖到周圍空格的地方。 加上鼠標(biāo)Listener,實(shí)現(xiàn)它的接口: 1)首先導(dǎo)入包含MouseListener接口的包,這一步JBuilder已經(jīng)為本設(shè)計(jì)完成。 2)聲明實(shí)現(xiàn)MouseListener接口 public class pintu extends Applet implements MouseListener public void mouseClicked(MouseEvent
30、 e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} 3)給這個(gè)Applet添加MouseListener public void init() {…… addMouseListener(this); } 4.2.1 判斷鼠標(biāo)點(diǎn)擊的是哪個(gè)拼圖 int nX=e.getX()-LEFTX;
31、 int nY=e.getY(); int nRow=nY/IMAGE_HEIGHT; int nCol=nX/IMAGE_WIDTH; 4.2.2 判斷這個(gè)拼圖可以往哪個(gè)方向移動 本設(shè)計(jì)建立一個(gè)獨(dú)立的方法directionCanMove(int nCol,int nRow),返回整型值。用一個(gè)整型來代表這個(gè)拼圖可以移動的方向。定義常量(其中:1代表向上,2代表向下,3代表向左,4代表向右,-1代表不能移動): final int DIRECTION_UP=1; final int DIRECTION_DOWN=2; final int DIRECTION_LEF
32、T=3; final int DIRECTION_RIGHT=4; final int DIRECTION_NONE=-1; 需要在4個(gè)方向上依次判斷有沒有拼圖,若沒有,則返回這個(gè)方向值。若4個(gè)方向都有拼圖存在,則返回一個(gè)整數(shù)值標(biāo)志不能移動。該方法的代碼如下: public int directionCanMove(int nRow,int nCol) {if((nRow-1)>=0) if(ImageNo[nRow-1][nCol]==NO_IMAGE) return DIRECTION_UP; if((nRow+1)<=2
33、) if(ImageNo[nRow+1][nCol]==NO_IMAGE) return DIRECTION_DOWN; if((nCol-1)>=0) if(ImageNo[nRow][nCol-1]==NO_IMAGE) return DIRECTION_LEFT; if((nCol+1)<=2) if(ImageNo[nRow][nCol+1]==NO_IMAGE) return DIRECTION_RIGHT; return
34、DIRECTION_NONE; } 4.2.3 移動該拼圖的事件 如果可以移動圖片,那么就編寫以下代碼: public void move(int nRow,int nCol,int nDirection) { switch(nDirection) { case DIRECTION_UP: ImageNo[nRow-1][nCol]=ImageNo[nRow][nCol]; ImageNo[nRow][nCol]=NO_IMAGE; break; case DI
35、RECTION_DOWN: ImageNo[nRow+1][nCol]=ImageNo[nRow][nCol]; ImageNo[nRow][nCol]=NO_IMAGE; break; case DIRECTION_LEFT: ImageNo[nRow][nCol-1]=ImageNo[nRow][nCol]; ImageNo[nRow][nCol]=NO_IMAGE; break; case DIRECTION_RIGHT:
36、 ImageNo[nRow][nCol+1]=ImageNo[nRow][nCol]; ImageNo[nRow][nCol]=NO_IMAGE; break; } } 4.3 判斷游戲的步數(shù)及所用時(shí)間 4.3.1記錄所用的步數(shù) 定義兩個(gè)常量,用于存儲當(dāng)前玩家所走的步數(shù)和已經(jīng)玩的時(shí)間: int nStep=0; int nTime=0; 在mouseClicked()方法里添加如下代碼了: int nDirection=directionCanMove(nRow,nCol); if(nDirectio
37、n!=DIRECTION_NONE) {move(nRow,nCol,nDirection); nStep++; } 4.3.2記錄所用的時(shí)間 本設(shè)計(jì)通過Runnable接口來實(shí)現(xiàn)多線程,過程如下: (1)首先聲明要實(shí)現(xiàn)Runnable接口 public class pintu extends Applet implements MouseListener,Runnable{} (2)實(shí)現(xiàn)接口里的方法: public void run() { while(true) { try { timeThread.sleep(999) ;
38、 String str="你玩了"+nTime+"秒的時(shí)間"; if(nTime>200)str=str+",你可要加油啦!"; else str=str+"別緊張,慢慢來。"; showStatus(str); if(!WantStartNewGame)nTime++; }catch(Exception e){} } } 在init方法里新建一個(gè)線程: timeThread=new Thead(this); timeThread.start(); 在initData里將nTime置為0: nTi
39、me=0; 4.3.3 計(jì)算玩家的分?jǐn)?shù) 采用(1000-步數(shù)*10-時(shí)間)來記分 4.4 讓游戲能夠判斷游戲是否結(jié)束及怎樣重新開始 4.4.1游戲怎樣結(jié)束 本設(shè)計(jì)只要判斷8張拼圖是否都已經(jīng)到了正確的位置上就行了。如果是,游戲結(jié)束,并給出相應(yīng)的分?jǐn)?shù),并讓玩家可以重新開始游戲。 先定義一個(gè)Applet的成員WantStartNewGame,用來標(biāo)志游戲是否結(jié)束,是否需要重新開始新游戲: boolean WantStartNewGame=false; 方法如下: public void checkStatus() { boolean Win=true;
40、 int CorrectNum=0; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(ImageNo[i][j]!=CorrectNum&&ImageNo[i][j]!=NO_IMAGE) Win=false; CorrectNum++; } } if(Win)WantStartNewGame=true; } 調(diào)用這個(gè)方法后,會將當(dāng)前的游戲狀態(tài)存在WantStartNe
41、wGame里,通過查看WantStartNewGame的值,就可以得知當(dāng)前的游戲狀態(tài)是還沒有結(jié)束,還是已經(jīng)贏了。 4.4.2 游戲怎樣開始 由于每次移動拼圖之后,都要調(diào)用重畫方法,所以,本設(shè)計(jì)將這個(gè)方法的調(diào)用放到paint方法里。 在paint方法里本設(shè)計(jì)增加如下代碼,讓游戲能夠判斷當(dāng)前狀態(tài),并能夠在游戲可以結(jié)束時(shí)打印出有關(guān)信息,如“你贏了”之類的信息: public void paint(Graphics g) {…… checkStatus(); if(WantStartNewGame) { g.setColor(Color.yellow )
42、 ; g.setFont(new Font(“宋體”,Font.BOLD ,15)) ; g.drawString("你贏了,祝賀你!",5,180) ;} } 4.5 讓游戲的每次初始化狀態(tài)都不一樣 前面寫下的初始化游戲狀態(tài)的方法過于簡單,玩家只要玩過一次之后,就沒有什么可玩的了。本設(shè)計(jì)用Math包里的random()方法來產(chǎn)生隨機(jī)數(shù),用這個(gè)隨機(jī)數(shù)來初始化游戲的狀態(tài)。 randoam():返回一個(gè)double類型的值,這個(gè)值是正的,大于等于0小于1。 使用這個(gè)方法必須要注意:每個(gè)拼圖只能在游戲里出現(xiàn)一次,也就是本設(shè)計(jì)應(yīng)該在9張圖片里隨機(jī)挑出其
43、中的8張,隨機(jī)分配到9個(gè)位置中的8個(gè)位置。代碼如下: public void initData() { int[] HasDistrib=new int[9]; for(int i=0;i<9;i++)HasDistrib[i]=0; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { int ImgNo=-1; do { ImgNo=(int)(Math.random() *9); }while(HasDistrib[ImgNo]==1); ImageNo[i][j
44、]=ImgNo; HasDistrib[ImgNo]=1; } } ImageNo[(int)(Math.random() *3)][(int)(Math.random() *3)]=No_Image; nStep=0; } 4.6 增加預(yù)覽的功能 定義變量Image previewIma; 在jbInit() 方法里繼續(xù)添加: previewIma=createImage(IMAGE_WIDTH,IMAGE_HEIGHT); Graphics g= previewIma.getGraphics() ; g.drawImage(
45、m_ImaAll,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,360,360,this) ; 在paint方法里添加: g.drawImage(previewIma,0,0,this) ; 4.7 添加音響效果 一、準(zhǔn)備聲音文件 可以隨便找任何*.au或*.wav等的聲音文件,讓游戲在每一次移動拼圖時(shí)都發(fā)出這個(gè)聲音。 二、裝載聲音文件 先定義一個(gè)Applet的公共變量來保存裝載的聲音文件。 AudioClip audio1,audio2; 裝載聲音這一部分代碼寫在init方法中 audio1=getAudioClip(getCodeBase(
46、),”au/move.au”)
audio2=getAudioClip(getCodeBase(),”au/notmove.au”)
三、在必要的地方播放聲音文件。
本設(shè)計(jì)準(zhǔn)備在拼圖能夠移動的時(shí)候,播放這個(gè)聲音文件,那么代碼應(yīng)該加在mouseClicked方法里。
if(nDirection!=DIRECTION_NONE)
{ move(nRow,nCol,nDirection);
nStep++;
audio1.play() ; }
else
{ audio2.play() ; }
4.8 編寫HTML代碼
47、tml>
這是一個(gè)拼圖游戲。玩家應(yīng)該將打散的小圖拼成一張大圖
玩家可以通過鼠標(biāo)和鍵盤來移動小圖,移動的次數(shù)在左邊顯示
按replay游戲會重新開始。