軟件工程畢業(yè)論文-網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  本科畢業(yè)論文</b></p><p><b> ?。?0 屆)</b></p><p>  網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  摘要</b></p><p>  五子棋游戲以其優(yōu)秀的人工智能深受廣大玩家的喜愛(ài),而對(duì)于初步探

2、究網(wǎng)絡(luò)編成的編程愛(ài)好者來(lái)說(shuō),編制五子棋程序因其規(guī)則簡(jiǎn)單而大受歡迎,然而它卻要求程序員對(duì)五子棋規(guī)則有相當(dāng)深入的了解。程序員考慮得越周到,其五子棋程序就越智能。 五子棋游戲軟件設(shè)計(jì)的主要內(nèi)容是:根據(jù)五子棋的基本規(guī)則,要讓對(duì)方客戶(hù)端知道該在哪一點(diǎn)下子,就要根據(jù)盤(pán)面的形勢(shì),并把棋盤(pán)棋子的重新繪制繪制,也就是更新該點(diǎn)的位置,然后再通過(guò)監(jiān)聽(tīng)網(wǎng)絡(luò)傳遞的消息,直到新的位置放在棋盤(pán)的什么位置上,在進(jìn)行修改,并通過(guò)計(jì)算,得出玩家是否獲得勝利.,因此

3、玩家就能反復(fù)的進(jìn)行聯(lián)機(jī)游戲。</p><p>  本文論述了采用聯(lián)機(jī)對(duì)戰(zhàn)的方式體現(xiàn)出五子棋程序的分析與設(shè)計(jì),并采用面向?qū)ο蟮拈_(kāi)發(fā)工具C#來(lái)具體實(shí)現(xiàn)。</p><p>  關(guān)鍵字:Socket ;C/S;五子棋;網(wǎng)絡(luò)對(duì)弈;C#</p><p><b>  Abstract</b></p><p>  Gobang

4、 game with excellent artificial intelligence by the vast number of players who, for the initial research network organization programming enthusiasts, Gobang procedures for the preparation of the rules simple and popular

5、, but it requires programmer to Gobang game has a deep understanding of the rules. Other thoughtful consideration they treat their Gobang game procedures more wisdom.</p><p>  Gobang game software design is

6、the main content: According Gobang basic rules to know each other's customers - in violation of the West, we must under Permian situation, and the board pawn re-mapping mapping, that is updating the point position, a

7、nd then through the monitoring network news until the new location on the board what position, Following changes, and through the calculation, resulting in players is victory. , the on-line game players can repeatedly.&l

8、t;/p><p>  This article discusses the use of on-line way reflect those Gobang procedures analysis and design, object-oriented development tools and the adoption of specific C# to achieve.</p><p>  

9、Key Words : Socket; C/S; Gobang; play chess on network,C#</p><p><b>  目 錄</b></p><p><b>  1緒論5</b></p><p>  1.1選題背景和意義5</

10、p><p>  1.2國(guó)內(nèi)外研究現(xiàn)狀和發(fā)展趨勢(shì)5</p><p>  1.3 研究?jī)?nèi)容與目標(biāo)6</p><p>  2相關(guān)理論與技術(shù)7</p><p>  2.1五子棋簡(jiǎn)介7</p><p>  2.2相關(guān)技術(shù)簡(jiǎn)介7</p><p>  2.2.1 C/S體系結(jié)構(gòu)7</p>

11、<p>  2.2.2 SOCKET簡(jiǎn)介8</p><p>  2.2.3 面向?qū)ο蟮睦碚撝R(shí)10</p><p>  2.2.4 C#.NET 相關(guān)知識(shí)介紹10</p><p>  3系統(tǒng)的分析與設(shè)計(jì)11</p><p>  3.1需求分析11</p><p>  3.2 功能分析11<

12、/p><p>  3.3運(yùn)行環(huán)境12</p><p><b>  4系統(tǒng)的實(shí)現(xiàn)12</b></p><p>  4.1概要設(shè)計(jì)12</p><p><b>  4.2流程圖13</b></p><p>  4.3程序詳細(xì)設(shè)計(jì)14</p><p>

13、<b>  5總結(jié)31</b></p><p><b>  致謝31</b></p><p><b>  參考文獻(xiàn)32</b></p><p><b>  1緒論</b></p><p>  1.1選題背景和意義</p><p&g

14、t;  五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱(chēng)之為“連珠”,英譯為“Renju”,英文稱(chēng)之為“Gobang”或“FIR”(Five in a Row的縮寫(xiě)),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱(chēng)謂。   五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問(wèn)“陰陽(yáng)易理”;它

15、既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見(jiàn),又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。 五子棋起源于古代中國(guó),發(fā)展于日本,風(fēng)靡于歐洲。對(duì)于它與圍棋的關(guān)系有兩種說(shuō)法,一說(shuō)早于圍棋,早在“堯造圍棋”之前,民間就已有五子棋游戲;一說(shuō)源于圍棋,是圍棋發(fā)展的一個(gè)分支。在中國(guó)的文化里,倍受人們的青睞。古代的五子棋的棋具與圍棋相

16、同,縱橫各十七道。五子棋大約隨圍棋一起在我國(guó)南北朝時(shí)先后傳入朝鮮、日本等地。據(jù)日本史料文獻(xiàn)介紹,中國(guó)古代的五子棋是經(jīng)由高麗(朝鮮),于1688年至1</p><p>  1.2國(guó)內(nèi)外研究現(xiàn)狀和發(fā)展趨勢(shì)</p><p>  電腦游戲行業(yè)經(jīng)過(guò)二十年的發(fā)展,已經(jīng)成為與影視、音樂(lè)等并駕齊驅(qū)的全球最重要的娛樂(lè)產(chǎn)業(yè)之一,其年銷(xiāo)售額超過(guò)好萊塢的全年收入。互聯(lián)網(wǎng)的出現(xiàn)為電腦游戲行業(yè)發(fā)展注入了新的活力,憑借

17、信息雙向交流、速度快、不受空間限制等優(yōu)勢(shì),讓真人參與游戲,提高了游戲的互動(dòng)性、仿真性和競(jìng)技性,使玩家在虛擬世界里可以發(fā)揮現(xiàn)實(shí)世界無(wú)法展現(xiàn)的潛能,改變了單機(jī)版游戲固定、呆板、與機(jī)器對(duì)話(huà)的狀況。網(wǎng)絡(luò)游戲的這些優(yōu)勢(shì)不僅使其在電腦游戲行業(yè)中異軍突起并在某種程度上取代了單機(jī)版游戲,而且成為網(wǎng)絡(luò)業(yè)三大(網(wǎng)上金融、網(wǎng)上教育和網(wǎng)絡(luò)游戲)贏利且利潤(rùn)優(yōu)厚的領(lǐng)域之一。</p><p>  網(wǎng)絡(luò)作為一種新興的傳播方式,主要包括三大內(nèi)容:

18、娛樂(lè)、資訊、通訊。提到網(wǎng)絡(luò)娛樂(lè),過(guò)去主要指的是單機(jī)版游戲,沒(méi)有引入網(wǎng)絡(luò)的概念[2]但隨著科技的發(fā)展,游戲娛樂(lè)產(chǎn)業(yè)也在成長(zhǎng)[3]目前,國(guó)內(nèi)的游戲娛樂(lè)產(chǎn)業(yè)正處于起步階段,特點(diǎn)表現(xiàn)為:第一,它是一種文化的傳播。娛樂(lè)產(chǎn)業(yè)可以潛移默化地改變?nèi)说挠^念,當(dāng)前,很多多媒體的播放已被電腦網(wǎng)絡(luò)所取代[4]。第二,網(wǎng)絡(luò)游戲加強(qiáng)了人與人的溝通。第三,網(wǎng)絡(luò)游戲具有一定的教育意義[5]。網(wǎng)絡(luò)游戲所具有的角色扮演的功能,使得玩家能通過(guò)互助更好地完成游戲中的各項(xiàng)任務(wù)。

19、網(wǎng)絡(luò)無(wú)國(guó)界,游戲在網(wǎng)絡(luò)文化產(chǎn)業(yè)世界的發(fā)展中地位會(huì)越來(lái)越高。</p><p>  目前在國(guó)外,休閑游戲如棋類(lèi)等,玩家的年齡跨度非常大,這和我國(guó)目前網(wǎng)游市場(chǎng)以青少年為主要消費(fèi)人群的狀況截然不同[7]。其實(shí),網(wǎng)絡(luò)可以解決空間的問(wèn)題,網(wǎng)絡(luò)和生活越來(lái)越息息相關(guān),因此,開(kāi)辟適合各個(gè)年齡層的游戲產(chǎn)品迫在眉睫。同時(shí),這也涉及到一個(gè)企業(yè)開(kāi)發(fā)的能力。娛樂(lè)產(chǎn)業(yè)發(fā)展到一定程度,通過(guò)不斷鍛煉和經(jīng)驗(yàn)的積累,完全可以通過(guò)融入娛樂(lè)的成分把教條的

20、東西深入淺出地展現(xiàn)給消費(fèi)者 。</p><p>  就國(guó)內(nèi)的發(fā)展來(lái)看,最近這兩三年內(nèi)國(guó)內(nèi)的游戲公司如雨后春筍般的成立,所開(kāi)發(fā)或代理的網(wǎng)絡(luò)游戲更是不勝枚舉。以全球游戲業(yè)界的發(fā)展來(lái)看,這幾年韓國(guó)的表現(xiàn)最為突出,特別是在網(wǎng)絡(luò)游戲的技術(shù)研發(fā)興游戲制作,其所發(fā)行的網(wǎng)絡(luò)游戲更成為全球游戲產(chǎn)業(yè)重要的指標(biāo)之一。去年在美國(guó)洛杉磯所舉行的 E3(Electronic Entertainment Exposition)展中,已經(jīng)有幾家

21、的韓國(guó)廠商擠入世界第一線的游戲開(kāi)發(fā)廠商之列。</p><p>  近幾年來(lái),由于 3D 硬體繪圖技術(shù)的突破,使得即時(shí)描繪的書(shū)面越來(lái)越精致,而且3D遊戲性更多元化更逼近真實(shí)世界,因此在遊戲產(chǎn)業(yè)中,3D 游戲已經(jīng)逐漸取代2D游戲?yàn)橛螒蚴袌?chǎng)的主流,即使是網(wǎng)絡(luò)游戲,也慢慢趨向3D化。然而游戲3D化將會(huì)帶來(lái)的游戲開(kāi)發(fā)上的困難等問(wèn)題,這些問(wèn)題以后都需要逐步解決。 </p><p>  1.3 研究?jī)?nèi)容

22、與目標(biāo)</p><p><b>  實(shí)驗(yàn)要求如下:</b></p><p>  (1) 玩家能通過(guò)局域網(wǎng)進(jìn)行局域網(wǎng)對(duì)戰(zhàn)。</p><p>  (2) 實(shí)現(xiàn)游戲員的網(wǎng)絡(luò)對(duì)話(huà)。</p><p>  (3) 游戲規(guī)則:在棋盤(pán)上的行、列、對(duì)角線上連續(xù)放五個(gè)旗子的一方獲勝。</p><p>  本程序旨在用

23、C#語(yǔ)言實(shí)現(xiàn)一個(gè)基于.NET架構(gòu)的C/S模式的五子棋局域網(wǎng)對(duì)戰(zhàn)游戲,玩家作為客戶(hù)端通過(guò)服務(wù)器端與其它玩家進(jìn)行對(duì)戰(zhàn),聊天等功能。界面使用VS2008 WindowForm窗體實(shí)現(xiàn),界面美觀,操作簡(jiǎn)單,可行性強(qiáng)。</p><p><b>  2.相關(guān)理論與技術(shù)</b></p><p><b>  2.1五子棋簡(jiǎn)介</b></p><

24、;p><b>  (1)棋盤(pán),棋子:</b></p><p>  1、棋盤(pán)為十五路,正中一點(diǎn)為“天元”,周?chē)狞c(diǎn)為小星。</p><p>  2、棋子分黑白兩色,黑子113枚,白子112枚,共225枚。</p><p><b>  (2)比賽規(guī)則:</b></p><p>  1、黑先白后,從

25、棋盤(pán)任意位置開(kāi)始落子。然后執(zhí)白棋的一方在黑棋周?chē)慕徊纥c(diǎn)上落子。以此類(lèi)推,黑白交替落子。</p><p>  2、最先在橫向,豎向,斜向形成連續(xù)的相同色五個(gè)棋子的一方為勝。</p><p>  本文所論述的聯(lián)機(jī)五子棋系統(tǒng)就是依照這種方式進(jìn)行的。</p><p><b>  2.2相關(guān)技術(shù)簡(jiǎn)介</b></p><p>  

26、2.2.1 C/S體系結(jié)構(gòu)</p><p>  C/S 結(jié)構(gòu),即大家熟知的客戶(hù)機(jī)和服務(wù)器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過(guò)它可以充分利用兩端硬件環(huán)境的優(yōu)勢(shì),將任務(wù)合理分配到Client端和Server端來(lái)實(shí)現(xiàn),降低了系統(tǒng)的通訊開(kāi)銷(xiāo)。</p><p> ?。–lient/Server或客戶(hù)/服務(wù)器模式):Client和Server常常分別處在相距很遠(yuǎn)的兩臺(tái)計(jì)算機(jī)上,Client程序的任務(wù)是將用

27、戶(hù)的要求提交給Server程序,再將Server程序返回的結(jié)果以特定的形式顯示給用戶(hù);Server程序的任務(wù)是接收客戶(hù)程序提出的服務(wù)請(qǐng)求,進(jìn)行相應(yīng)的處理,再將結(jié)果返回給客戶(hù)程序。</p><p>  C/S 結(jié)構(gòu)的基本原則是將計(jì)算機(jī)應(yīng)用任務(wù)分解成多個(gè)子任務(wù),由多臺(tái)計(jì)算機(jī)分工完成,即采用“功能分布”原則。客戶(hù)端完成數(shù)據(jù)處理,數(shù)據(jù)表示以及用戶(hù)接口功能;服務(wù)器端完成DBMS的核心功能。這種客戶(hù)請(qǐng)求服務(wù)、服務(wù)器提供服務(wù)的

28、處理方式是一種新型的計(jì)算機(jī)應(yīng)用模式。</p><p>  C/S結(jié)構(gòu)的優(yōu)點(diǎn)是能充分發(fā)揮客戶(hù)端PC的處理能力,很多工作可以在客戶(hù)端處理后再提交給服務(wù)器。對(duì)應(yīng)的優(yōu)點(diǎn)就是客戶(hù)端響應(yīng)速度快。</p><p>  C/S編程模式概括如下:</p><p><b>  服務(wù)器端:</b></p><p>  打開(kāi)通信道路,告訴本地機(jī)

29、器,愿意在該通道上接受客戶(hù)請(qǐng)求——監(jiān)聽(tīng),等待客戶(hù)請(qǐng)求——接受請(qǐng)求,創(chuàng)建專(zhuān)用鏈接進(jìn)行讀寫(xiě)——處理完畢,關(guān)閉專(zhuān)用鏈接——關(guān)閉通信通道(當(dāng)然其中監(jiān)聽(tīng)到關(guān)閉專(zhuān)用鏈接可以重復(fù)循環(huán))。</p><p><b>  客戶(hù)端:</b></p><p>  打開(kāi)通訊道路,鏈接服務(wù)器——數(shù)據(jù)交互“-關(guān)閉信道。</p><p>  2.2.2 SOCKET簡(jiǎn)介<

30、;/p><p>  Socket 代表了一種文件描述符;這個(gè)描述符則是用于網(wǎng)絡(luò)訪問(wèn)的。其實(shí),Socket可以象流Stream一樣被視為一個(gè)數(shù)據(jù)通道,這個(gè)通道架設(shè)在應(yīng)用程序端(客戶(hù)端)和遠(yuǎn)程服務(wù)器端之間,而后,數(shù)據(jù)的讀?。ń邮埽┖蛯?xiě)入(發(fā)送)均針對(duì)這個(gè)通道來(lái)進(jìn)行。在應(yīng)用程序端或者服務(wù)器端創(chuàng)建了Socket對(duì)象之后,就可以使用Send/SendTo方法將數(shù)據(jù)發(fā)送到連接的Socket,或者使用Receive/Receive

31、 From方法接受來(lái)自連接Socket的數(shù)據(jù)。</p><p>  Socket通訊方式:</p><p>  同步:客戶(hù)端在發(fā)送請(qǐng)求之后必須等到服務(wù)器回應(yīng)之后才可以發(fā)送系一條請(qǐng)求。串行運(yùn)行。</p><p>  異步:客戶(hù)端請(qǐng)求之后,不必等到服務(wù)器回應(yīng)之后就可以發(fā)送下一條請(qǐng)求。并行運(yùn)行。</p><p>  用Socket訪問(wèn)網(wǎng)絡(luò)的基本步驟

32、:</p><p><b>  a.建立一個(gè)套接字</b></p><p>  b.綁定本機(jī)的IP和端口</p><p>  c.如果是TCP,因?yàn)槭敲嫦蜻B接的,所以要利用ListenO()方法來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)上是否有人給自己發(fā)東西;如果是UDP,因?yàn)槭菬o(wú)連接的,所以來(lái)這不拒。</p><p>  d.TCP情況下,如果監(jiān)聽(tīng)到

33、一個(gè)連接,就可以使用accept來(lái)接受這個(gè)連接,然后就可以利用Send/Receive 來(lái)執(zhí)行操作了。而UDP,則不需要accept,直接用SendTo/ReceiveFrom來(lái)執(zhí)行操作。</p><p>  e.如果你不想繼續(xù)發(fā)送和接受了,就可以使用close來(lái)關(guān)閉連接</p><p>  在TCP/IP 網(wǎng)絡(luò)中,IP網(wǎng)絡(luò)交互分類(lèi)兩大類(lèi):面向連接的交互和面向唔連接的交互。Socket面向

34、兩種連接的通訊圖如下:</p><p><b>  服務(wù)器方</b></p><p>  ........ 建立連接</p><p><b>  服務(wù)請(qǐng)求</b></p><p><b>  /應(yīng)答</b></p><p>  面向連接的套接字系統(tǒng)調(diào)

35、用時(shí)序</p><p>  服務(wù)器/客戶(hù)方 服務(wù)器/客戶(hù)方</p><p><b>  數(shù)據(jù)報(bào)文</b></p><p>  無(wú)連接的套接字系統(tǒng)調(diào)用時(shí)序</p><p>  2.2.3 面向?qū)ο蟮睦碚撝R(shí)</p><p>  面向?qū)ο?/p>

36、方法是一種運(yùn)用對(duì)象,類(lèi),封裝,繼承,多態(tài)和消息等概念來(lái)構(gòu)造,測(cè)試,重構(gòu)軟件的方法。</p><p>  面向?qū)ο蠓椒ㄊ且环N以知識(shí)為基礎(chǔ),用對(duì)象來(lái)理解和分析問(wèn)題空間,并設(shè)計(jì)和開(kāi)發(fā)出由對(duì)象構(gòu)成的軟件系統(tǒng)(解空間)的方法。由于問(wèn)題空間和解空間都是由對(duì)象組成的,這樣可以消除由于問(wèn)題空間和加空間結(jié)構(gòu)上的不一致帶來(lái)的問(wèn)題。簡(jiǎn)言之,面向?qū)ο缶褪敲嫦蚴挛锉旧?,面向?qū)ο蟮姆治龉懦蔷褪钦J(rèn)識(shí)客觀世界的過(guò)程。面向?qū)ο蠓椒◤膹膶?duì)象出發(fā),發(fā)

37、展出對(duì)象,類(lèi),消息,繼承等概念。</p><p>  面向?qū)ο蟮闹饕獌?yōu)點(diǎn)是:符合人們通常的思維方式;從分析到設(shè)計(jì)再到編碼采用一致的模型表示具有高度連續(xù)性;軟件重用性好。</p><p>  2.2.4 C#.NET 相關(guān)知識(shí)介紹</p><p>  C#是微軟公司發(fā)布的一種面向?qū)ο蟮?、運(yùn)行于.NET Framework之上的高級(jí)程序設(shè)計(jì)語(yǔ)言。C#是一種安全的、穩(wěn)定的

38、、簡(jiǎn)單的、優(yōu)雅的,由C和C++衍生出來(lái)的面向?qū)ο蟮木幊陶Z(yǔ)言。它在繼承C和C++強(qiáng)大功能的同時(shí)去掉了一些它們的復(fù)雜特性(例如沒(méi)有宏以及不允許多重繼承)。C#綜合了VB簡(jiǎn)單的可視化操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、優(yōu)雅的語(yǔ)法風(fēng)格、創(chuàng)新的語(yǔ)言特性和便捷的面向組件編程的支持成為.NET開(kāi)發(fā)的首選語(yǔ)言。</p><p>  本次設(shè)計(jì)是用C#.NET完成的,采用的是windows窗體應(yīng)用程序來(lái)實(shí)現(xiàn)圖形界面功能的,

39、本設(shè)計(jì)主要用到的,一些控件有:ImageList,MenuStrip,button,textbox,label,等一些簡(jiǎn)單的控件。用到的主要技術(shù)就是Socket通訊,以及多線程編程。下面簡(jiǎn)單的介紹一下這些知識(shí)。</p><p>  ImageList 控件包含ListImage對(duì)象的集合,該集合中的每個(gè)對(duì)象都可以通過(guò)其索引或關(guān)鍵字被引用。ImageList控件不能獨(dú)立使用,只是作為一個(gè)便于向其它控件提供圖象的資料

40、中心。ImageList控件的作用象圖像的儲(chǔ)藏室,同時(shí),它需要第二個(gè)控件顯示所儲(chǔ)存的圖像。第二個(gè)控件可以是任何能顯示圖像 Picture 對(duì)象的控件,也可以是特別設(shè)計(jì)的、用于綁定 ImageList 控件的 Windows 通用控件之一。本程序中在Label,PictureBox中調(diào)用了ImageList中的圖像。</p><p>  MenuStrip 控件是 Visual Studio

41、 和 .NET Framework 中的功能。使用該控件,可以輕松創(chuàng)建 Microsoft Office 中那樣的菜單。MenuStrip 控件支持多文檔界面 (MDI)和菜單合并、工具提示和溢出。您可以通過(guò)添加訪問(wèn)鍵、快捷鍵、選中標(biāo)記、圖像和分隔條,來(lái)增強(qiáng)菜單的可用性和可讀性。MenuStrip 控件取代了 MainMenu 控件并向其中添加了功能;但是也可選擇保留 MainMenu 控件以備向后兼容和將來(lái)使用。</p>

42、<p>  3.系統(tǒng)的分析與設(shè)計(jì)</p><p><b>  3.1需求分析</b></p><p> ?。?)滿(mǎn)足游戲雙方記錄的游戲動(dòng)作的基本要求。</p><p> ?。?)滿(mǎn)足對(duì)戰(zhàn)雙方及時(shí)通訊的基本要求。</p><p> ?。?)滿(mǎn)足游戲雙方及時(shí)顯示游戲狀態(tài)的基本要求。</p><

43、p> ?。?)在服務(wù)器端分析雙方是否勝利。</p><p><b>  3.2 功能分析</b></p><p>  基于系統(tǒng)需求分析,該系統(tǒng)需要實(shí)現(xiàn)以下基本功能:</p><p>  (1)棋盤(pán)繪制:在游戲加載時(shí),即時(shí)顯示棋盤(pán)</p><p> ?。?)對(duì)連接到客戶(hù)端數(shù)據(jù)的基本要求:能夠?qū)⒁l(fā)送的聊天記錄發(fā)送至對(duì)

44、方手上,能夠完成即時(shí)通訊。</p><p> ?。?)實(shí)時(shí)顯示:當(dāng)從游戲一方將數(shù)據(jù)傳入另一方系統(tǒng)中,將五子棋的表格進(jìn)行重新的刷新,和更改。</p><p>  (4)通過(guò)控制鼠標(biāo)點(diǎn)擊五子棋表格:觸發(fā)事件,把該動(dòng)作發(fā)送到游戲另一方,并判斷是否勝利。</p><p><b>  3.3運(yùn)行環(huán)境</b></p><p>  系

45、統(tǒng)運(yùn)行環(huán)境:WindowsXP及以后版本</p><p>  開(kāi)發(fā)環(huán)境:VS2008</p><p><b>  4.系統(tǒng)的實(shí)現(xiàn)</b></p><p><b>  4.1概要設(shè)計(jì)</b></p><p>  本次畢業(yè)設(shè)計(jì)的內(nèi)容主要是利用Socket實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋,首先先要繪制出棋盤(pán),然后實(shí)

46、現(xiàn)Socket通訊(連接,聊天等功能),然后實(shí)現(xiàn)下棋功能,下棋這部分功能的實(shí)現(xiàn)根據(jù)Socket通訊傳遞的信息流控制雙方該誰(shuí)下棋;再通過(guò)傳遞過(guò)來(lái)的消息觸發(fā)事件從而實(shí)現(xiàn)對(duì)戰(zhàn)雙方的同步顯示;每走一步棋子,都要利用一個(gè)算法來(lái)判斷一下有沒(méi)有出現(xiàn)五個(gè)相同棋子連到一起的情況,及是否有人贏棋,這個(gè)算法要分兩種情況,一種是黑棋,另一種是白棋,如果剛落下的棋子是黑棋,那么就要在整個(gè)棋盤(pán)上通過(guò)上下,左右,以及斜上,斜下,這幾個(gè)方向來(lái)尋找看看有沒(méi)有五子連在一起

47、的情況,如果有的話(huà),那么黑棋勝,游戲結(jié)束;如果剛落下的是白棋的話(huà),用同樣的方法判斷。</p><p>  對(duì)戰(zhàn)方1 對(duì)戰(zhàn)方2</p><p><b>  4.2流程圖</b></p><p>  下面用我們用數(shù)據(jù)流圖(DFD, Data Flow Diagram),也就是從數(shù)

48、據(jù)傳遞和加工的角度,以圖形的方式刻畫(huà)數(shù)據(jù)流從輸入到輸出的移動(dòng)變換過(guò)程。如下圖所示:</p><p><b>  等待連接</b></p><p><b>  連接至對(duì)方的服務(wù)端</b></p><p><b>  可以進(jìn)行及時(shí)通訊</b></p><p><b>  

49、等待輪到自己下棋</b></p><p>  將信息傳遞到對(duì)方的棋盤(pán)上</p><p><b>  更新勝負(fù)記錄</b></p><p><b>  4.3程序詳細(xì)設(shè)計(jì)</b></p><p>  4.3.1 期盼的繪制代碼和圖解</p><p>  using

50、System;</p><p>  using System.Collections.Generic;</p><p>  namespace WindowsApplication1</p><p><b>  {</b></p><p>  public partial class Form1 : Form</p

51、><p><b>  {</b></p><p>  public Form1()</p><p><b>  {</b></p><p>  InitializeComponent();</p><p><b>  }</b></p><

52、;p>  public int BBow=0;</p><p>  int[] a=new int[225];</p><p>  int BCount = 0;</p><p>  int BwinCount = 0;</p><p>  int WwinCount = 0;</p><p>  int k,g

53、,x = 15;</p><p>  bool Out=false;</p><p>  public bool CanAgin,CanAgins,CanDown,WhoFisrtDown;</p><p>  private Socket listener;</p><p>  private Thread mainThread;</

54、p><p>  public void Form1_Load(object sender, EventArgs e)</p><p><b>  {</b></p><p>  for (int i = 0; i <15; i++)//棋盤(pán)</p><p><b>  {</b></p>

55、;<p>  for (int j = 0; j <15; j++)</p><p><b>  {</b></p><p>  PictureBox pictureBox1 = new PictureBox();</p><p>  pictureBox1.Location = new System.Drawing.Poi

56、nt(i * 29+30, j*29+30);</p><p>  pictureBox1.Name = "pictureBox"+(i+j*15).ToString();</p><p>  pictureBox1.Size = new System.Drawing.Size(30,30);</p><p>  pictureBox1.TabI

57、ndex = 0;</p><p>  pictureBox1.Image = imageList1.Images[2];</p><p>  pictureBox1.TabStop = false;</p><p>  a[i + j * 15] = 3;</p><p>  pictureBox1.Click+=new EventHand

58、ler(asd);</p><p>  this.Controls.Add(pictureBox1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  button3.Enabled = false;</p><p>  b

59、utton6.Visible = false;</p><p>  button1.Enabled = false;</p><p>  label7.Visible = true;</p><p>  label8.Visible = false;</p><p>  CanDown = false;</p><p>

60、;<b>  }</b></p><p>  4.3.2 連接服務(wù)器模塊</p><p>  namespace WindowsApplication1</p><p><b>  {</b></p><p>  public class Client</p><p><

61、;b>  {</b></p><p><b>  //1、連接服務(wù)器</b></p><p><b>  //2、發(fā)送消息</b></p><p><b>  //3、接收數(shù)據(jù)包</b></p><p>  private Socket _client; //

62、跟服務(wù)器連接的socket</p><p>  private bool _connected; //socket連接狀態(tài),表示斷開(kāi)或已經(jīng)連接兩種情況</p><p><b>  //連接服務(wù)器</b></p><p>  public void ConnectServer(string ip, int port)

63、 //指定地址和端口</p><p><b>  {</b></p><p>  _client = new Socket( //Socket類(lèi)構(gòu)造函數(shù)</p><p>  AddressFamily.InterNetwork, //Socket使用的尋址方案 IP版本為</p><p>  SocketType

64、.Stream, //連接是基于流套接字的</p><p>  ProtocolType.Tcp);   //連接協(xié)議是使用TCP協(xié)議</p><p>  IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ip),port); //初始化制定的地址和端口</p><p>  _client.Connect(

65、ep); </p><p>  _connected = true; //返回值true</p><p><b>  }</b></p><p><b>  //返回連接狀態(tài)</b></p><p>  publ

66、ic bool Connected</p><p><b>  {</b></p><p>  get { return _connected; }</p><p><b>  }</b></p><p><b>  //關(guān)閉連接</b></p><p>

67、;  public void CloseConnection()</p><p><b>  {</b></p><p>  if (_connected)</p><p><b>  {</b></p><p>  _client.Close();</p><p>  _c

68、onnected = false;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //發(fā)送消息</b></p><p>  public void SendMessage(string message)</p&

69、gt;<p><b>  {</b></p><p>  byte[] buffer = Encoding.Default.GetBytes(message + "\r\n\r\n");</p><p>  _client.Send(buffer);</p><p><b>  }</b>

70、</p><p><b>  }</b></p><p>  4.3.3判斷先行,先行者添加棋子(程序代碼和圖)</p><p>  public void First()</p><p><b>  {</b></p><p>  if (WhoFisrtDown == t

71、rue)</p><p><b>  {</b></p><p>  MessageBox.Show("先行");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>

72、;  {</b></p><p>  MessageBox.Show("后行");</p><p><b>  }</b></p><p><b>  }</b></p><p>  public void FiDnMessage(object sender, FiD

73、nMessageEventArgs e)//誰(shuí)先下棋的判斷</p><p><b>  {</b></p><p>  if (this.InvokeRequired)</p><p><b>  {</b></p><p>  this.Invoke(</p><p>  

74、new EventHandler<FiDnMessageEventArgs>(this.FiDnMessage),</p><p>  new object[] { sender, e });</p><p><b>  }</b></p><p><b>  else</b></p><p

75、><b>  {</b></p><p>  WhoFisrtDown = true;</p><p><b>  }</b></p><p><b>  First();</b></p><p><b>  }</b></p><

76、;p>  4.3.4 添加后行者下棋模塊(程序代碼和圖)</p><p>  public void AddChess(object sender, AddChessEventArgs e)</p><p><b>  {</b></p><p>  if (this.InvokeRequired)</p><p>

77、;<b>  {</b></p><p>  this.Invoke(</p><p>  new EventHandler<AddChessEventArgs>(this.AddChess),</p><p>  new object[] { sender, e });</p><p><b> 

78、 }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  string name = "pictureBox" + e.Number;</p><p>  int num = Int32.Parse(e.I

79、m);</p><p>  BBow = Int32.Parse(e.Bow);</p><p>  PictureBox bb = (PictureBox)this.Controls[name];</p><p>  bb.Image = imageList1.Images[num];</p><p>  if (num == 0)<

80、/p><p><b>  {</b></p><p>  label7.Visible = false;</p><p>  label8.Visible = true;</p><p><b>  }</b></p><p>  else if(num==1)</p>

81、;<p><b>  {</b></p><p>  label7.Visible = true;</p><p>  label8.Visible = false;</p><p><b>  }</b></p><p>  bb.Enabled = false;</p>

82、<p>  int s = Int32.Parse(e.Number);</p><p>  a[s] = Int32.Parse(e.Im);</p><p>  ChessJudge();</p><p><b>  }</b></p><p>  WhoFisrtDown = true;</p&

83、gt;<p><b>  }</b></p><p>  4.3.5 判斷黑白棋輸贏的模塊(程序代碼和圖)</p><p><b>  //判斷黑棋是否贏</b></p><p>  public void Bwin()</p><p><b>  {</b>&l

84、t;/p><p>  for (g = 0; g < 225; g++)</p><p><b>  {</b></p><p>  string name = "pictureBox" + g.ToString();</p><p>  PictureBox aa = (PictureBox)th

85、is.Controls.Find(name, false)[0];</p><p>  aa.Enabled = false;</p><p><b>  }</b></p><p>  MessageBox.Show("黑子贏了!!請(qǐng)按重新開(kāi)始!");</p><p>  BwinCount++;&

86、lt;/p><p>  label1.Text = "黑勝:" + BwinCount;</p><p>  button3.Visible = false;</p><p>  button6.Visible = true;</p><p>  button6.Enabled = true;</p><p

87、>  CanAgins = false;</p><p>  CanAgin = false;</p><p><b>  }</b></p><p><b>  //判斷白棋是否贏</b></p><p>  public void Wwin()</p><p>&l

88、t;b>  {</b></p><p>  for (g = 0; g < 225; g++)</p><p><b>  {</b></p><p>  string name = "pictureBox" + g.ToString();</p><p>  PictureB

89、ox aa = (PictureBox)this.Controls.Find(name, false)[0];</p><p>  aa.Enabled = false;</p><p><b>  }</b></p><p>  MessageBox.Show("白子贏了!!請(qǐng)按重新開(kāi)始!");</p>&l

90、t;p>  WwinCount++;</p><p>  label2.Text = "白勝:" + WwinCount;</p><p>  button3.Visible = false;</p><p>  button6.Visible = true;</p><p>  button6.Enabled =

91、true;</p><p>  CanAgins = false;</p><p>  CanAgin = false;</p><p><b>  }</b></p><p>  public void ChessJudge()//算法</p><p><b>  {</b>

92、;</p><p>  for (k = 0; k < 225; k++)</p><p><b>  {</b></p><p>  if (a[k] == 0)</p><p><b>  {</b></p><p><b>  BCount++;<

93、/b></p><p>  for (int p = 1; p < 5; p++)//從左往右判斷橫著的黑子是否有5個(gè)相同的棋子想連</p><p><b>  {</b></p><p>  if (k + p < ((k / 15) + 1) * x)</p><p><b>  {<

94、;/b></p><p>  if (a[k + p] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p><b>  }</b></p><p>  else if (a[k

95、 + p] == 1)</p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b><

96、;/p><p>  if (BCount == 5)</p><p><b>  {</b></p><p><b>  Bwin();</b></p><p><b>  return;</b></p><p><b>  }</b>

97、</p><p><b>  else</b></p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p>

98、<p><b>  }</b></p><p>  for (k = 0; k < 225; k++)//從右往左判斷橫著的黑子是否有5個(gè)相同的棋子想連</p><p><b>  {</b></p><p>  if (a[k] == 0)</p><p><b>  

99、{</b></p><p><b>  BCount++;</b></p><p>  for (int p = 1; p < 5; p++)</p><p><b>  {</b></p><p>  if (k - p > (k / 15) * x)</p>

100、<p><b>  {</b></p><p>  if (a[k - p] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p><b>  }</b></p>

101、<p>  else if (a[k - p] == 1)</p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p>

102、<b>  }</b></p><p>  if (BCount == 5)</p><p><b>  {</b></p><p><b>  Bwin();</b></p><p><b>  return;</b></p><p&

103、gt;<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>

104、;  }</b></p><p><b>  }</b></p><p>  for (k = 0; k < 225; k++)//判斷"豎"著的黑子是否有5個(gè)相同的棋子想連</p><p><b>  {</b></p><p>  if (a[k] == 0

105、)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p>  for (int p = 1; p < 5; p++)</p><p><b>  {</b></p><p>  if (k

106、+ p * 15 < 225)</p><p><b>  {</b></p><p>  if (a[k + p * 15] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p&g

107、t;<b>  }</b></p><p>  else if (a[k + p * 15] == 1)</p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><

108、b>  }</b></p><p><b>  }</b></p><p>  if (BCount == 5)</p><p><b>  {</b></p><p><b>  Bwin();</b></p><p><b&g

109、t;  return;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }

110、</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for (k = 0; k < 225; k++)//判斷右"斜"上方的黑子是否有5個(gè)相同的棋子想連</p><p><b>  {</

111、b></p><p>  if (a[k] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p>  for (int p = 1; p < 5; p++)</p><p><b> 

112、 {</b></p><p>  if (k - p * 14 > 0)</p><p><b>  {</b></p><p>  if (a[k - p * 14] == 0)</p><p><b>  {</b></p><p><b> 

113、 BCount++;</b></p><p><b>  }</b></p><p>  else if (a[k - p * 14] == 1)</p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>

114、;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (BCount == 5)</p><p><b>  {</b></p><p><b>  Bwin()

115、;</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  BCoun

116、t = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for (k = 0; k < 225; k++)//判斷左"斜"下方的黑子是否有5個(gè)相同的棋子想

117、連</p><p><b>  {</b></p><p>  if (a[k] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p>  for (int p = 1; p <

118、 5; p++)</p><p><b>  {</b></p><p>  if (k + p * 14 < 225)</p><p><b>  {</b></p><p>  if (a[k + p * 14] == 0)</p><p><b>  {

119、</b></p><p><b>  BCount++;</b></p><p><b>  }</b></p><p>  else if (a[k + p * 14] == 1)</p><p><b>  {</b></p><p> 

120、 BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (BCount == 5)</p><p><b>  {</b&

121、gt;</p><p><b>  Bwin();</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>

122、  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for (k = 0; k < 22

123、5; k++)//判斷左"斜"上方的黑子是否有5個(gè)相同的棋子想連</p><p><b>  {</b></p><p>  if (a[k] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b><

124、/p><p>  for (int p = 1; p < 5; p++)</p><p><b>  {</b></p><p>  if (k - p * 16 > 0)</p><p><b>  {</b></p><p>  if (a[k - p * 16]

125、 == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p><b>  }</b></p><p>  else if (a[k - p * 16] == 1)</p><p><b

126、>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (BCount == 5)&

127、lt;/p><p><b>  {</b></p><p><b>  Bwin();</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else&

128、lt;/b></p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></

129、p><p>  for (k = 0; k < 225; k++)//判斷右"斜"下方的黑子是否有5個(gè)相同的棋子想連</p><p><b>  {</b></p><p>  if (a[k] == 0)</p><p><b>  {</b></p><

130、p><b>  BCount++;</b></p><p>  for (int p = 1; p < 5; p++)</p><p><b>  {</b></p><p>  if (k + p * 16 < 225)</p><p><b>  {</b>

131、;</p><p>  if (a[k + p * 16] == 0)</p><p><b>  {</b></p><p><b>  BCount++;</b></p><p><b>  }</b></p><p>  else if (a[k

132、+ p * 16] == 1)</p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

133、;</p><p>  if (BCount == 5)</p><p><b>  {</b></p><p><b>  Bwin();</b></p><p><b>  return;</b></p><p><b>  }</b

134、></p><p><b>  else</b></p><p><b>  {</b></p><p>  BCount = 0;</p><p><b>  }</b></p><p><b>  }</b></p&

135、gt;<p><b>  }</b></p><p><b>  5.總結(jié)</b></p><p>  在設(shè)計(jì)過(guò)程中,出現(xiàn)過(guò)不同的問(wèn)題,開(kāi)始的時(shí)候解決起來(lái)有一些困難,經(jīng)過(guò)兩個(gè)月的不斷學(xué)習(xí)和實(shí)踐,基本上都已經(jīng)解決,而且通過(guò)解決問(wèn)題的過(guò)程,自己的知識(shí)在一天天增長(zhǎng),對(duì)無(wú)網(wǎng)絡(luò)編程了解的越來(lái)越多,基本掌握了Socket通信機(jī)制。通過(guò)這個(gè)網(wǎng)絡(luò)游

136、戲的開(kāi)發(fā)過(guò)程,我深深的體會(huì)到一個(gè)軟件的完成需要注意的東西很多,并不像想象中的那么簡(jiǎn)單,我們要有充分的知識(shí)儲(chǔ)備才可以完成一款完美軟件,即便是再小的程序、游戲,都需要很多的知識(shí),一切都離不開(kāi)基礎(chǔ)。</p><p>  這次對(duì)局域網(wǎng)五子棋對(duì)戰(zhàn)游戲的開(kāi)發(fā)讓我用到了之前學(xué)過(guò)的大部分知識(shí),如C#可視化程序、操作系統(tǒng)、還有計(jì)算機(jī)網(wǎng)絡(luò)等知識(shí)。更進(jìn)一步加深了我對(duì)這些知識(shí)的了解,以及在實(shí)踐中熟練運(yùn)用。</p><

137、p><b>  致謝</b></p><p>  最后,我要感謝在這段時(shí)間內(nèi)對(duì)我的工作進(jìn)行指導(dǎo)的王超老師,王老師不辭辛苦地指導(dǎo),使我得以順利完成畢業(yè)設(shè)計(jì);使我對(duì)網(wǎng)絡(luò)游戲和計(jì)算機(jī)網(wǎng)絡(luò)編程的認(rèn)識(shí)更加深刻。在程序的設(shè)計(jì)過(guò)程中遇到困難的時(shí)候,王老師及時(shí)的給了我建議與支持,使得我能夠不斷地克服困難,并在規(guī)定的時(shí)間內(nèi)完成各項(xiàng)任務(wù)。</p><p>  本論文也是在王老師的悉

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論