




免費(fèi)預(yù)覽已結(jié)束,剩余29頁(yè)可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
20102010 屆本科畢業(yè)設(shè)計(jì)屆本科畢業(yè)設(shè)計(jì) 設(shè)計(jì)題目 設(shè)計(jì)題目 網(wǎng)絡(luò)五子棋設(shè)計(jì)網(wǎng)絡(luò)五子棋設(shè)計(jì) 學(xué)生姓名 學(xué)生姓名 導(dǎo)師姓名 導(dǎo)師姓名 所在院系 所在院系 信息工程學(xué)院信息工程學(xué)院 所學(xué)專業(yè) 所學(xué)專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)計(jì)算機(jī)科學(xué)與技術(shù) 完成時(shí)間 完成時(shí)間 2010 05 252010 05 25 摘摘 要要 目前 隨著計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展 以計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)為核心的現(xiàn)代網(wǎng) 絡(luò)技術(shù)已經(jīng)在現(xiàn)實(shí)生活和生產(chǎn)中得到了廣泛的使用 休閑類網(wǎng)絡(luò)游戲集趣味性 娛樂性 互動(dòng)性和益智性于一體 已經(jīng)成為多數(shù)人群的休閑方式 也為多數(shù)人 所喜好 本軟件使用 JAVA 語(yǔ)言實(shí)現(xiàn) 通過對(duì)圖形界面 繪圖 布局管理器等去構(gòu)造 出五子棋游戲的單機(jī)功能 在此基礎(chǔ)上 利用 SOCKET 編程 建立起服務(wù)器與客 戶端之間的連接 利用多線程技術(shù)來處理服務(wù)器端與客戶端之間的數(shù)據(jù)傳輸 網(wǎng)絡(luò)通信 使得客戶端和服務(wù)器端之間能夠同步的進(jìn)行處理 在網(wǎng)絡(luò)對(duì)戰(zhàn)中實(shí) 現(xiàn)了以下功能 建立游戲 邀請(qǐng)游戲 加入游戲 退出游戲 悔棋 另外 本軟 件還實(shí)現(xiàn)了網(wǎng)絡(luò)聊天的功能 玩家加入游戲后可以和其他玩家進(jìn)行對(duì)話 在加 載圖片以及繪制棋盤方面 采用雙緩沖技術(shù)消除屏幕的閃爍現(xiàn)象 在人機(jī)對(duì)弈中通過遍歷搜索和估值模塊 來提高電腦棋手的智能 算法的 研究有助于理解程序結(jié)構(gòu) 增強(qiáng)邏輯思維能力 在其他人工智能方面也有很大 的參考作用 關(guān)鍵詞 關(guān)鍵詞 多線程 SOCKET 遍歷搜索 人工智能 JAVA Network Game Gobang Abstract At present With the development of computer network taking computer technology and the network technology as the core modern network technology is already used in the real life and the production The leisure network game sets interest entertainment interaction and intelligence development in a body and already became the leisure mode of the most people The software uses the JAVA language through a graphical interface graphics layout managers etc to construct a single function of the game on this basis using SOCKET build server and client connection between the use of multiple threads technology to handle data transfer and network communication between server side and client side making processing between client and server side can be synchronized The network battle has following function create game invite game join the game quit game regret the chess On the other hand the software also has the function of net chatting once a player joined the game he can chatting with others In the loading picture and the drawing board use the double buffering technology to eliminate screen flicker During the man machine players it improves intelligence of the computer players through Traverse the search and valuation module Algorithm of procedures contribute to the understanding of the structure logical thinking ability In other areas of artificial intelligence has great references KeyKey Words Words multiple thread SOCKET traverse the search artificial intelligence 目錄目錄 1 緒論 1 1 1 課題背景 1 1 2 選題的背景和意義 1 1 3 主要研究?jī)?nèi)容 1 1 4 五子棋簡(jiǎn)介 2 2 開發(fā)環(huán)境及工具介紹 3 2 1 開發(fā)環(huán)境及運(yùn)行環(huán)境 3 2 1 1 開發(fā)環(huán)境 3 2 1 2 運(yùn)行環(huán)境 3 2 2 JAVA 簡(jiǎn)介 3 2 2 1 Java 的起源與發(fā)展 3 2 2 2 Java 的特點(diǎn) 3 2 3 JAVA SOCKET 網(wǎng)絡(luò)編程 5 2 3 1 Java Socket 網(wǎng)絡(luò)編程基礎(chǔ) 5 2 3 2 Socket 編程的實(shí)現(xiàn) 6 2 4 JAVA圖形編程 6 3 需求分析和總體設(shè)計(jì) 7 3 1 系統(tǒng)設(shè)計(jì)思想 7 3 2 系統(tǒng)總體設(shè)計(jì) 8 3 3 系統(tǒng)功能模塊及流程 8 3 3 1 系統(tǒng)主要功能模塊 8 3 3 2 系統(tǒng)主流程 9 3 4 玩家視圖與操作 10 3 4 1 服務(wù)器端 10 3 4 2 客戶端 10 4 概要設(shè)計(jì) 12 4 1 游戲各主要類的功能與主要對(duì)象 12 4 1 1 服務(wù)器類 12 4 1 2 游戲客戶端 13 4 1 3 網(wǎng)絡(luò)客戶端類 14 4 1 4 棋盤類 15 5 詳細(xì)設(shè)計(jì) 16 5 1 服務(wù)器端設(shè)計(jì) 16 5 2 游戲客戶端設(shè)計(jì) 17 5 3 網(wǎng)絡(luò)客戶端設(shè)計(jì) 18 5 4 棋盤類設(shè)計(jì) 19 5 4 1 棋盤類的主要方法 19 5 4 2 電腦落子算法的實(shí)現(xiàn) 20 5 5 系統(tǒng)各模塊之間的關(guān)系 23 6 軟件實(shí)現(xiàn)與測(cè)試 24 6 1 軟件測(cè)試方案 24 6 2 網(wǎng)絡(luò)客戶端測(cè)試用例 25 7 總結(jié) 27 致謝 28 參考文獻(xiàn) 29 1 1 緒論緒論 1 1 課題背景課題背景 電腦已經(jīng)深入到日常工作和生活的方方面面 比如文字處理 信息管理 輔助設(shè)計(jì) 圖形圖像處理 教育培訓(xùn)以及游戲娛樂等 各行各業(yè)的人們無須經(jīng) 過特別的訓(xùn)練就能夠使用電腦完成許許多多復(fù)雜的工作 然而 雖然現(xiàn)在世界 上已經(jīng)充滿了花樣繁多的各種軟件 但它們依然不能滿足用戶的各種特殊需要 人們還不得不開發(fā)適合自己特殊需求的軟件 Java 語(yǔ)言作為一種面向?qū)ο蟮木?程語(yǔ)言 具有分布式 可移植 高性能 多線程等特點(diǎn) 1 如今網(wǎng)絡(luò)休閑游戲 發(fā)展迅速 它憑借健康 方便 互動(dòng)性強(qiáng) 益智等諸多優(yōu)點(diǎn) 成為大部分現(xiàn)代 人休閑娛樂的首選 網(wǎng)絡(luò)五子棋游戲是使用 Java 語(yǔ)言開發(fā)的一款游戲 它使用 SOCKET 建立 連接 多線程處理數(shù)據(jù) 這些特點(diǎn)使這款游戲無論是服務(wù)器還是客戶端的實(shí)現(xiàn) 都相對(duì)容易 1 2 選題的背景和意義選題的背景和意義 隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展 網(wǎng)絡(luò)游戲已經(jīng)成為計(jì)算機(jī)技術(shù)中最具潛力的熱 點(diǎn)領(lǐng)域 隨著聯(lián)眾世界 騰訊游戲等網(wǎng)絡(luò)游戲平臺(tái)的拓展 越來越多的人參與到 網(wǎng)絡(luò)游戲中 特別是其中一些休閑益智類的棋牌游戲 集趣味性 娛樂性 互 動(dòng)性和益智性于一體 擁有大量的用戶 因此使用 Java 開發(fā)網(wǎng)絡(luò)五子棋游戲是 一個(gè)實(shí)用性很強(qiáng)的畢業(yè)設(shè)計(jì)項(xiàng)目 網(wǎng)絡(luò)五子棋游戲的總體功能是要設(shè)計(jì)出具有精美界面的 具備人工智能的 支持網(wǎng)絡(luò)對(duì)弈的五子棋游戲 本系統(tǒng)最終的目的是建立一個(gè)有具體規(guī)則的五子 棋平臺(tái) 使兩臺(tái)不同計(jì)算機(jī)的使用者通過一定的網(wǎng)絡(luò)連接 達(dá)到網(wǎng)絡(luò)對(duì)弈的目 的 以及單機(jī)上的人機(jī)對(duì)戰(zhàn) 1 3 主要研究?jī)?nèi)容主要研究?jī)?nèi)容 本課題為了熟悉五子棋規(guī)則及技巧 以及研究簡(jiǎn)單的人工智能 決定用 Java 開發(fā)五子棋游戲 主要完成了人機(jī)對(duì)戰(zhàn)和網(wǎng)絡(luò)對(duì)戰(zhàn) 2 個(gè)功能 網(wǎng)絡(luò)連接部 分為 Socket 編程應(yīng)用 客戶端負(fù)責(zé)界面維護(hù)和收集用戶輸入的信息 及錯(cuò)誤處 理 服務(wù)器維護(hù)在線用戶的基本信息和任意兩個(gè)對(duì)戰(zhàn)用戶的棋盤信息 動(dòng)態(tài)維 護(hù)用戶列表 在人機(jī)對(duì)弈中通過簡(jiǎn)單搜索和估值模塊 來提高電腦棋手的智能 分析估值模塊中的影響精準(zhǔn)性的幾個(gè)要素 以及提出若干提高精準(zhǔn)性的辦法 以及對(duì)它們的搜索進(jìn)行比較 在這些算法的基礎(chǔ)上分析一些提高電腦智能方案 2 算法的研究有助于理解程序結(jié)構(gòu) 增強(qiáng)邏輯思維能力 在其他人工智能方面也 有很大的參考作用 1 4 五子棋簡(jiǎn)介五子棋簡(jiǎn)介 五子棋是一種兩人對(duì)弈的純策略型棋類游戲 是起源于中國(guó)古代的傳統(tǒng)黑 白棋種之一 發(fā)展于日本 流行于歐美 容易上手 老少皆宜 而且趣味橫生 引人入勝 不僅能增強(qiáng)思維能力 提高智力 而且富含哲理 有助于修身養(yǎng)性 3 2 開發(fā)環(huán)境及工具介紹開發(fā)環(huán)境及工具介紹 2 1 開發(fā)環(huán)境及運(yùn)行環(huán)境開發(fā)環(huán)境及運(yùn)行環(huán)境 2 1 1 開發(fā)環(huán)境 AMD Athlon tm 2 10GHz 1G 內(nèi)存 160G 硬盤 Microsoft Windows XP Professional Service Pack 3 JDK 1 60 Eclipse 3 5 2 1 2 運(yùn)行環(huán)境 Intel Pentium 2 及以上處理器 128M 以上內(nèi)存 20G 以上硬盤 Microsoft Windows 9X NT 操作系統(tǒng) 1024 768 或以上的屏幕分辨率 2 2 Java 簡(jiǎn)介簡(jiǎn)介 Java 是一種簡(jiǎn)單的 面向?qū)ο蟮?分布式的 解釋的 安全的 可移植的 性能優(yōu)異的多線程語(yǔ)言 它以其強(qiáng)安全性 平臺(tái)無關(guān)性 硬件結(jié)構(gòu)無關(guān)性 語(yǔ) 言簡(jiǎn)潔 面向?qū)ο蟮奶攸c(diǎn) 在網(wǎng)絡(luò)編程語(yǔ)言中占據(jù)了無可比擬的優(yōu)勢(shì) 成為實(shí) 現(xiàn)電子商務(wù)系統(tǒng)的首選語(yǔ)言 2 2 2 1 Java 的起源與發(fā)展 Java 是 Sun 公司在 1995 年推出的新的編程語(yǔ)言 它是一種跨平臺(tái)的 應(yīng)用 于當(dāng)前高速發(fā)展的網(wǎng)絡(luò)編程語(yǔ)言 在編程語(yǔ)言中 可以認(rèn)為 Basic 語(yǔ)言促使了 C 語(yǔ)言的出現(xiàn) C 語(yǔ)言促使了 C 的出現(xiàn) 而 C 又促使了 Java 語(yǔ)言的出現(xiàn) 自 Java 正式推出之后 以其特有的優(yōu)勢(shì)迅速發(fā)展 經(jīng)過幾年的發(fā)展 Java 已經(jīng)在軟件開發(fā)和動(dòng)態(tài)網(wǎng)站上占有相當(dāng)大的市場(chǎng) Java 分為 J2SE J2EE 和 J2ME 三種 J2SE 是 Java 平臺(tái)標(biāo)準(zhǔn)版 主要應(yīng)用于桌面程序和 Java 小應(yīng)用程序 開發(fā) J2EE 主要用于企業(yè)級(jí)開發(fā)和大型網(wǎng)站的開發(fā) J2ME 主要用于手機(jī)等移 動(dòng)設(shè)備程序的開發(fā) 3 2 2 2 Java 的特點(diǎn) 前面已經(jīng)提到過 Java 是在開發(fā)家用電器軟件時(shí)開發(fā)出來的 怎么樣才能 讓這種軟件在每個(gè)平臺(tái)上都能正常地運(yùn)行呢 這就用到了 Java 的平臺(tái)無關(guān)性 在 Java 出現(xiàn)之前 這個(gè)問題是當(dāng)時(shí)每個(gè)程序員都難以解決的問題 Java 出現(xiàn)之 4 后 這個(gè)問題就徹底解決了 引用他們的目標(biāo) 就是 只要寫一次程序 在任何 地方 任何時(shí)間該程序永遠(yuǎn)都能夠運(yùn)行 Java 是怎么實(shí)現(xiàn)平臺(tái)無關(guān)性的呢 只要安裝 Java 運(yùn)行系統(tǒng) Java 就可以在 任何處理器上運(yùn)行 Java 解釋器生成與體系無關(guān)的字節(jié)碼指令 這些指令對(duì)應(yīng) 于 Java 虛擬機(jī)里表示 Java 解釋器得到字節(jié)碼后 對(duì)它進(jìn)行轉(zhuǎn)換 使之能夠在 不同的平臺(tái)上運(yùn)行 1 簡(jiǎn)單性 Java 語(yǔ)言是一種面向?qū)ο蟮恼Z(yǔ)言 它通過提供最基本的方法來完成指定的 任務(wù) 開發(fā)者只需要知道一些概念就能夠編寫出一些應(yīng)用程序 Java 程序相對(duì) 較小 其代碼能夠在小機(jī)器 例如手機(jī)上運(yùn)行 這應(yīng)該是大家經(jīng)常可以看到的 2 面向?qū)ο笳Z(yǔ)言 Java 的設(shè)計(jì)集中于對(duì)象及其接口 它提供了簡(jiǎn)單的類機(jī)制以及動(dòng)態(tài)的接口 模型 對(duì)象中封裝了它的狀態(tài)變量和相應(yīng)的方法 實(shí)現(xiàn)了模塊化和信息的隱藏 而類則是提供了對(duì)象的原型 并且通過繼承的機(jī)制 子類可以使用父類所提供 的方法 以實(shí)現(xiàn)代碼的復(fù)用 3 健壯性 Java 語(yǔ)言被病毒感染和破壞得最少 大部分病毒程序常用的方法就是通過 巧妙地運(yùn)用地址變量如指針來獲取計(jì)算機(jī)的資源 而 Java 正好放棄了難學(xué)和危 險(xiǎn)的指針功能 從而使 Java 更安全 4 多線程 設(shè)計(jì) Java 的目標(biāo)之一 就是為了滿足人們對(duì)創(chuàng)建交互式網(wǎng)上程序的需要 多線程就是為實(shí)現(xiàn)這個(gè)目標(biāo)而設(shè)計(jì)出來的 它使用 Java 編寫出來的應(yīng)用程序可 以同時(shí)執(zhí)行多個(gè)任務(wù) 多線程機(jī)制使應(yīng)用程序能夠并行執(zhí)行 而且同步機(jī)制保 證了對(duì)共享數(shù)據(jù)的正確操作 5 自動(dòng)內(nèi)存管理 可以說自動(dòng)內(nèi)存管理是 Java 健壯性的體現(xiàn) 內(nèi)存管理是很多種應(yīng)用程序內(nèi) 的關(guān)鍵因素 在網(wǎng)絡(luò)上的其他地方讀取大量的數(shù)據(jù) 之后把該數(shù)據(jù)寫入硬盤上 的數(shù)據(jù)庫(kù)內(nèi) 一般的設(shè)計(jì)就是把數(shù)據(jù)讀入內(nèi)存中的某種集合內(nèi) 對(duì)這些數(shù)據(jù)執(zhí) 行某些操作 之后把數(shù)據(jù)寫入數(shù)據(jù)庫(kù) 在數(shù)據(jù)寫入數(shù)據(jù)庫(kù)后 在下一批處理之 前 臨時(shí)存儲(chǔ)數(shù)據(jù)的集合必須清空舊數(shù)據(jù) 或者被刪除后再建 這種操作可能 執(zhí)行很多次 在像 C 這些不提供自動(dòng)垃圾搜集的語(yǔ)言中 手工清空或刪除集 合數(shù)據(jù)結(jié)構(gòu)邏輯上的一點(diǎn)點(diǎn)缺陷就可能導(dǎo)致大量的內(nèi)存被錯(cuò)誤地收回或丟失 5 Java 的自動(dòng)內(nèi)存管理正好解決這一點(diǎn) 它使程序員不用再為內(nèi)存管理寫大量的 代碼 4 2 3 Java Socket 網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程 2 3 1 Java Socket 網(wǎng)絡(luò)編程基礎(chǔ) 網(wǎng)絡(luò)編程 簡(jiǎn)單的理解就是兩臺(tái)計(jì)算機(jī)相互通信 其基本模型就是客戶機(jī) 服務(wù)器模型 也就是通信雙方中的一方必須提供一個(gè)固定的位置 而另一方則 只需要知道這個(gè)固定的位置 并去建立兩者之間的聯(lián)系 然后完成數(shù)據(jù)交換 這里提供固定位置的一方通常稱為服務(wù)器 而建立聯(lián)系的一方通常稱為客戶端 基于客戶機(jī) 服務(wù)器的 Socket 通信模型如下圖所示 5 服務(wù)響應(yīng) 服務(wù)請(qǐng)求 建立連接 客戶端 服務(wù)器端 創(chuàng)建 Socket 類對(duì) 象 指定服務(wù)器端公認(rèn)的 Socket 地址和端口 在 Socket 上監(jiān)聽客戶 端的連接請(qǐng)求 阻塞 等待連接的建 立 接收客戶端的請(qǐng)求信息 解釋并處理請(qǐng)求信息 將處理結(jié)果返回給客戶端 創(chuàng)建 Socket 類對(duì) 象 向服務(wù)器端發(fā)送連接請(qǐng)求 向服務(wù)器發(fā)出服務(wù)請(qǐng)求 接收服務(wù)結(jié)果 圖圖 1 基于客戶機(jī)基于客戶機(jī) 服務(wù)器的服務(wù)器的 Socket 通信模型通信模型 Java 為這個(gè)模型的實(shí)現(xiàn)提供了簡(jiǎn)化了的 Socket 編程接口 在程序中只要導(dǎo) 入 java io 包就可以方便的使用 java 的 Socket 編程接口 Java 中 Socket 通信模型如下圖所示 6 Server ServerSocket ss port ss accept 等待連接 OutputStream InputStream ss close Client Socket s host port 請(qǐng)求連接服務(wù)器 OutputStream InputStream s close 圖圖 2 Java 中的中的 Socket 編程模型編程模型 2 3 2 Socket 編程的實(shí)現(xiàn) Socket 類表示一個(gè)系統(tǒng)的 IP 地址和端口號(hào)的結(jié)合 可以理解為客戶端或者 服務(wù)器端的一個(gè)特殊對(duì)象 它包含兩個(gè)處理流的方法 一個(gè)是 getInputStream 方法 另一個(gè)是 getOutputStream 方法 分別用來獲得網(wǎng)絡(luò)的輸入流和輸出流 構(gòu)造 Socket 對(duì)象的示例代碼如下 Socket s new Socket IP port IP 為服務(wù)器端的 IP 地址 port 是服務(wù)器端的端口號(hào) ServerSocket 是一個(gè)專門用來建立 Socket 服務(wù)器的類 它可以用服務(wù)器需 要使用的端口號(hào)作為參數(shù)來創(chuàng)建 ServerSocket 對(duì)象 示例代碼如下 ServerSocket ss new ServerSocket TCP PORT 當(dāng)一個(gè)客戶端程序建立一個(gè) Socket 連接 所連接的端口號(hào)為上述 TCP PORT 時(shí) 服務(wù)器對(duì)象 ss 便響應(yīng)這個(gè)連接 然后 ss 對(duì)象調(diào)用 accept 方法 創(chuàng)建一個(gè)代表服務(wù)器的 Socket 對(duì)象 創(chuàng)建后服務(wù)器便可以利用這個(gè) Socket 對(duì)象 與客戶端進(jìn)行通信 示例代碼如下 Socket clientSocket ss accept 在本系統(tǒng)的實(shí)現(xiàn)過程中 在支持網(wǎng)絡(luò)對(duì)弈的服務(wù)器類的定義中需要使用 ServerSocket 類來響應(yīng)多個(gè)客戶端的連接請(qǐng)求 2 4 Java 圖形編程圖形編程 Java 中的 Graphics 類是用于繪圖和顯示格式化文本的工具類 在 Java 程序 中繪圖必須在一個(gè)窗口 容器 中進(jìn)行 繪圖窗體經(jīng)常被設(shè)計(jì)為一個(gè)組件容器 一般首先在一個(gè)面板中進(jìn)行繪制 然后再將這個(gè)面板添加到顯示窗口中 Graphics 類是在 java awt 包中聲明 顯示格式化文本和繪圖是通過調(diào)用 Graphics 類的 drawXXX 方法實(shí)現(xiàn)的 例如 drawString String drawLine 等 繪 圖采用的坐標(biāo)系是原點(diǎn)在左上角 縱軸向下以像素為單位的坐標(biāo)系 6 3 需求分析和總體設(shè)計(jì)需求分析和總體設(shè)計(jì) 7 網(wǎng)絡(luò)互連實(shí)現(xiàn)信息的共享成為以后計(jì)算機(jī)的發(fā)展趨勢(shì) 現(xiàn)有的網(wǎng)絡(luò)編程模 式主要分成兩類 一種是基于 C S Client Server 客戶機(jī) 服務(wù)器 模式 另一種是 B S Browser Server 瀏覽器 服務(wù)器 模式 C S 程序具有好的交互性 功能強(qiáng) 大 但是客戶端必須安裝客戶端軟件 限制了其應(yīng)用 B S 模式下要求客戶端 具有瀏覽器 但瀏覽器在安全方面有一些限制 交互性與功能有一些限制 網(wǎng) 絡(luò)五子棋系統(tǒng)應(yīng)用于局域網(wǎng) 對(duì)交互性要求較高 本系統(tǒng)選用了 C S 模式進(jìn)行 實(shí)現(xiàn) 網(wǎng)絡(luò)內(nèi)部使用 TCP IP 方式利用 Socket 通過傳輸層提供的服務(wù) 使用 Java 進(jìn)行圖形用戶的搭建 系統(tǒng)分成兩個(gè)部分 分別為服務(wù)端程序以及客戶端 程序 7 本文首先介紹系統(tǒng)設(shè)計(jì)思想以及相關(guān)協(xié)議的制定 以及分別闡述了服務(wù)端 程序以及客戶端程序的具體實(shí)現(xiàn) 五子棋網(wǎng)絡(luò)游戲主要分為兩個(gè)部分 游戲服務(wù)端和游戲客戶端 五子棋游 戲規(guī)則 游戲雙方各執(zhí)一種顏色的棋子 輪流在棋盤下棋子 一方的棋子在橫 豎 兩個(gè)對(duì)角線上首先到達(dá)五子者為勝方 游戲服務(wù)端主要存儲(chǔ)所有連線客戶 的相關(guān)信息及各種狀態(tài) 并負(fù)責(zé)游戲客戶之間信息的傳遞 游戲客戶端提供客 戶連接服務(wù)器 具有創(chuàng)建 邀請(qǐng) 加入 悔棋 退出游戲等等功能 并能與聯(lián) 網(wǎng)客戶進(jìn)行游戲 3 1 系統(tǒng)設(shè)計(jì)思想系統(tǒng)設(shè)計(jì)思想 WZQ Client WZQ Client WZQ Client WZQ Client WZQ Server 客戶端 服務(wù) 器端 用戶通過 TCP 與服務(wù)器 建立連接 通過 UDP 與 服務(wù)器交互數(shù)據(jù) 圖圖 3 網(wǎng)絡(luò)五子棋設(shè)計(jì)框架網(wǎng)絡(luò)五子棋設(shè)計(jì)框架 本系統(tǒng)的功能能夠?qū)崿F(xiàn)一個(gè)在網(wǎng)絡(luò)上供客戶進(jìn)行對(duì)戰(zhàn)的五子棋網(wǎng)絡(luò)游戲 客戶只要登陸到服務(wù)器上 就能選擇任何其它用戶已創(chuàng)建好的游戲 進(jìn)行五子 棋對(duì)戰(zhàn)游戲 是 C S 模式的網(wǎng)絡(luò)游戲 在 C S 模式游戲中 Server 一般提供 所有用戶的全局信息 并能提供客戶之間的信息轉(zhuǎn)發(fā) 客戶之間的通訊必須通 8 過 Server 進(jìn)行 因?yàn)樵诙鄠€(gè)客戶能夠連接到同一臺(tái) Server 上 所以 Server 必須 用 Thread 負(fù)責(zé)每個(gè)用戶的通訊和消息處理 服務(wù)端程序通過一個(gè) Thread 線程類監(jiān)聽客戶端的連接 一旦客戶連接 為 該客戶建立連接并啟動(dòng)一個(gè)特定的客戶 thread 利用該連接不斷從客戶讀取數(shù) 據(jù) 實(shí)現(xiàn)客戶和服務(wù)器或者客戶與客戶之間的信息的交互 客戶端同樣采用的是線程控制的思想 在每一個(gè)客戶端連接上服務(wù)器后 就為 此客戶端啟動(dòng)一個(gè)網(wǎng)絡(luò)收發(fā)數(shù)據(jù)線程 3 2 系統(tǒng)總體設(shè)計(jì)系統(tǒng)總體設(shè)計(jì) 系統(tǒng)使用 Socket 技術(shù)以及 java 多線程機(jī)制結(jié)合在進(jìn)行客戶與服務(wù)端之間 信息的交互 但一個(gè)真正實(shí)用程序必須針對(duì)具體應(yīng)用定制一套協(xié)議用于用戶程 序之間進(jìn)行交互 而該協(xié)議的定制往往是編寫程序的關(guān)鍵也是核心內(nèi)容 該協(xié) 議的完善決定程序是否能夠正常運(yùn)行 所謂協(xié)議就是程序之間交互的信息的格 式規(guī)定 服務(wù)端和客戶端都遵循該協(xié)議才能夠進(jìn)行對(duì)話 通俗講是人類之間 的語(yǔ)言 8 客戶端 服務(wù)器 客戶端發(fā)送連接狀 態(tài)信息和聊天信息 服務(wù)器端轉(zhuǎn)發(fā)其他 客戶端信息 圖圖 4 客戶端與服務(wù)器端的信息交換客戶端與服務(wù)器端的信息交換 3 3 系統(tǒng)功能模塊及流程系統(tǒng)功能模塊及流程 3 3 1 系統(tǒng)主要功能模塊 根據(jù)上面的系統(tǒng)的設(shè)計(jì)要求 可以將此網(wǎng)絡(luò)五子棋游戲分為以下幾個(gè)模塊 初始化模塊 建立棋盤數(shù)組并清零以備使用 初始化鍵盤 鼠標(biāo)等輸入 輸出設(shè)備并在屏幕上畫出棋盤 加載音樂及顯示詩(shī)詞功能 主循環(huán)控制模塊 負(fù)責(zé)控制下棋順序 當(dāng)輪到某方下子時(shí) 負(fù)責(zé)將程 序流程轉(zhuǎn)到相應(yīng)的模塊中 主要擔(dān)當(dāng)一個(gè)調(diào)度者的角色 9 玩家落子模塊 即用戶在指定落子區(qū)域單擊后 程序會(huì)計(jì)算該子的坐 標(biāo) 并且將棋盤數(shù)組中坐標(biāo)處記錄棋子的顏色 1 代表黑色 2 代表白 色 以表明是服務(wù)方下的棋子還是客戶方下的棋子 分析盤面填寫棋型表模塊 本程序核心模塊之一 人工智能算法的根 本依據(jù) 電腦落子模塊 根據(jù)填寫的棋盤表 選擇最優(yōu)落子位置 勝負(fù)判斷模塊 根據(jù)預(yù)先設(shè)定的規(guī)則 判斷游戲勝負(fù) 網(wǎng)絡(luò)模塊 在人機(jī)對(duì)弈的基礎(chǔ)上 添加網(wǎng)絡(luò)功能的實(shí)現(xiàn) 使兩臺(tái)不同 計(jì)算機(jī)的用戶通過網(wǎng)絡(luò)連接 實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)弈的功能 9 3 3 2 系統(tǒng)主流程 某方勝利 某方勝利 某方退出 網(wǎng)絡(luò)對(duì)弈 人機(jī)對(duì)弈 否 否 某方退出 開始 初始化 游戲模式 主循環(huán)控制 分析盤面并 填寫棋型表 玩家落子 電腦落子 客戶端一客戶端二 主循環(huán)控制 判斷勝負(fù) 結(jié)束 判斷勝負(fù)重新開始 顯示詩(shī)詞音樂 圖圖 5 網(wǎng)絡(luò)五子棋游戲流程圖網(wǎng)絡(luò)五子棋游戲流程圖 10 3 4 玩家視圖與操作玩家視圖與操作 3 4 1 服務(wù)器端 圖圖 6 網(wǎng)絡(luò)五子棋服務(wù)器端界面網(wǎng)絡(luò)五子棋服務(wù)器端界面 服務(wù)器端主要通過建立流連接來連接客戶端 與客戶端進(jìn)行相互通信 轉(zhuǎn) 發(fā)信息 接收客戶端的信息 接收信息后按照此客戶端的要求將信息發(fā)送到相 應(yīng)的客戶端 服務(wù)器端起到了中轉(zhuǎn)的作用 10 3 4 2 客戶端 圖圖 7 用戶操作界面用戶操作界面 userPad chatPad chessPad inputPad controlPad 11 玩家進(jìn)入游戲界面時(shí) 首先會(huì)彈出一個(gè)對(duì)話框 提示用戶連接服務(wù)器 當(dāng) 玩家連接上服務(wù)器后 就會(huì)在界面右上角給出用戶的初始玩家名 在聊天內(nèi)容 框中會(huì)給出用戶提示 提醒玩家先創(chuàng)建游戲或者加入別的玩家建立好的游戲 此外如果玩家不想與其他玩家對(duì)弈 也可以選擇人機(jī)對(duì)戰(zhàn) 和電腦對(duì)弈 玩家 在邀請(qǐng)其他玩家加入自己建立好的游戲或者要加入其他玩家建立的游戲 需要 玩家選在用戶列表界面選擇要操作的玩家 再發(fā)起邀請(qǐng)或者加入 此游戲界面 簡(jiǎn)單 用戶易操作上手 適合各個(gè)年齡的人群 游戲各模塊功能如下 各模塊實(shí)現(xiàn)功能 userPad 用于顯示服務(wù)器發(fā)送過來的當(dāng)前連接上服務(wù)器的用戶列表 即活 動(dòng)玩家的玩家名稱 chatPad 用于顯示服務(wù)器發(fā)送過來的提示信息以及用戶公聊或私聊的內(nèi)容 chessPad 用于繪制棋盤及棋子 以及當(dāng)前的提示信息 另外人機(jī)對(duì)戰(zhàn)的主 要功能也在此模塊實(shí)現(xiàn) inputPad 用于用戶選擇要公聊或私聊的對(duì)象 即所有人或某一具體的玩家 輸入要發(fā)送的消息 發(fā)送給服務(wù)器 通過服務(wù)器轉(zhuǎn)發(fā)出去 controlPad 用于對(duì)當(dāng)前的游戲界面進(jìn)行實(shí)時(shí)的控制 包括 開關(guān)音樂 修 改玩家名字 建立游戲 邀請(qǐng)加入 加入游戲 放棄游戲 悔棋和人機(jī)對(duì)戰(zhàn) 12 4 概要設(shè)計(jì)概要設(shè)計(jì) 基于玩家的需求分析 本系統(tǒng)的實(shí)現(xiàn)主要用到如下幾個(gè)類 1 ChessServer 類 主要用于傳遞玩家信息 2 ChessClient 類 主要用于初始化玩家信息 定義玩家的操作狀態(tài) 3 NetClient 類 主要用于實(shí)現(xiàn)網(wǎng)絡(luò)用戶的連接 玩家通過此類發(fā)送本方的 游戲狀態(tài)以及接收從服務(wù)器傳遞過來的信息進(jìn)行處理 4 ChessPad 類 主要用于繪制玩家棋盤及棋子 另外電腦落子的算法也全 部在此類中實(shí)現(xiàn) 4 1 游戲各主要類的功能與主要對(duì)象游戲各主要類的功能與主要對(duì)象 4 1 1 服務(wù)器類 服務(wù)器類用于接收客戶端的連接 并為每個(gè)客戶端在服務(wù)器端啟動(dòng)單獨(dú) 的一個(gè)守護(hù)線程 線程的主要功能是接收客戶端發(fā)送過來的消息并做出相應(yīng)的 處理 客戶端發(fā)送到服務(wù)器端的主要消息有兩部分 一部分是客戶端發(fā)送給服 務(wù)器端需要服務(wù)器端進(jìn)行處理的 如客戶端發(fā)送過的連接信息 客戶端發(fā)送過 來的改名信息 客戶端發(fā)送過的斷開連接信息等 另一部分是客戶端發(fā)送給服 務(wù)器端需要服務(wù)端轉(zhuǎn)發(fā)給其他客戶端的消息 如客戶端給游戲另一方發(fā)送的棋 盤狀態(tài)數(shù)據(jù) 倒計(jì)時(shí)信息 聊天信息 服務(wù)器類的主要對(duì)象 1 TCP PORT 服務(wù)器端用于建立套接字的端口號(hào) 為了可靠的用戶連接 因此在服務(wù)器端定 義了此端口號(hào)為 TCP 的 主要用于建立服務(wù)器端與客戶端的 TCP 連接 2 UDP PORT 服務(wù)器端用于向客戶端轉(zhuǎn)發(fā)數(shù)據(jù)需要綁定的用戶數(shù)據(jù)報(bào)套接字的端口號(hào) 玩家發(fā)送給服務(wù)器需要轉(zhuǎn)發(fā)的消息時(shí) 服務(wù)器端的DatagramSocket 就是使用此端口 號(hào)建立的 UDP 連接 3 clientDataHash 用于保存客戶端套接字和IP 套接字地址的哈希表 服務(wù)器可以通過發(fā)送消息的 客戶端 Socket 得到其 IP 套接字地址 將消息轉(zhuǎn)發(fā)出去 4 clientNameHash 用于保存客戶端套接字和客戶端當(dāng)前名字的哈希表 同樣是為了轉(zhuǎn)發(fā)客戶 端消息的 5 chessPeerHash 13 用于保存每一對(duì)開局玩家信息的哈希表 表中鍵是服務(wù)方 值是客戶方 每一對(duì)玩家需要交換的如棋盤狀態(tài)數(shù)據(jù) 倒計(jì)時(shí)信息大都依賴于此哈希表來實(shí) 現(xiàn) 圖圖 8 服務(wù)器類用況圖服務(wù)器類用況圖 4 1 2 游戲客戶端 游戲客戶端的主要功能是為了初始化和組織用戶界面 并且定義了各個(gè) 按鈕的功能 游戲客戶端的主要對(duì)象如下 1 isGameConnected 用于判定玩家是否與服務(wù)器連接 2 isChess 用于判定玩家是否已經(jīng)在開局游戲中 3 isServer 用于判定在此局開局游戲中 當(dāng)前玩家是不是服務(wù)方 即主方 4 isClient 用于判定在此局開局游戲中 當(dāng)前玩家是不是客戶方 即次方 5 time Time 類的對(duì)象 用于啟動(dòng)玩家倒計(jì)時(shí)信息 6 shici ShiCi 類的對(duì)象 用于在玩家啟動(dòng)時(shí)動(dòng)態(tài)地顯示五子棋詩(shī)的信息 7 sing Sing 類的對(duì)象 用于為客戶端啟動(dòng)音樂功能 14 圖圖 9 游戲客戶端用況圖游戲客戶端用況圖 4 1 3 網(wǎng)絡(luò)客戶端類 網(wǎng)絡(luò)客戶端的主要功能是當(dāng)前玩家與其他玩家進(jìn)行對(duì)弈時(shí) 網(wǎng)絡(luò)客戶端 需要發(fā)送和接收的消息處理 網(wǎng)絡(luò)客戶端的主要對(duì)象 1 r 隨機(jī)函數(shù)類的對(duì)象 用于為每個(gè)客戶端啟動(dòng)時(shí) 為每一個(gè)客戶端隨機(jī)分配 一個(gè)端口號(hào) 玩家使用此端口號(hào)來接收信息 2 time 當(dāng)前玩家方的時(shí)間信息 初始化時(shí)間為 5 分鐘 3 otherTime 當(dāng)前開局游戲中對(duì)方的時(shí)間信息 初始時(shí)間為 5 分鐘 圖圖 10 網(wǎng)絡(luò)客戶端用況圖網(wǎng)絡(luò)客戶端用況圖 15 4 1 4 棋盤類 棋盤類的主要功能是繪制玩家的棋盤狀態(tài)與棋子信息以及電腦落子算法的 實(shí)現(xiàn) 棋盤類的主要對(duì)象 1 board 玩家所維護(hù)的棋盤二維數(shù)組 結(jié)果為 1 表示 x y 位置為黑子 結(jié)果為 2 表 示 x y 位置為白子 2 withComputer 玩家與電腦對(duì)弈的標(biāo)志 如果當(dāng)前玩家是與電腦對(duì)弈 此變量值為真 否 則為假 3 isMouseEnable 以此變量來控制在網(wǎng)絡(luò)對(duì)弈的雙方中 當(dāng)前玩家是否處于可以落子狀態(tài) 因?yàn)榫W(wǎng)絡(luò)對(duì)弈要求當(dāng)一玩家下完后 對(duì)方才能落子 因此當(dāng)此變量為真時(shí) 玩 家可以落子 當(dāng)此變量為假時(shí) 玩家不可以落子 4 isRegretEnable 判斷當(dāng)前的悔棋按鈕是否可用 為真時(shí) 玩家可以悔棋 為假時(shí) 玩家不 可以悔棋 5 isFull 判斷當(dāng)前的棋盤是否已經(jīng)下滿 當(dāng)棋盤下滿后 分別給游戲雙方一個(gè)提示 然后進(jìn)行清盤操作 圖圖 11 棋盤類用況圖棋盤類用況圖 16 5 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì) 5 1 服務(wù)器端設(shè)計(jì)服務(wù)器端設(shè)計(jì) 服務(wù)器端主要通過建立流連接來連接客戶端 與客戶端進(jìn)行相互通信 轉(zhuǎn) 發(fā)信息 接收客戶端的信息 接收信息后按照此客戶端的要求將信息發(fā)送到相 應(yīng)的客戶端 服務(wù)器端起到了中轉(zhuǎn)的作用 服務(wù)器端主要方法如下 1 在主類的 Start 函數(shù)中 用于初始化連接的信息為 ss new ServerSocket TCP PORT udpSocket new DatagramSocket UDP PORT ss 為服務(wù)器端 Socket 為了保證連接的正確性和轉(zhuǎn)發(fā)數(shù)據(jù)的高效性 因此 定義了兩個(gè)端口變量 TCP PORT 和 UDP PORT 服務(wù)器端用 TCP PORT實(shí)現(xiàn)服務(wù)器 套接字 服務(wù)器套接字等待請(qǐng)求通過網(wǎng)絡(luò)傳入 用UDP PORT用來發(fā)送和接收 數(shù)據(jù)報(bào)包的套接字 2 在主類 chessServer 中 其用于接受客戶端連接信息的函數(shù) start 服務(wù) 器端每接收一個(gè)客戶端連接 就會(huì)為每個(gè)客戶端在服務(wù)器端啟動(dòng)一個(gè) UDPThread 線程 UDPThread 類繼承了 Thread 它集成了服務(wù)器端的所有功能 包括與各客戶端之間的相互通信 轉(zhuǎn)發(fā)信息 3 在方法 actionPerformed ActionEvent e 實(shí)現(xiàn)了按鈕的控制功能 4 方法 feedBack String 用于實(shí)現(xiàn)服務(wù)器端向當(dāng)前的客戶端發(fā)送消息 服 務(wù)器依靠當(dāng)前客戶端的套接字 從 clientDataHash 表中得到當(dāng)前客戶的 IP 套接 字 服務(wù)器端將消息從此 IP 套接字中轉(zhuǎn)發(fā)出去 String 即為要轉(zhuǎn)發(fā)的消息內(nèi)容 5 方法 publicTalk String 用于實(shí)現(xiàn)服務(wù)器向所有玩家轉(zhuǎn)發(fā)消息內(nèi)容 在此 方法實(shí)現(xiàn)中 服務(wù)器采用一個(gè) For 循環(huán)遍歷得到 ClientDataHash 表中的套接字 將消息依次轉(zhuǎn)發(fā)給各個(gè)客戶端 String 串為要轉(zhuǎn)發(fā)的消息內(nèi)容 6 方法 getUserList 用于得到當(dāng)前的玩家列表 以使每個(gè)玩家的玩家列表 能夠?qū)崟r(shí)更新 一旦每個(gè)用戶連接上服務(wù)器 服務(wù)器就要廣播發(fā)送當(dāng)前所以玩 有列表信息 7 doMessage String 方法用于對(duì)服務(wù)器接收到的消息進(jìn)行處理 8 chessBackTalk String 方法用于對(duì)游戲中已經(jīng)對(duì)弈玩家的對(duì)方發(fā)送消息 此方法依靠 chessPeerHash 表得到玩家對(duì)手的名字 再利用 clientNameHash 中 得到對(duì)方的套接字 繼而將游戲方發(fā)送過來的消息轉(zhuǎn)發(fā)給對(duì)方 17 圖圖 12 服務(wù)器類類圖服務(wù)器類類圖 5 2 游戲客戶端設(shè)計(jì)游戲客戶端設(shè)計(jì) 游戲客戶端主要用于初始化玩家信息 定義玩家的操作狀態(tài) 包括游戲客 戶端界面的結(jié)構(gòu)組織 定義游戲控制按鈕的實(shí)現(xiàn) 定義鍵盤事件的實(shí)現(xiàn) 主要方法 1 方法 launchFrame 用于在玩家客戶端啟動(dòng)時(shí) 為用戶發(fā)送連接服務(wù)器信 息 并且加載詩(shī)詞顯示及背景音樂的播放 2 方法 actionPerformed ActionEvent e 用于實(shí)現(xiàn)玩家單擊客戶端下文的控制 按鈕的功能 在此方法中主要實(shí)現(xiàn)了玩家修改名字 創(chuàng)建游戲 邀請(qǐng)游戲 加 入游戲 放棄游戲以及人機(jī)對(duì)戰(zhàn)等各個(gè)按鈕的功能 參數(shù)為觸發(fā)事件的行為事 件 3 方法 keyPressed KeyEvent e 用于聊天功能的實(shí)現(xiàn) 當(dāng)玩家在輸入框中輸 入了聊天信息后 用戶按回車鍵發(fā)送消息即觸發(fā)此事件 此事件中主要處理了 兩個(gè)行為 一是當(dāng)用戶選擇所有人進(jìn)行公聊時(shí)的處理 二是當(dāng)玩家選擇某一具 體的玩家進(jìn)行私聊時(shí)的處理 18 圖圖 13 游戲客戶端類類圖游戲客戶端類類圖 5 3 網(wǎng)絡(luò)客戶端設(shè)計(jì)網(wǎng)絡(luò)客戶端設(shè)計(jì) 網(wǎng)絡(luò)客戶端主要用于發(fā)送和接收服務(wù)器的消息 主要方法 1 方法 connect String int 用于連接服務(wù)器 第一個(gè)參數(shù)是連接服務(wù)器的 IP 地址 第二個(gè)參數(shù)是連接服務(wù)器的端口號(hào) 玩家在此方法中連接上服務(wù)器 并 且啟動(dòng)一個(gè)線程用于接受服務(wù)器發(fā)送過來的消息 2 方法 restart 用于重新開始游戲 在此方法中要求將倒計(jì)時(shí)信息重新初 始化 并且進(jìn)行清理棋盤操作 3 方法 send int String 用于向服務(wù)器發(fā)送此玩家的消息狀態(tài) 第一個(gè)參數(shù) 是消息類型 第二個(gè)參數(shù)是消息內(nèi)容 消息類型有如下幾種 發(fā)送消息類型 0 代表修改客戶端名字 1 代表客戶端建立游戲 2 代表客戶端加入游戲 3 代表向游戲?qū)Ψ酵ǜ婵蛻舳艘鸭尤?19 4 代表客戶端放棄游戲 5 代表客戶端對(duì)游戲?qū)Ψ桨l(fā)送過來的放棄操作進(jìn)行斷開 6 代表游戲一方向另一方提出悔棋請(qǐng)求 7 代表游戲一方向另一方發(fā)送棋盤狀態(tài) 8 代表游戲一方向另一方發(fā)送時(shí)間信息 9 代表游戲一方游戲超時(shí) 10 代表邀請(qǐng)另一方加入游戲 11 代表受邀玩家同意了加入游戲 12 代表受邀玩家拒絕了加入游戲 4 方法 doMessage DatagramPacket 用于接收從服務(wù)器端發(fā)送過來的消息 參數(shù)代表的是玩家接收到的數(shù)據(jù)報(bào) 圖圖 14 網(wǎng)絡(luò)客戶端類類圖網(wǎng)絡(luò)客戶端類類圖 5 4 棋盤類設(shè)計(jì)棋盤類設(shè)計(jì) 棋盤類主要用于繪制棋盤以及電腦算法的實(shí)現(xiàn) 5 4 1 棋盤類的主要方法 1 方法 paint Graphics 用于繪制棋盤 棋子以及棋盤的背景圖片 為了消 除加載圖片時(shí)的窗口閃爍 在此方法中采用了雙緩沖技術(shù) 2 方法 clearBoard 用于清空棋盤以及一些變量的初始化操作 3 方法 select 用于實(shí)現(xiàn)當(dāng)玩家與電腦對(duì)弈時(shí) 選擇誰(shuí)是先手 以及對(duì)按鈕 狀態(tài)的設(shè)置 4 方法 is Full 用于判斷當(dāng)前棋盤是否已無處落子 即棋盤是否已滿 如 果當(dāng)前棋盤已滿 則向玩家發(fā)送一個(gè)提示框 告知玩家此局游戲流局 20 5 方法 judge int int int 用于判斷當(dāng)前棋子落下時(shí)是否游戲勝負(fù)已分 第一 個(gè)參數(shù)是當(dāng)前落子的橫坐標(biāo) 第二個(gè)參數(shù)是當(dāng)前落子的縱坐標(biāo) 第三個(gè)參數(shù)是 當(dāng)前落子的棋子的顏色 如果游戲獲勝 則方法返回真值 否則返回假值 圖圖 15 棋盤類類圖棋盤類類圖 5 4 2 電腦落子算法的實(shí)現(xiàn) 1 行棋簡(jiǎn)要相關(guān)術(shù)語(yǔ) 成五 含有五枚同色棋子所形成的連 包括五連和長(zhǎng)連 活四 有兩個(gè)點(diǎn)可以成五的四 沖四 只有一個(gè)點(diǎn)可以成五的四 死四 不能成五的四 活三 再走一著可以形成活四的三 眠三 再走一著可以形成沖四的三 死三 不能成五的三 活二 再走一著可以形成活三的二 眠二 再走一著可以形成眠三的二 死二 不能成五的二 2 落子算法分析 21 1 數(shù)據(jù)結(jié)構(gòu) 首先為整個(gè)棋盤建立一張表格用以記錄棋子信息 使用一個(gè) 21 21 的二維 數(shù)組 board 21 21 數(shù)組的每一個(gè)元素對(duì)應(yīng)棋盤上的一個(gè)交叉點(diǎn) 用 0 表 示空位 1 代表黑子 2 代表白子 這張表也是今后分析的基礎(chǔ) 在此 之后還要為電腦和玩家雙方各建立一張棋型表 Computer 21 21 4 和 Player 15 15 4 用來存放棋型數(shù)據(jù) 就是剛才所說的重要程度 比如用 20 代表 沖四 的點(diǎn) 用 15 代表 活三 的點(diǎn) 那么在計(jì)算重要性時(shí) 就可以根 據(jù) 20 15 得出前者比后者重要 下子時(shí)電腦便會(huì)自動(dòng)選擇 沖四 的點(diǎn) 那為 什么棋型表要使用三維數(shù)組呢 因?yàn)槠灞P上的每一個(gè)點(diǎn)都可以與橫 豎 左斜 右斜四個(gè)方向的棋子構(gòu)成不同的棋型 所以一個(gè)點(diǎn)總共有 4 個(gè)記錄 這樣做的 另一個(gè)好處是可以輕易判斷出復(fù)合棋型 例如 如果同一點(diǎn)上有 2 個(gè) 15 就 是雙三 有一個(gè) 15 和一個(gè) 20 就是四三 2 程序流程 本程序由六個(gè)基本功能模塊構(gòu)成 各模塊的詳細(xì)分析如下 1 初始化 首先 建立盤面數(shù)組 board 21 21 對(duì)戰(zhàn)雙方的棋型表 Computer 21 21 4 和 Player 21 21 4 并將它們清零以備使用 2 主循環(huán)控制模塊 控制下棋順序 當(dāng)輪到某方下子時(shí) 負(fù)責(zé)將程序轉(zhuǎn)到相應(yīng) 的模塊中去 主要擔(dān)當(dāng)一個(gè)調(diào)度者的角色 3 玩家下子 當(dāng)輪到玩家下時(shí) 玩家通過鼠標(biāo)在棋盤上落子 程序會(huì)根據(jù)該點(diǎn) 的位置 在 board 21 21 數(shù)組的相應(yīng)地方記錄 4 盤面分析填寫棋型表 本程序核心模塊之一 人工智能算法的根本依據(jù) 其 具體實(shí)現(xiàn)方法如下 玩家在下五子棋時(shí) 一定會(huì)先根據(jù)棋盤上的情況 找出當(dāng) 前最重要的一些點(diǎn)位 如 活三 沖四 等 然后再在其中選擇落子點(diǎn) 但是 電腦不會(huì)像人一樣分析問題 要讓它知道哪是 活三 哪是 沖四 就得在棋盤上逐點(diǎn)計(jì)算 一步一步的教它 先來分析己方的棋型 從棋盤左上角出發(fā) 向右逐行搜索 當(dāng)遇到一個(gè)空 白點(diǎn)時(shí) 以它為中心向左挨個(gè)查找 如果遇到己方的子則記錄然后繼續(xù) 如果 遇到對(duì)方的子 空白點(diǎn)或邊界就停止查找 左邊完成后再向右進(jìn)行同樣的操作 最后把左右兩邊的記錄合并起來 得到的數(shù)據(jù)就是該點(diǎn)橫向上的棋型 然后把 棋型的編號(hào)填入到 Computer x y n 中就行了 x y 代表坐標(biāo) n 0 1 2 3 分別代表橫 豎 左斜 右斜四個(gè)方向 而其他三個(gè)方向的棋型也可用同樣 的方法得到 當(dāng)搜索完整張棋盤后 己方棋型表也就填寫完畢了 然后再用同 樣的方法填寫電腦的棋型表 以下是給出的棋型的計(jì)分標(biāo)準(zhǔn) 22 成五 100000 活四 10000 沖四 5000 死四 500 活三 200 眠三 100 死三 50 活二 5 眠二 4 死二 3 5 電腦下子 有了上面填寫的兩張棋型表 現(xiàn)在要作的就是讓電腦知道在哪一 點(diǎn)下子了 遍歷棋型表 Computer 15 15 4 和 Player 15 15 4 找出其中數(shù)值最 大的一點(diǎn) 在該點(diǎn)下子即可 6 勝負(fù)判斷 毋須多言 某方形成五子連即獲勝 11 3 算法流程 電腦落子 是否 否 游戲開始 電腦先手 電腦執(zhí)行算法 找 到最佳落子位置 玩家落子 游戲結(jié)束 判斷所選棋子位置的四 個(gè)方向的結(jié)構(gòu) 并且給出 各個(gè)方向上的權(quán)值 結(jié)合四個(gè)角度的權(quán) 值 得出總值 循環(huán)得出最大權(quán)值 返回最佳落子位置 圖圖 16 人機(jī)對(duì)戰(zhàn)算法流程人機(jī)對(duì)戰(zhàn)算法流程 23 5 5 系統(tǒng)各模塊之間的關(guān)系系統(tǒng)各模塊之間的關(guān)系 圖圖 17 各模塊關(guān)系圖各模塊關(guān)系圖 系統(tǒng)主要功能的實(shí)現(xiàn)在于 ChessServer 類 ChessClient 類 NetClient 類 ChessPad 類之間的交互 在實(shí)現(xiàn)人機(jī)對(duì)弈模塊 主要用到的類是 ChessClient 類 和 ChessPad 類 ChessClient 類用于組織界面及玩家單擊按鈕功能的實(shí)現(xiàn) ChessPad 類用于繪制棋盤以及玩家和電腦的落子情況 人機(jī)對(duì)弈的算法也在本 類中實(shí)現(xiàn) 在實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)弈模塊 主要用到的類是 ChessServer 類 ChessClient 類 NetClient 類 服務(wù)器類與客戶端類的信息交換依靠 Socket 編程實(shí)現(xiàn) 其他 類如 Sing 類 Shici 類 都是在用戶連接服務(wù)器后由游戲客戶端類自動(dòng)調(diào)用其 類來實(shí)現(xiàn)功能的 24 6 軟件實(shí)現(xiàn)與測(cè)試軟件實(shí)現(xiàn)與測(cè)試 6 1 軟件測(cè)試方案軟件測(cè)試方案 軟件測(cè)試就是利用測(cè)試工具按照測(cè)試方案和流程對(duì)產(chǎn)品進(jìn)行功能和性能測(cè) 試 甚至根據(jù)需要編寫不同的測(cè)試工具 設(shè)計(jì)和維護(hù)測(cè)試系統(tǒng) 對(duì)測(cè)試方案可 能出現(xiàn)的問題進(jìn)行分析和評(píng)估 執(zhí)行測(cè)試用例后 需要跟蹤故障 以確保開發(fā) 的產(chǎn)品適合需求 軟件測(cè)試的目的 1 測(cè)試并不僅僅是為了找出錯(cuò)誤 通過分析錯(cuò)誤產(chǎn)生的原因和錯(cuò)誤的 發(fā)生趨勢(shì) 可以幫助項(xiàng)目管理者發(fā)現(xiàn)當(dāng)前軟件開發(fā)過程中的缺陷 以便及 時(shí)改進(jìn) 2 這種分析也能幫助測(cè)試人員設(shè)計(jì)出有針對(duì)性的測(cè)試方法 改善測(cè)試 的效率和有效性 3 沒有發(fā)現(xiàn)錯(cuò)誤的測(cè)試也是有價(jià)值的 完整的測(cè)試是評(píng)定軟件質(zhì)量的 一種方法 軟件測(cè)試可以分為黑盒測(cè)試和白盒測(cè)試 軟件的黑盒測(cè)試意味著測(cè)試要在軟件的接口處進(jìn)行 這種方法是把測(cè)試對(duì) 象看做一個(gè)黑盒子 測(cè)試人員完全不考慮程序內(nèi)部的邏輯結(jié)構(gòu)和內(nèi)部特性 只 依據(jù)程序的需求規(guī)格說明書 檢查程序的功能是否符合它的功能說明 因此黑 盒測(cè)試又叫功能測(cè)試或數(shù)據(jù)驅(qū)動(dòng)測(cè)試 黑盒測(cè)試主要是為了發(fā)現(xiàn)以下幾類錯(cuò)誤 1 是否有不正確或遺漏的功能 2 在接口上 輸入是否能正確的接受 能否輸出正確的結(jié)果 3 是否有數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤或外部信息 例如數(shù)據(jù)文件 訪問錯(cuò)誤 4 性能上是否能夠滿足要求 5 是否有初始化或終止性錯(cuò)誤 軟件的白盒測(cè)試是對(duì)軟件的過程性細(xì)節(jié)做細(xì)致的檢查 這種方法是把測(cè)試 對(duì)象看做一個(gè)打開的盒子 它允許測(cè)試人員利用程序內(nèi)部的邏輯結(jié)構(gòu)及有關(guān)信 息 設(shè)計(jì)或選擇測(cè)試用例 對(duì)程序所有邏輯路徑進(jìn)行測(cè)試 通過在不同點(diǎn)檢查 程序狀態(tài) 確定實(shí)際狀態(tài)是否與預(yù)期的狀態(tài)一致 因此白盒測(cè)試又稱為結(jié)構(gòu)測(cè) 試或邏輯驅(qū)動(dòng)測(cè)試 白盒測(cè)試主要是想對(duì)程序模塊進(jìn)行如下檢查 1 對(duì)程序模塊的所有獨(dú)立的執(zhí)行路徑至少測(cè)試一遍 2 對(duì)所有的邏輯判定 取 真 與取 假 的兩種情況都能至少測(cè)一遍 3 在循環(huán)的邊界和運(yùn)行的界限內(nèi)執(zhí)行循環(huán)體 25 4 測(cè)試內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性 等等 基于以上的分析 本軟件采用的是黑盒測(cè)試的方法 6 2 網(wǎng)絡(luò)客戶端測(cè)試用例網(wǎng)絡(luò)客戶端測(cè)試用例 用例名稱 網(wǎng)絡(luò)客戶端功能 用例描述 玩家連接上服務(wù)器后 能夠依據(jù)系統(tǒng)提示創(chuàng)建或者加入游戲 能夠與其他玩家進(jìn)行正常的對(duì)弈操作 用例入口 運(yùn)行程序界面下的 ChessClient jar 進(jìn)入網(wǎng)絡(luò)客戶端界面 表表 1 網(wǎng)絡(luò)客戶端功能測(cè)試網(wǎng)絡(luò)客戶端功能測(cè)試 測(cè)試用例 ID 場(chǎng)景測(cè)試步驟預(yù)期結(jié)果備注 1 初始界面顯示 正 常進(jìn)入 輸入服務(wù)器地址成功進(jìn)入客戶端啟動(dòng)服務(wù)器 2 初始界面顯示 不 能登錄 未輸入服務(wù)器地址 或服務(wù)器地址不存 在 給出玩家服務(wù)器未 啟動(dòng)的提示 3 加載詩(shī)詞顯示功 能及背景音樂播 放 進(jìn)入客戶端 正常顯示詩(shī)詞及能 夠聽到背景音樂 4 修改名字 正確輸 入 單擊修改名字按鈕 輸入玩家名字 在玩家列表中原來 的名字更改為新的 玩家名 5修改名字 重名 玩家輸入名字在玩 家列表中已經(jīng)存在 系統(tǒng)給出用戶提示 玩家姓名已存在 6創(chuàng)建游戲單擊創(chuàng)建游戲按鈕 系統(tǒng)在聊天框中給 出提示并且在玩家 列表框中游戲名更 改為 等待游戲 玩家 名 7 邀請(qǐng)游戲 正常邀 請(qǐng) 在玩家列表中選擇 一個(gè)非游戲中的玩 家 單擊邀請(qǐng)加入 按鈕發(fā)出邀請(qǐng) 系統(tǒng)無
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融學(xué)考試復(fù)習(xí)總結(jié)
- 人生規(guī)劃主題班會(huì)課件
- 二手鋼架買賣合同范本
- 個(gè)體酒店股權(quán)轉(zhuǎn)讓協(xié)議書
- 安保公司加盟合同范本
- 廢除林權(quán)流轉(zhuǎn)合同范本
- 家庭農(nóng)場(chǎng)合伙入股協(xié)議書
- 圖文設(shè)備采購(gòu)合同范本
- 休閑會(huì)所轉(zhuǎn)讓合同范本
- 景區(qū)項(xiàng)目合作投資協(xié)議書
- 小學(xué)五年級(jí)下冊(cè)體育與健康教案
- 部編版八年級(jí)下冊(cè)歷史期末100道選擇題專練
- 改進(jìn)工作作風(fēng)自查報(bào)告(11篇)
- 典型任務(wù)-無線調(diào)車燈顯設(shè)備使用講解
- 24春國(guó)家開放大學(xué)《機(jī)械CADCAM》形考任務(wù)1-3參考答案
- 2024年高校教師崗前培訓(xùn)《高等教育學(xué)》題目100道附答案(綜合題)
- 施工升降機(jī)安裝驗(yàn)收表
- RBA-6.0-培訓(xùn)教材課件
- 《客艙安全與應(yīng)急處置》-課件:滅火設(shè)備:機(jī)載滅火瓶
- 國(guó)際關(guān)系史智慧樹知到期末考試答案2024年
- 上海中考英語(yǔ)語(yǔ)法專項(xiàng)練習(xí)題集和參考答案
評(píng)論
0/150
提交評(píng)論