版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)論文</b></p><p> 題 目: 五子棋畢業(yè)設計</p><p> 系 別: 計算機科學一系 </p><p> 學生姓名: X X X </p><p> 專 業(yè): 軟件工程
2、 </p><p> 學 號: C2010300XXXX </p><p> 指導教師: </p><p> 2012年 X月X日</p><p><b> 1 引言</b></p><p>
3、隨著計算機技術的不斷發(fā)展,網(wǎng)絡技術的普及范圍越來越廣,網(wǎng)絡能夠提供的服務多樣、便捷,已經成為人們生產生活中不可缺少的重要組成部分。如今網(wǎng)絡休閑游戲發(fā)展迅速,它憑借健康、方便、互動性強、益智等諸多優(yōu)點,成為大部分現(xiàn)代人休閑娛樂的首選。</p><p> 網(wǎng)絡五子棋游戲是使用Java語言開發(fā)的一款游戲。它使用SOCKET建立連接,多線程處理數(shù)據(jù),以及可嵌入網(wǎng)絡瀏覽器的APPLET作為客戶端,這些特點使這款游戲無論是
4、服務器還是客戶端的實現(xiàn)都相對容易。通過對該軟件的編寫,還可以鞏固學生對以上各種知識的掌握和理解。</p><p> 2 JAVA語言概述</p><p> 2.1 JAVA簡介</p><p> JAVA是Sun Microsystem公司開發(fā)的編程語言,是一個簡單,面向對象,分布式,解釋性,強壯,安全,與系統(tǒng)無關,可移植,高性能,多線程和動態(tài)的語言。<
5、/p><p> 2.1.1 JAVA的基本特點</p><p><b> (1) 簡單性</b></p><p> Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。 Java實現(xiàn)了自動的垃圾收集,簡化了內存管理的工作。<
6、;/p><p><b> (2) 面向對象</b></p><p> Java提供了簡單的類機制和動態(tài)的構架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現(xiàn)了代碼的復用,又提供了一種動態(tài)的解決方案。</p><p><
7、;b> (3) 多線程</b></p><p> 多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現(xiàn)網(wǎng)絡上的實時交互操作。</p><p><b> (4) 分布性</b></p><p> Java是面向網(wǎng)絡的
8、語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡上很方便的訪問其他對象。</p><p> (5) 體系結構中立</p><p> Java是一種網(wǎng)絡語言,為使Java程序能在網(wǎng)絡的任何地方運行,Java解釋器生成與體系結構無關的字節(jié)碼結構的文件格式。為了使Java的應用程序能不依賴于具體的系統(tǒng),Java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,
9、當程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。</p><p><b> (6) 安全性</b></p><p> 用于網(wǎng)絡、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。</p>
10、<p> 2.1.2 Java中輸入/輸出流概念</p><p> 過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實現(xiàn)了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長度的字
11、節(jié)數(shù),如readBoolean()、 readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長度的字節(jié)數(shù)組,如writeChar()、writeDouble()。 DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數(shù)據(jù),用以實現(xiàn)一種獨立于具體平臺的輸入方式;DataOutputStream 可以向所連接的輸出流寫入基本類
12、型的數(shù)據(jù)。</p><p> 2.1.3 Socket 機制</p><p> Socket是面向客戶/服務器模型設計的,網(wǎng)絡上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。 Socket通常用來實現(xiàn)客戶方和服務方的連接。客戶程序可以向Socket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。</p><
13、p> Socket通信機制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應用需求。使用有聯(lián)接方式時,通信鏈路提供了可靠的,全雙工的字節(jié)流服務。在該方式下,通信雙方必須創(chuàng)建一個聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯(lián)接過程。使用無聯(lián)接方式時其系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報服務,不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達信宿。在該方式下,通信雙方不必創(chuàng)建一個聯(lián)
14、接過程和建立一條通訊鏈路,網(wǎng)絡通信操作在不同的主機和進程之間轉發(fā)進行。</p><p> 在java中使用套接字相當簡單,Java API為處理套接字的通信提供了一個類java.net.Socket。使得編寫網(wǎng)絡應用程序相對容易。JAVA支持流套接字(stream socket)和數(shù)據(jù)報套接字(datagram socket)。流套接字使用TCP(Transmission Control Protocol,傳輸
15、控制協(xié)議)進行數(shù)據(jù)傳輸,而數(shù)據(jù)報套接字使用UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議)。</p><p> 在Socket層實現(xiàn)的Java網(wǎng)絡程序是嚴格同步的。從一臺機器發(fā)送數(shù)據(jù)的操作要求對應一個從其他機器接受數(shù)據(jù)的操作。</p><p> 2.2 JAVA工具</p><p><b> JDK</b></
16、p><p> 1) Java編譯器</p><p> Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴展名為 .java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。</p><p> 2) J
17、ava解釋器</p><p> Java解釋器對編譯生成的字節(jié)碼格式的可執(zhí)行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。</p><p> 3 程序的設計思路和算法</p><p> 3.1 人機博弈的要點人機對弈的程序,至少應具備以下5個部分: (1)某種在機器中表示棋局的方法,能夠讓程序知道博弈的狀態(tài)。 (2)產生合法走法
18、的規(guī)則,以使博弈公正地進行,并可判斷人類對手是否亂走。 (3)從所有合法的走法中選擇最佳的走法技術。 (4)一種評估局面優(yōu)劣的方法,用以同上面的技術配合做出智能的選擇。 (5)一個界面,有了他,這個程序才能用。3.2 五子棋特點及規(guī)則 五子棋的娛樂性強、規(guī)則簡單、易學、流行性廣。普通人不需長時間專門訓練即可自如行棋。因此極受大眾歡迎。五子棋的規(guī)則為: (1)棋盤 采用像圍棋盤一樣的15路或19
19、路線的棋盤,在此采用19路的棋盤。 (2)下法 兩人分別執(zhí)黑白兩色棋子。輪流在棋盤上選擇一個無子的交叉點落子,無子的交叉點又被稱為空點。 (3)輸贏判斷 黑、白雙方有一方的五個棋子在橫、豎或斜方向上連接成一線即為該方贏。3.3 算法設計3.3.1 博弈樹的搜索過程 在以下討論中,命名2個博弈者MAX和MIN。下面的任務是為MAX找最佳的移動。假設MAX先移動,</p><p>
20、 根據(jù)極小極大化分析法,先計算第3層子結點h(n)值,然后第2層子結點的估計值取他的各后繼子結點的極小值,根結點的估計值取他的各子結點的極大值。這個取得最大估計值的子結點即為從S出發(fā)的計算機方的最佳落子方案。棋盤上某一行、某一列或某一對角線為一路,這里使 用的棋盤為19行19列,因此,行和列方向上共有19+19=38路;從左下到右上方向的對角線有37路,同樣,從左上到右下方向的對角線也有37路。但對于五子棋來說必須在一條直線上有連續(xù)
21、五個棋子才能贏。因此,在對角線上就可以減少8路。所以,整個棋盤路的總數(shù)為:對某一棋局n,第i路得分:h(i)=hc(i)-h(huán)m(i)。 其中:hc(i)為計算機方在第i路估計值得分,hm(i)為游戲者一方在第i路得分。對的得分規(guī)則作如下說明。規(guī)則中+代表一空點;o代表對方棋子;*代表有計算機方棋子;++表示連續(xù)2點為空點;+++*++表示連續(xù)3個空點接一個計算機方棋子,再接兩空點。某一規(guī)則+ 表示如在i路上有棋子構成形
22、如+++*++則hc(i)=30。其他規(guī)則表示相同。在系統(tǒng)中使用的主要估值規(guī)則如下: 由對稱性可知++**+++</p><p> 遺傳算法的優(yōu)點: (1)由于搜索算法是從問題的解開始的,而不是一組參數(shù)。所以被局部震蕩干擾導致求最優(yōu)解失敗的可能性大大減小。 (2)此算法能將搜索重點集中于性能高的部分,能較快地求出最佳的參數(shù)。在使用中應當注意的問題如下: 種群數(shù)目 這是影響
23、算法性能的重要因素。種群數(shù)目過大,會導致運算時間太長,結果收斂緩慢;種群數(shù)目太小則可能導致算法精度過低,甚至停止不前。 交叉概率 這個用于控制交叉操作的頻度。此概率過大會導致種群中的個體更新過快,較優(yōu)的個體不能穩(wěn)定的保持和傳遞信息;此概率過小則會使優(yōu)化的過程緩慢甚至停止不前。 變異概率 這個概率用于控制產生變異個體的頻度,目的是防止整個種群中任意參數(shù)的幾個基因保持不變。一 般使用一個很小的概率即足以達成此任務;概率太
24、大則遺傳信息無法穩(wěn)定傳遞,從而使優(yōu)化過程變成隨機過程,失去確切的方向而導致失敗。</p><p><b> 4 程序實現(xiàn)</b></p><p> 4.1 程序設計思路</p><p> 實現(xiàn)一個用戶可以Internet上任何地方的不同機上進行游戲,使用多線程和網(wǎng)絡套接字數(shù)據(jù)流的分布式五子棋游戲,根據(jù)要完成的功能,本程序采用多客戶服務方式
25、。服務器創(chuàng)建服務器Socket,始終處于監(jiān)聽等待狀態(tài)??蛻舳耸莿幼鞯陌l(fā)起者,何時發(fā)出申請由客戶端決定。客戶端向服務器發(fā)出申請,服務器給予響應,客戶端發(fā)出申請后立即可從Socket通道去取服務方的結果。服務器接受兩個客戶端連接后開始一個線程,不斷接受客戶端發(fā)來的數(shù)據(jù),并把處理后的數(shù)據(jù)傳送給客戶端。服務器可以創(chuàng)建任意多局(圖3-1)。</p><p> 在對服務器與客戶端的設計開發(fā)之前,為了使開發(fā)方便,將服務器與客
26、戶端之間用以通信的變量規(guī)定好。通過編寫一個接口GameConstant(),在其中定義各個常量的值:</p><p> public static int PLAYER1 = 1;</p><p> public static int PLAYER2 = 2;</p><p> public static int PLAYER1_WON = 1;</p&
27、gt;<p> public static int PLAYER2_WON = 2;</p><p> public static int DRAW = 3;</p><p> public static int CONTINUE = 4; </p><p> public static int STOP = 100;</p>&
28、lt;p> public static int GAMEPORT = 8000; </p><p> 服務器和客戶端在設計時繼承接口GameConstant()里面的所有數(shù)據(jù)。</p><p> 4.2 服務器的設計與實現(xiàn)</p><p> 為了使界面友好,服務器使用圖形組件,創(chuàng)建成一個可以顯示游戲信息的框架。在框架中創(chuàng)建一個包含文本區(qū)的滾動窗格,并
29、在文本區(qū)顯示游戲信息(圖3-2)。</p><p> 圖3-2 服務器界面</p><p> Fig.3-2 Interface of Game-server</p><p> 要建立服務器,需要創(chuàng)建一個服務器Socket,并把它附加到一個端口上,服務器通過這個端口監(jiān)聽連接請求。端口標識Socket上的TCP服務。網(wǎng)絡的類存放在java.net包中,引入包后通
30、過實現(xiàn)一個ServerSocket的實例就可以創(chuàng)建一個服務器Socket,并把它附加到一個端口(GAMEPORT)上:</p><p> ServerSocket serverSocket = new ServerSocket (GAMEPORT);</p><p> 然后,服務器使用下列語句開始監(jiān)聽連接請求:</p><p> Socket pla
31、yer1 = serverSocket.accept ();</p><p> Socket player2 = serverSocket.accept ();</p><p> 服務器開始等待,直到客戶提出連接請求。連接建立后,服務器通過數(shù)據(jù)輸入流從客戶端接收信息,并且通過數(shù)據(jù)輸出流把相應的標記發(fā)送給客戶端。</p><p> new DataOu
32、tputStream(player1.getOutputStream()).writeInt(PLAYER1);</p><p> new DataOutputStream(player2.getOutputStream()).writeInt(PLAYER2);</p><p> 當客戶端滿足開局條件時,就開啟一個線程處理客戶之間數(shù)據(jù),同時繼續(xù)監(jiān)聽其它客戶端的連接請求。</p&
33、gt;<p> 多線程是Java的一個特點,多線程可以使程序反應更快、交互性更強,并能提高執(zhí)行效率。創(chuàng)建一個新的線程的生命周期如下狀態(tài): 新建,就緒,運行,阻塞,死亡。</p><p> 在Java中,提供了多種控制線程的方法,在服務器中用到的主要以下幾種:</p><p> public void run ()</p><p> Java
34、運行系統(tǒng)調用這個方法來執(zhí)行線程。在用戶線程類中,必須覆蓋這個方法并且提供線程執(zhí)行的代碼。</p><p> public void start ()</p><p> 該方法啟動線程,它引起對run()方法的調用??蛻纛愔械目蛇\行對象調用該方法。</p><p> 服務器程序采用類HandleGame繼承Thread類來實現(xiàn)對線程的調用,同時對run ()
35、方法覆蓋。 </p><p> 以下是HandleGame () 類里面主要的數(shù)據(jù)域和方法:</p><p> private char[][] cell:Char類型數(shù)組用來記錄玩家的標記。</p><p> private DataInputStream isFromPlayer1;</p><p> private DataO
36、utputStream osToPlayer1;</p><p> private DataInputStream isFromPlayer2;</p><p> private DataOutputStream osToPlayer2;</p><p> ?。核膫€數(shù)據(jù)流用來實現(xiàn)與兩個玩家之間信息的傳遞。</p><p> public
37、 HandleGame (Socket player1, Socket player2):</p><p> 構造函數(shù),兩個參數(shù)用以接收傳遞過來的Socket對象。</p><p> public void run():對繼承Thread類中的run ()方法進行覆蓋。</p><p> private boolean isFull() :判斷是否滿格。<
38、;/p><p> private boolean isWon(int row,int column,char token):</p><p> 判斷新標記的單元格是否使一方獲勝。</p><p> 游戲局一旦建立起來,服務器便于工作交替地從客戶端那里接收數(shù)據(jù)。從客戶端接收到數(shù)據(jù)后,服務器判斷游戲狀態(tài),并根據(jù)結果進行相關操作,直至游戲結束。</p>&
39、lt;p> 4.3 客戶端的設計與實現(xiàn)</p><p> 客戶端負責與玩家的交互。因此要創(chuàng)建一個界面,包括一個20*20的下棋區(qū)域,當玩家選定單元格或接收到別的玩家選定的單元格時,用不同的標記顯示;兩個顯示游戲名稱和游戲狀態(tài)的標簽和兩個菜單欄上的按鍵用以進行控制,如圖3-3:</p><p> 圖3-3 客戶端界面</p><p> Fig.3-3 I
40、nterface of Game-client</p><p> 這里客戶程序設計成一個Java Applet,用戶可以在Web瀏覽器里運行。當用戶打開GameClient.html文件時,瀏覽器調用init ()方法對界面進行初始化。點擊Start時開啟一個線程和服務器連接,通過數(shù)據(jù)流進行數(shù)據(jù)交換。</p><p> connectToServer = new Socket(&qu
41、ot;localhost", GAMEPORT);</p><p> isFromServer = new DataInputStream(connectToServer.getInputStream());</p><p> osToServer = new DataOutputStream(connectToServer.getOutputStream());</p
42、><p> 下面是類GameClient的主要方法和數(shù)據(jù):</p><p> public class GameClient extends JApplet</p><p> implements Runnable, ActionListener, GameConstants</p><p><b> {</b>&l
43、t;/p><p> private boolean myTurn = false; :標記是否輪到自己下棋</p><p> private char myToken = ' '; :標記自己的棋子</p><p> private char otherToken = ' '; :標記對手的棋子</p&g
44、t;<p> private Cell[][] cell = new Cell[20][20]; :生成20*20個單元格</p><p> private int rowSelected; :記錄所選單元格的行</p><p> private int columnSelected; :記錄所選單元格的列</p><p>
45、 private boolean continueToPlay = true;</p><p> private boolean waiting = true; </p><p> ?。河涗浻螒蜻M行中的狀態(tài)</p><p> public void init():初始化用戶界面,打開網(wǎng)頁時由瀏覽器調用</p><p> public
46、void actionPerformed(ActionEvent e):</p><p> 覆蓋ActionListener接口里面actionPerformed ()方法,用來處理用戶點擊菜單欄引起的操作。</p><p> public void run()</p><p> 覆蓋Runnable接口里的run ()方法,用以對游戲過程中的數(shù)據(jù)傳輸,處理,
47、控制。</p><p><b> }</b></p><p> 在客戶程序的類中,由于它繼承了Applet類,所以不能再通過聲明Thread類的擴展來實現(xiàn),只能通過實現(xiàn)Java提供的一個Runnable接口,進行線程的創(chuàng)建和運行。Runnable接口的實現(xiàn)是非常簡單的,它只包含run ()方法,使用時只要將該方法覆蓋。</p><p>
48、從游戲設計來看,單元格是處理鼠標點擊事件和顯示標記的GUI對象。在這里使用的是面板,設置單元格Cell為JPanel的子類。將Cell類聲明為內部類,可以直接使用GameClient類中定義的變量與方法,使程序簡潔明了。</p><p> Cell類中包含以下主要數(shù)據(jù)和方法:</p><p> public class Cell extends JPanel implements Mo
49、useListener</p><p><b> {</b></p><p> private int row; </p><p> private int column;</p><p> private char token = ' ';</p><p> pu
50、blic Cell(int row, int column){}:構造函數(shù)</p><p> public void paintComponent(Graphics g){}:</p><p> Graphics對象g是由Java運行系統(tǒng)自動創(chuàng)建,這個對象控制信息的繪制方式??梢允褂枚x在Graphics類中的多種畫法繪制字符串的幾何圖形。</p><p>
51、public void mouseClicked(MouseEvent e){}</p><p> public void mouseExited(MouseEvent e){}</p><p> public void mouseEntered(MouseEvent e){}</p><p> public void mouseReleased(MouseE
52、vent e){}</p><p> public void mousePressed(MouseEvent e){}</p><p> :接口MouseListener中的方法。</p><p><b> }</b></p><p><b> 4.4 程序的運行</b></p>
53、<p> 首先將編寫好的程序使用Java編譯器編譯,生成以class為擴展名的類文件,然后使用Java解釋器分別運行服務器和客戶端??蛻舳税l(fā)出連接,服務器接收后開啟線程對游戲進行控制,游戲結束時關閉線程。具體流程如圖3-4所示:</p><p><b> 圖3-4 運行流程</b></p><p> Fig.3-4 Flow Chart</p
54、><p><b> 5 小結</b></p><p> 隨著計算機和網(wǎng)絡技術的不斷發(fā)展,信息技術給人們帶來的幫助越來越大,單獨一臺計算機已經不能滿足人們的需求,網(wǎng)絡正在成為大多數(shù)人群生產、生活中密不可分的一部分。Java作為一種分布式和可移植的計算機語言,在網(wǎng)絡軟件開發(fā)上有著特別的優(yōu)點。它開發(fā)方便、快捷,安全性高,對以往復雜的功能,尤其是網(wǎng)絡通信等方面,實現(xiàn)起來簡潔明
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡五子棋游戲畢業(yè)設計
- 五子棋游戲畢業(yè)設計
- 畢業(yè)論文---網(wǎng)絡五子棋游戲設計
- 人機對弈五子棋游戲畢業(yè)設計
- 網(wǎng)絡五子棋五子棋設計與實現(xiàn).doc
- 五子棋游戲設計報告
- qt網(wǎng)絡五子棋五子棋設計與實現(xiàn)
- 五子棋游戲設計畢業(yè)論文
- 畢業(yè)論文——五子棋游戲設計
- linux環(huán)境下五子棋游戲設計畢業(yè)設計
- 畢業(yè)設計---基于labview設計的五子棋游戲
- 五子棋對戰(zhàn)游戲
- 畢業(yè)設計--五子棋人機對弈
- flash五子棋畢業(yè)設計論文
- java五子棋畢業(yè)設計論文
- java五子棋游戲畢業(yè)論文
- java五子棋畢業(yè)設計--java五子棋對弈程序的設計與實現(xiàn)
- java五子棋畢業(yè)設計(整套)
- 畢業(yè)設計(論文)linux環(huán)境下五子棋游戲設計
- 網(wǎng)絡五子棋2
評論
0/150
提交評論