linux環(huán)境下五子棋游戲設(shè)計畢業(yè)設(shè)計_第1頁
已閱讀1頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  畢業(yè)設(shè)計(論文)</b></p><p>  設(shè)計(論文)題目:Linux環(huán)境下五子棋游戲設(shè)計</p><p>  姓 名 </p><p>  學(xué) 號 </p><p>  院 (系) 數(shù)學(xué)與計算機(jī)學(xué)院

2、 </p><p>  專 業(yè) 信息管理與信息系統(tǒng) </p><p>  2014年 5月13日</p><p><b>  摘 要</b></p><p>  五子棋起源于古代中國,發(fā)展于日本,風(fēng)靡于歐洲,不僅以其簡單易學(xué)的特性,為廣大群眾所喜聞樂見,而且又有深奧的技巧和高水平的國際性比賽。它的棋文化源

3、淵流長, 具有東方的神秘和西方的直觀,既有“場”的概念,亦有“點”的連接,它是中西文化的交流點,是古今哲理的結(jié)晶。 </p><p>  五子棋是一種兩人對弈的純策略型棋類游戲,應(yīng)用C語言編寫程序可以在計算機(jī)上實現(xiàn)二人對弈五子棋功能。二人對弈五子棋程序由圖像生成、光標(biāo)移動與落子、判斷勝負(fù)和系統(tǒng)幫助等子程序構(gòu)成;程序中應(yīng)用了結(jié)構(gòu)體、數(shù)組、全局變量、按鍵處理和圖形編程等元素和語句。程序通過棋盤和棋子圖像生成、二人移子

4、與落子和判斷勝負(fù)等功能的實現(xiàn),在計算機(jī)上實現(xiàn)了二人五子棋對弈。 </p><p>  關(guān)鍵詞:C語言;五子棋;數(shù)組;圖形編程 </p><p><b>  abstract</b></p><p>  Gobang game is originated in ancient China, development in Japan, popula

5、r in Europe, not only for its simple properties, as the masses love to see and hear, but also has a profound skills and a high level of international competition. Its chess culture origin is long, has the Eastern mystici

6、sm and western visual, both " field " concept, also has a" point" connection, it is the point of cultural communication, is the crystallization of ancient and modern philosophy.</p><p>  

7、Gobang is a traditional checker-type game in which the lining up of five pieces in a straight line scores victory. And C language can accomplish a 2-player gobang on computers. This 2-player gobang program contains 4 mai

8、n sections, they are, graphics, movement and selection, victory judgment and helping system. Several elements and sentences of C programming language such as structural element, array, global variables, press processing

9、and Graphics Programming are also applied in the program. Wi</p><p>  Keywords: C programing language, Gobang, Array, Graphics Programming,</p><p><b>  目 錄</b></p><p>

10、;<b>  摘 要II</b></p><p>  abstractIII</p><p><b>  1 概述1</b></p><p>  1.1 開發(fā)背景1</p><p>  1.2 開發(fā)目的和意義1</p><p>  1.3 開發(fā)目標(biāo)2</p

11、><p>  2程序的介紹與規(guī)劃3</p><p><b>  2.1程序設(shè)計3</b></p><p>  2.3程序的實現(xiàn)目的3</p><p>  3程序分析與總體設(shè)計4</p><p>  3.1 程序需求分析4</p><p>  3.1.1 用戶需求分析

12、4</p><p>  3.1.2 功能需求分析4</p><p>  3.1.3 程序穩(wěn)定性分析6</p><p>  3.2程序總體方案的設(shè)計6</p><p>  3.3 程序開發(fā)方法與開發(fā)平臺8</p><p>  3.3.1 開發(fā)方法8</p><p>  3.4 本章小結(jié)

13、8</p><p>  4程序設(shè)計與算法實現(xiàn)9</p><p><b>  4.1數(shù)據(jù)模塊9</b></p><p>  4.1.1 數(shù)據(jù)結(jié)構(gòu)9</p><p>  4.1.2 數(shù)據(jù)定義10</p><p>  4.2.1 界面設(shè)計——創(chuàng)建棋盤10</p><p&g

14、t;  4.2.2 界面設(shè)計——創(chuàng)建菜單12</p><p>  4.2.3 相關(guān)功能函數(shù)13</p><p>  4.3 核心功能函數(shù)模塊16</p><p>  4.3.1 相關(guān)功能16</p><p>  4.4 游戲功能模塊18</p><p>  4.4.1 游戲主要操作流程圖18</p&g

15、t;<p>  4.4.2 人人對戰(zhàn)模塊19</p><p>  4.4.3 人機(jī)對戰(zhàn)模塊20</p><p>  4.4.4 網(wǎng)絡(luò)對戰(zhàn)模塊23</p><p>  4.4.5 其他功能模塊25</p><p>  4.5 本章小結(jié)26</p><p>  5系統(tǒng)測試及成果展示27</p

16、><p>  5.1 測試流程27</p><p>  5.2 功能測試27</p><p>  5.2.1 界面功能測試27</p><p>  5.2.2 輸入功能測試27</p><p>  5.2.3 游戲功能測試27</p><p>  5.3 成果展示28</p>

17、<p><b>  5.4 總結(jié)31</b></p><p><b>  參考文獻(xiàn)32</b></p><p><b>  致 謝33</b></p><p><b>  1 概述</b></p><p><b>  1.1

18、 開發(fā)背景</b></p><p>  游戲軟件是當(dāng)今世界發(fā)展最迅速,最有影響力,最有潛力與活力的領(lǐng)域之一?游戲軟件深受廣大青年人喜愛,而且在發(fā)達(dá)國家中老年人也有大部分喜歡游戲的,因此游戲軟件在很大程度上給予絕大部分人精神上的娛樂?第二次世界大戰(zhàn)以后,電子計算機(jī)技術(shù)得到了突飛猛進(jìn)的發(fā)展?先是由晶體管代替了笨重的真空管,后來出現(xiàn)了集成電路和大規(guī)模集成電路,使電子子計算機(jī)一代一代實現(xiàn)更新,同時軟件技術(shù)也發(fā)

19、展迅速?在美國,集中了許多計算機(jī)軟件的設(shè)計人才,他們工作之余,時常喜愛編一種能與人斗智的“游戲”,以此來鍛煉編程的能力?這種“游戲”花樣繁多,但其特點都是利用計算機(jī)軟件事先設(shè)計好的“分析”?“判斷”能力反過來與人較量?由于不斷修改更新,使計算機(jī)的“智力”水平與人難分高低?到了90年代,游戲軟件已經(jīng)為世界各國的人使用,BLACKISLAND和Blizzard.這兩個強(qiáng)大的游戲制作組起到了巨大的帶動作用,還有中國的洛河工作室在國內(nèi)也起到了巨

20、大作用,他們讓很多很多人喜歡上了游戲軟件,打開了這個市場。如今游戲軟件產(chǎn)業(yè)已經(jīng)受到了廣泛的關(guān)注,它年輕有潛力而且吸引人,讓人們?nèi)找尕S富的生活需求得以滿足。</p><p>  五子棋游戲更是吸引著不同年齡段的人群,無論男女老少都可以玩,都喜歡玩,而當(dāng)前微型計算機(jī)已經(jīng)是在廣大人群中流行著,用電腦來下五子棋更是一種時尚。五子棋相傳起源于四千多年前的堯帝時期,比圍棋的歷史還要悠久,可能早在“堯造圍棋”之前,民間就已有五

21、子棋游戲。有關(guān)早期五子棋的文史資料與圍棋有相似之處,因為古代五子棋的棋具與圍棋是完全相同的。在上古的神話傳說中有“女媧造人,伏羲做棋”一說,《增山海經(jīng)》中記載:“休輿之山有石焉,名曰帝臺之棋,五色而文狀鶉卵。”李善注引三國魏邯鄲淳《藝經(jīng)》中曰:“棋局,縱橫各十七道,合二百八十九道,白黑棋子,各一百五十枚”??梢?,五子棋頗有淵源。亦有傳說,五子棋最初流行于少數(shù)民族地區(qū),以后漸漸演變成圍棋并在炎黃子孫后代中遍及開來,可以說五子棋是我們的國粹

22、之一了。而當(dāng)前五子棋程序的發(fā)展也非??欤瑥淖畛醯碾p人發(fā)展到人機(jī)(有AI),然后到現(xiàn)在的網(wǎng)絡(luò)對戰(zhàn),已經(jīng)受到越來越多人的喜愛和重視。</p><p>  1.2 開發(fā)目的和意義</p><p>  隨著游戲行業(yè)正在逐漸成熟并多遠(yuǎn)化,前途一片光明,Linux操作系統(tǒng)圖形化界面的出現(xiàn),其使用越來越廣泛,然而,Linux環(huán)境下的游戲處于一種缺乏狀態(tài),當(dāng)你在Linux下工作的時候,休息期間玩一下游戲也

23、是一種放松的方式,在Linux環(huán)境下開發(fā)游戲(以經(jīng)典的五子棋為例)有其重要的經(jīng)濟(jì)價值和戰(zhàn)略意義,也可以借此課題對自己所學(xué)的知識進(jìn)行一次綜合的運(yùn)用和拓展,加強(qiáng)自己的專業(yè)知識水平和綜合運(yùn)用能力以及動手能力。</p><p>  在人機(jī)智能方面其中戰(zhàn)勝過國際象棋世界冠軍-卡斯帕羅夫的“深藍(lán)”便是最具說服力的代表;其它像圍棋的“手淡”、象棋的“將族”等也以其優(yōu)秀的人工智能深受棋迷喜愛;本系統(tǒng)注重人機(jī)對弈和網(wǎng)絡(luò)對戰(zhàn)功能的開

24、發(fā),人機(jī)對弈只有一個通用等級,未作詳細(xì)分化,網(wǎng)絡(luò)對戰(zhàn),借助SOCKET建立連接,進(jìn)行網(wǎng)絡(luò)傳輸,實時顯示,并有比較簡單的界面系統(tǒng),簡單而使用,完備又不奢華。</p><p><b>  1.3 開發(fā)目標(biāo)</b></p><p>  基于Ncurses庫的Linux環(huán)境下五子棋游戲的設(shè)計與實現(xiàn),使五子棋游戲的人人對戰(zhàn)、人機(jī)對戰(zhàn)和網(wǎng)絡(luò)對戰(zhàn)組合在一起。為此,我設(shè)計是會做如下工

25、作:</p><p> ?。?) Ncurses庫的使用,使用Ncurses字符終端圖形化處理的功能,實現(xiàn)界面的繪制(包括棋盤的繪制、光標(biāo)的繪制、菜單的繪制、文字的顯示等圖形化實現(xiàn)功能);</p><p> ?。?) 鏈表棧的實現(xiàn),棧的創(chuàng)建、入棧、出棧與棧的銷毀,棧用于記錄落子的情況(包括顏色與位置);</p><p> ?。?) 判斷勝負(fù)算法的實現(xiàn);</p&

26、gt;<p> ?。?) 人機(jī)對戰(zhàn)算法的實現(xiàn);</p><p> ?。?) 網(wǎng)絡(luò)編程,采用TCP的傳輸方式,用于網(wǎng)絡(luò)對戰(zhàn)的實現(xiàn)。</p><p><b>  2程序的介紹與規(guī)劃</b></p><p><b>  2.1程序設(shè)計</b></p><p>  本程序設(shè)計為人與人對弈,一方

27、執(zhí)黑棋,一方執(zhí)白棋,輪流走棋,每方都試圖在游戲結(jié)束前讓自己的棋子五子相連,首先實現(xiàn)五子相連的一方獲勝。程序執(zhí)行過程中,要求棋盤、棋子時時可見,并且人可以通過按鍵盤按鍵移動光標(biāo),擺放棋子。本系統(tǒng)在Linux環(huán)境下,運(yùn)用C語言知識進(jìn)行系統(tǒng)的編碼,主要實現(xiàn)三大功能模塊,人人對戰(zhàn)模塊、人機(jī)對戰(zhàn)模塊和網(wǎng)絡(luò)對戰(zhàn)模塊。用菜單的功能和按鍵獲取進(jìn)行選擇需要進(jìn)入的游戲模塊。</p><p>  2.2程序的基本功能</p>

28、;<p>  顯示一個十三行十四列的圍棋棋盤。</p><p>  在棋盤上面在對應(yīng)位置通過點擊鼠標(biāo)下子,棋盤上將在相應(yīng)的位置上顯示棋子,并且棋子在橫縱交點上。</p><p>  可以自動判斷游戲是否結(jié)束,是否黑方或者是白方已經(jīng)勝利。</p><p>  在游戲棋盤上方會有一個游戲信息,這個游戲信息是用來提示當(dāng)前是黑白雙方的哪一方下子,玩家可以根據(jù)這

29、個提示來相應(yīng)的下棋,而不會導(dǎo)致不清楚輪到哪一方下棋。</p><p>  具有悔棋功能,在下棋時可以悔棋。</p><p>  主要的模塊功能:人人對戰(zhàn),人機(jī)對戰(zhàn),網(wǎng)絡(luò)對戰(zhàn)。</p><p>  2.3程序的實現(xiàn)目的</p><p>  五子棋游戲程序所要實現(xiàn)的目的是讓我們可以在電腦上下棋,而不需要去買,可以隨時玩,方便快捷。而且能更好的推廣

30、五子棋于世界各地,此軟件也在于提供給愛好五子棋的人,也吸引更多的人喜歡上五子棋,也具有很大很大的商業(yè)價值。使五子棋游戲程序在以后的制作中功能越來越強(qiáng)大,外觀越來越好看。</p><p>  3程序分析與總體設(shè)計</p><p>  3.1 程序需求分析</p><p>  3.1.1 用戶需求分析</p><p>  通過程序功能的分析,根據(jù)

31、五子棋愛好者的需求,得出以下需求信息:</p><p>  具有基本開始功能;;</p><p>  具有提示該輪到哪一方下棋的功能;</p><p><b>  退出游戲功能;</b></p><p><b>  判斷勝負(fù)功能;</b></p><p><b> 

32、 網(wǎng)絡(luò)對戰(zhàn)功能;</b></p><p><b>  悔棋功能;</b></p><p><b>  人機(jī)對戰(zhàn)功能;</b></p><p><b>  保存游戲功能。</b></p><p>  3.1.2 功能需求分析</p><p> 

33、 程序的基本功能需求分析如下:</p><p> ?。?) 游戲進(jìn)入界面的菜單選擇,有人人對戰(zhàn)、人機(jī)對戰(zhàn)、創(chuàng)建主機(jī)和加入戰(zhàn)網(wǎng),繼續(xù)游戲,退出六個選項,如圖3.1.3.1;</p><p>  圖3.1.3.1 主界面菜單</p><p> ?。?) 進(jìn)入游戲之后,顯示一個十三行十四列的五子棋的棋盤(如圖3.1.3.2)。用鍵盤的按鍵來控制,棋局重現(xiàn)功能是在某方勝利

34、之后才能手動操作一步步查看并回顧雙方下棋的過程;上級菜單功能可以使五子棋游戲退出當(dāng)前的游戲模塊,回到游戲開始界面時候的菜單,進(jìn)行重新選擇;退出游戲是退出整個游戲界面(如圖3.1.3.3);</p><p>  圖3.1.3.2 棋盤樣式</p><p>  圖3.1.3.3 重現(xiàn)棋局操作</p><p> ?。?) 棋盤上顯示繪制的光標(biāo),可以通過鍵盤上的

35、字母WASD對光標(biāo)進(jìn)行上下左右的移動操作。</p><p> ?。?) 在上面棋盤將光標(biāo)移動到上面對應(yīng)的位置,可以落子,棋盤上將在光標(biāo)顯示處出現(xiàn)相應(yīng)的棋子,并且棋子在橫縱交點處;</p><p> ?。?) 人人對戰(zhàn)的過程中有悔棋的功能;</p><p>  (6) 游戲的過程中會有提示信息,如該哪一方落子,棋盤旁邊顯示相應(yīng)按鍵對應(yīng)的操作列表;</p>

36、<p> ?。?) 可以自動判斷勝負(fù),勝利一方形成一列的五個或5個以上的棋子閃爍數(shù)次,顯示是黑方或者白方已經(jīng)勝利的字樣,并且停止落子的功能;</p><p> ?。?) 能夠?qū)崿F(xiàn)三種游戲模式,人人對戰(zhàn)、人機(jī)對戰(zhàn)和網(wǎng)絡(luò)對戰(zhàn)。</p><p>  3.1.3 程序穩(wěn)定性分析</p><p>  程序穩(wěn)定性需求如下:</p><p> 

37、?。?) 在程序運(yùn)行時程序不能崩潰,更不能造成系統(tǒng)崩潰;</p><p> ?。?) 游戲運(yùn)行速度不能太慢,要反應(yīng)及時。</p><p>  3.2程序總體方案的設(shè)計</p><p>  軟件的總體架構(gòu)如圖3.2.1:</p><p>  圖3.2.1 總體架構(gòu)</p><p>  考慮到整個的下棋過程(無論對方是電

38、腦抑或其他網(wǎng)絡(luò)玩家)可以分為:己方落子、等待對方落子、對方落子、設(shè)置己方棋盤數(shù)據(jù)這一系列過程。本系統(tǒng)在Linux環(huán)境下,運(yùn)用C語言知識進(jìn)行系統(tǒng)的編碼,主要實現(xiàn)三大功能模塊,人人對戰(zhàn)模塊、人機(jī)對戰(zhàn)模塊和網(wǎng)絡(luò)對戰(zhàn)模塊。用菜單的功能和按鍵獲取進(jìn)行選擇需要進(jìn)入的游戲模塊。</p><p>  3.2.1 各個功能的簡要說明</p><p>  繪制十三行十四列的棋盤,每行每列的距離都是一樣的。&l

39、t;/p><p>  棋盤上面落子:點擊鼠標(biāo)以后,會在相應(yīng)位置落下棋子,并被繪制出來,黑子是一個實心的黑圓,白子是一個實心的白圓加上一個等大空心的黑圓。</p><p>  黑白雙方輪流落子:黑方落子以后就要輪到白方,交替進(jìn)行,這是下棋的基本要求,因此我們就要弄一個互斥事件進(jìn)去,讓他們交替的落子。不能落在相同位置:當(dāng)我們落子時,會不小心落到相同位置上去,那么就要出現(xiàn)提示,不能落在相同位置上,需

40、要重新落子,實現(xiàn)的設(shè)想是當(dāng)這個點已經(jīng)繪制過棋子以后,我們就要給一個布爾變量,讓它為假,那么只能在它為真時才能繪制棋子,否則就要重新落子到別的地方去。</p><p>  判斷輸贏:當(dāng)五個相同顏色子都連在了一起的時候,我們就要判其為贏,這五個子可以在橫豎方向上連起,也可以在斜方向上連起。</p><p>  游戲信息:我們應(yīng)該在棋盤的上面設(shè)置一個游戲信息的,用來提示當(dāng)前輪到哪一方下棋了,以便

41、于玩家知道誰在下,這個功能只要在黑白雙方輪流下棋功能的過程中添加一個提示信息用于顯示到界面上的就可以了。</p><p>  3.3 程序開發(fā)方法與開發(fā)平臺</p><p>  3.3.1 開發(fā)方法</p><p>  對于本系統(tǒng)的研究方法,通過查閱資料以及指導(dǎo)老師師尋求幫助等方法解決技術(shù)上的問題,具體邏輯上的一些東西需要自己仔細(xì)思考,并動手實現(xiàn)。</p&g

42、t;<p><b>  具體步驟為:</b></p><p>  第一步,熟悉五子棋游戲規(guī)則,對系統(tǒng)做可行行分析,同時結(jié)合本次畢業(yè)設(shè)計的相關(guān)要求進(jìn)行系統(tǒng)的分析與概要設(shè)計;</p><p>  第二步,簡要概述系統(tǒng)的配置,并且對系統(tǒng)進(jìn)行詳細(xì)設(shè)計,實現(xiàn)相關(guān)解決問題的算法;</p><p>  第三步,運(yùn)用以前所學(xué)的知識,選擇C語言在L

43、inux環(huán)境下調(diào)用Ncurses庫進(jìn)行開發(fā),進(jìn)行軟件編碼,實現(xiàn)其各項基本功能;</p><p>  第四,系統(tǒng)開發(fā)完畢后,進(jìn)行調(diào)試、運(yùn)行和代碼優(yōu)化;</p><p>  第五步,對前期的學(xué)習(xí)和工作進(jìn)行全面的思考、分析、歸納和總結(jié),完成本論文的撰寫工作。</p><p>  3.3.2 開發(fā)平臺 </p><p>  本系統(tǒng)開發(fā)所需要的開發(fā)平臺

44、如下所示:</p><p> ?。?) 中央處理器:雙核2.1GHz;</p><p> ?。?) 內(nèi)存:2G;</p><p> ?。?) 硬盤:320G;</p><p> ?。?) 操作系統(tǒng):Linux(fodera14);</p><p> ?。?) 開發(fā)工具:Linux環(huán)境下vim,gedit等;</p

45、><p> ?。?) 編程語言:C語言</p><p> ?。?) 運(yùn)行環(huán)境:Linux環(huán)境(含Ncurses庫)下的終端 </p><p><b>  3.4 本章小結(jié)</b></p><p>  本章是此項目簡單的概要性闡述,進(jìn)行功能和用戶需求分析,開發(fā)平臺和開發(fā)方法的介紹,確定了整體的功能模塊,為下一章的詳細(xì)設(shè)計做準(zhǔn)

46、備。</p><p>  4程序設(shè)計與算法實現(xiàn)</p><p><b>  4.1數(shù)據(jù)模塊</b></p><p>  4.1.1 數(shù)據(jù)結(jié)構(gòu)</p><p>  (1) 顏色的定義(枚舉類型)</p><p>  //定義顏色,用來設(shè)置棋盤背景的顏色</p><p>  /

47、/采用枚舉來定義顏色</p><p>  typedef enum{GCBlack,GCRed,GCGreen,GCYellow,GCBlue,GCMagenta,GCCyan,GCWhite,GCCount}GRAPHICS_COLOR;</p><p>  (2) 鏈表節(jié)點,記錄雙方落子的情況,用同一條鏈表式棧存儲雙方落子情況,落子時入棧,悔棋時出棧。</p><p

48、><b>  //定義棋子的結(jié)構(gòu)</b></p><p>  typedef struct qizi</p><p><b>  {</b></p><p>  int qx;//棋子在棋盤上的橫向位置</p><p>  int qy;//棋子在棋盤上的縱向位置</p>

49、;<p>  int qflag;//flag表示棋子的種類,0表示白旗,1表示黑棋</p><p>  struct qizi * next;</p><p>  } LinkQZ; </p><p>  (3) 定義棋子坐標(biāo)信息的結(jié)構(gòu)體(人機(jī)對戰(zhàn)時,根據(jù)這些信息分析出電腦下棋的坐標(biāo)點)</p><p>  typed

50、ef struct point//坐標(biāo)信息</p><p><b>  {</b></p><p>  int x;//記錄橫坐標(biāo)</p><p>  int y;//記錄縱坐標(biāo)</p><p>  int quan;//設(shè)置權(quán)值,當(dāng)max相等時,可比較權(quán)值</p><p&g

51、t;  int cc3;//電腦:設(shè)置當(dāng)前坐標(biāo)“沖3”和“沖4”的可能性,1為可能,0為不可能</p><p>  int cc4;//表示沖4</p><p>  int pc3;//人:設(shè)置當(dāng)前坐標(biāo)“沖3”和“沖4”的可能性,1為可能,0為不可能</p><p>  int pc4;//表示沖4</p><p> 

52、 int c[4];//記錄電腦的四個方向上的相同棋子的個數(shù)</p><p>  int p[4];//記錄人的四個方向上的相同棋子的個數(shù)</p><p><b>  } Point;</b></p><p>  (4) 繪制期盼所使用的圖像如下定義(源于office中的工具圖標(biāo)):</p><p>  //

53、使用┏ ┗ ┓ ┛ ┳ ┻ ┣ ┫ ╋ ━ ┃畫棋盤,也可以自己找另外的符號</p><p>  //使用 "● "來表示棋子</p><p>  #define CHESS "● "</p><p>  4.1.2 數(shù)據(jù)定義</p><p>  程序涉及到的相關(guān)的全局變量的定義如下:</p>

54、;<p>  static LinkQZ * top = NULL; //人人對戰(zhàn) //棧用來存放棋子下棋的行徑的坐標(biāo)以及棋子的顏色</p><p>  static int b[10][2] = {0};//人人對戰(zhàn) //數(shù)組用來存放勝利時的五zi的坐標(biāo)</p><p>  static int (*p)[2] = b;//指針p來操作上述數(shù)組</p>

55、<p>  static Point inf[182];//人機(jī)對戰(zhàn) 坐標(biāo)的詳細(xì)信息</p><p><b>  4.2 界面模塊</b></p><p>  本程序所使用的是ncurse終端圖形庫來繪制圖形的。</p><p>  Ncurses是一個能提供功能鍵定義(快捷鍵),屏幕繪制以及基于文本終端的圖形互動功能的動態(tài)庫。&

56、lt;/p><p>  Ncurses是一個能提供基于文本終端窗口功能的動態(tài)庫。Ncurses可以在任何遵循ANSI/POSIX標(biāo)準(zhǔn)的UNIX系統(tǒng)上運(yùn)行,除此之外,它還可以從系統(tǒng)數(shù)據(jù)庫中檢測終端的屬性, 并且自動進(jìn)行調(diào)整,提供一個不受終端約束的接口。因此,Ncurses可以在不同的系統(tǒng)平臺和不同的終端上工作的非常好。</p><p>  程序相關(guān)數(shù)據(jù)定義如下:</p><p

57、>  WINDOW* g_win=NULL;//定義終端指針,用來操作終端的屬性的設(shè)置,初始化為空</p><p>  GRAPHICS_COLOR g_fore_color;//定義終端的前景色</p><p>  GRAPHICS_COLOR g_back_color;//定義終端的背景色</p><p>  4.2.1 界面設(shè)計——

58、創(chuàng)建棋盤</p><p>  主要使用┏ ┗ ┓ ┛ ┳ ┻ ┣ ┫ ╋ ━ ┃這些符號畫棋盤,其核心思想為:</p><p>  For循環(huán)的恰當(dāng)利用.先用外層循環(huán)畫出外圍的整個方框,然后再找出內(nèi)層的規(guī)律,從每一行開始繪制出每一列,再從下一行開始繪制,循環(huán)繪制即可。函數(shù)說明如下</p><p>  Void qipan(void)//畫棋盤</p>

59、<p><b>  核心代碼如下:</b></p><p>  for (i = 2; i <= 26; i=i+2)//兩個for循環(huán)控制著的行的輸入</p><p><b>  {</b></p><p>  for (j = 11; j <= 63; j=j+2)</p>

60、<p><b>  {</b></p><p>  if (i == 2)//當(dāng)為第一行時,控制第一行的圖形的格式</p><p><b>  {</b></p><p>  if (j == 11)//第一行的第一個元素的樣式</p><p>  mvaddstr(i, j,

61、"┏");</p><p>  else if (j == 63)//第一行的最后一個元素的樣式</p><p><b>  {</b></p><p>  mvaddstr(i, j, "┓");</p><p><b>  }</b></p>

62、<p><b>  else</b></p><p><b>  {</b></p><p><b>  if (flag)</b></p><p><b>  {</b></p><p>  mvaddstr(i, j, "━&q

63、uot;);</p><p><b>  flag = 0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  mvaddst

64、r(i, j, "┳");</p><p><b>  flag = 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><

65、p>  else if (i == 26)//當(dāng)為最后一行時,控制最后一行的格式的輸入</p><p><b>  {</b></p><p>  if (j == 11)//最后一行第一個元素的樣式</p><p>  mvaddstr(i, j, "┗");</p><p>  el

66、se if (j == 63)//最后一行最后一個元素的樣式</p><p><b>  {</b></p><p>  mvaddstr(i, j, "┛");</p><p><b>  }</b></p><p><b>  else</b><

67、;/p><p><b>  {</b></p><p><b>  if (temp)</b></p><p><b>  {</b></p><p>  mvaddstr(i, j, "━");</p><p><b>  t

68、emp = 0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  mvaddstr(i, j, "┻");</p><

69、p><b>  temp = 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p>

70、;<p><b>  {</b></p><p>  if (j == 11)//其他行的第一列的元素的樣式</p><p>  mvaddstr(i, j, "┣");</p><p>  else if (j == 63)//其他行的最后一列的元素的樣式</p><p>&l

71、t;b>  {</b></p><p>  mvaddstr(i, j, "┫");</p><p><b>  k = 1;</b></p><p><b>  }</b></p><p><b>  else</b></p>

72、<p><b>  {</b></p><p><b>  if (k)</b></p><p><b>  {</b></p><p>  mvaddstr(i, j, "━");</p><p><b>  k = 0;</

73、b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  mvaddstr(i, j, "╋");</p><p><b>

74、;  k = 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

75、t;  }</b></p><p>  4.2.2 界面設(shè)計——創(chuàng)建菜單</p><p>  本程序主要涉及到了兩個菜單的設(shè)計,分別為:</p><p>  主菜單,下棋完成后的子菜單界面。</p><p><b>  1.主菜單界面</b></p><p>  Void menu(v

76、oid);//主菜單</p><p>  核心代碼:mvaddstr(12, 30, "1.人人對戰(zhàn)");</p><p>  attroff(A_REVERSE); //關(guān)閉屬性</p><p>  mvaddstr(13, 30, "2.人機(jī)對戰(zhàn)");</p><p>  mvaddstr(

77、14, 30, "3.創(chuàng)建主機(jī)");</p><p>  mvaddstr(15, 30, "4.加入戰(zhàn)網(wǎng)");</p><p>  mvaddstr(16, 30, "退出);</p><p>  實現(xiàn)該功能比較簡單,只要在終端窗口上畫出主菜單即可。</p><p>  主要用到了c

78、urses庫中的mvaddstr函數(shù),畫出主菜單。</p><p>  2.下棋完成后的子菜單界面</p><p>  void zimenu(int flag)//子菜單,棋局完了后的菜單</p><p>  參數(shù)flag表示下棋的種類(人人用0表示,人機(jī)用1表示),這里是人人對戰(zhàn)的情況。其實現(xiàn)功能比較簡單,只要畫出界面,然后相關(guān)函數(shù)即可,這里就不再描述。其部分

79、代碼如下:</p><p>  mvaddstr(12, 30, "1.重現(xiàn)棋局");</p><p>  mvaddstr(13, 30, "2.再完一次");</p><p>  mvaddstr(14, 30, "3.主菜單");</p><p>  mvaddst

80、r(15, 30, "4.退出游戲");</p><p>  wrefresh(g_win);//刷新窗口,顯示窗口的最新變化</p><p>  if (ch == '\r' && x == 13)//如果選擇再完一次,開始游戲</p><p><b>  {</b></p>

81、;<p><b>  endwin();</b></p><p><b>  if (flag)</b></p><p><b>  {</b></p><p>  renjiStart();</p><p><b>  }</b></

82、p><p>  renrenStart();</p><p><b>  break;</b></p><p><b>  }</b></p><p>  4.2.3 相關(guān)功能函數(shù)</p><p>  與圖形繪制操作相關(guān)的函數(shù)說明如下:</p><p> 

83、?。?)init_graphics //窗體初始化函數(shù)</p><p>  該函數(shù)功能如下為:設(shè)置本地化,以使輸入的字符不會是亂碼;窗體初始化,返回窗體指針;如果當(dāng)前終端有顯示顏色的能力,則初始化顏色,給定義了的每種顏色分配一個ID;隱藏鼠標(biāo);設(shè)置前景色和背景色;清屏。</p><p><b>  函數(shù)核心代碼如下:</b></p><p> 

84、 //初始化終端窗體函數(shù),返回true(初始化成功),返回false(初始化失?。?lt;/p><p>  bool init_graphics(void)</p><p><b>  {</b></p><p>  setlocale(LC_ALL,"");//設(shè)置本地化,輸入的字符不會是亂碼</p><

85、;p>  g_win=initscr();//初始化一個窗體,返回一個指針</p><p>  if(NULL==g_win)</p><p><b>  {</b></p><p>  printf("call initscr() failed!\n");</p><p>  retu

86、rn false;//返回false,表示初始化終端設(shè)置失敗</p><p><b>  }</b></p><p>  cbreak();//調(diào)用cbreak函數(shù)后,除了"Del"和"Ctrl"鍵外,接受其他所有字符輸入。</p><p>  noecho();//關(guān)閉輸入回顯功能,輸入的

87、字元不顯示在終端上</p><p>  if(has_colors())//判斷當(dāng)前的終端有沒有顯示顏色的能力</p><p><b>  {</b></p><p>  int i,j,k;</p><p>  start_color();//啟動彩色機(jī)制</p><p>  for(

88、i=0,k=0;i<GCCount;i++)</p><p><b>  {</b></p><p>  for(j=0;j<GCCount;j++)</p><p>  init_pair(++k,i,j);//初始化顏色,給每個顏色分配一個ID</p><p><b>  }</b>

89、;</p><p><b>  }</b></p><p>  curs_set(0);//隱藏鼠標(biāo)</p><p>  //g_fore_color=GCBlack;//設(shè)置前景色</p><p>  //g_back_color=GCBlue;//設(shè)置背景色</p><p&

90、gt;  //clear_screen(0,0,COLS,LINES);//COLS,LINES是庫函數(shù)中的宏</p><p>  //mvaddstr(14, 60, CHESS);//在坐標(biāo)14,60顯示字符串CHESS</p><p>  //wrefresh(g_win);//刷新窗口,顯示窗口的最新變化</p><p>  //改變屏幕內(nèi)容

91、時,后面一定要跟上這條語句</p><p>  return true;//返回true,表示初始化終端設(shè)置成功</p><p><b>  }</b></p><p> ?。?)清屏處理函數(shù)--clear_screen</p><p>  對整個窗口進(jìn)行清理處理,可理解為窗口的局部區(qū)域的刷新。</p&g

92、t;<p>  //清屏函數(shù),形參為:清屏的初始坐標(biāo)x,y;結(jié)束坐標(biāo)w,h</p><p>  void clear_screen(int x,int y,int w,int h)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p&

93、gt;  wattrset(g_win,CURRENT_ATTRIBUTE);//更新前景色和背景色</p><p>  for(i=0;i<h;i++)</p><p><b>  {</b></p><p>  wmove(g_win,i+y,x);//移動光標(biāo),i+y縱坐標(biāo),x橫坐標(biāo)</p><p>

94、;  for(j=0;j<w;j++)</p><p>  waddch(g_win,' ');//在光標(biāo)當(dāng)前的位子打入空格</p><p><b>  }</b></p><p>  wrefresh(g_win);//刷新窗口,顯示窗口的最新變化</p><p><b> 

95、 } </b></p><p> ?。?) 繪制光標(biāo)函數(shù)-- guangbiao</p><p>  //光標(biāo)的樣式,用來繪制下棋的光標(biāo)的樣式</p><p>  void guangbiao(int x, int y)//參數(shù)x,y分別表示棋盤上的某個坐標(biāo)點</p><p><b>  {</b><

96、;/p><p>  mvaddstr(x-1, y-2, "┏");//以光標(biāo)所在點四周建立樣式</p><p>  mvaddstr(x-1, y+2, "┓");</p><p>  mvaddstr(x+1, y-2, "┗");</p><p>  mvaddstr(x+1,

97、 y+2, "┛");</p><p>  wrefresh(g_win);</p><p><b>  }</b></p><p> ?。?)光標(biāo)清除函數(shù)——qingchuGB</p><p>  光標(biāo)移動后,清除遺留的光標(biāo)的樣式</p><p>  void qingchu

98、GB(int x, int y)//參數(shù)x,y分別表示光標(biāo)移動之前的坐標(biāo)點</p><p><b>  {</b></p><p>  mvaddstr(x-1, y-2, " ");//把在之前建立的樣式全部清空即可</p><p>  mvaddstr(x-1, y+2, " ");</p

99、><p>  mvaddstr(x+1, y-2, " ");</p><p>  mvaddstr(x+1, y+2, " ");</p><p>  wrefresh(g_win);</p><p><b>  }</b></p><p>  (6)棋盤刷新

100、函數(shù)—fuwei</p><p><b>  功能如下:</b></p><p>  刪除之前的光標(biāo);根據(jù)移動的方向修改光標(biāo)的坐標(biāo)值,一次移動一格,由上下左右按鍵來控制;在棋盤上面根據(jù)光標(biāo)的坐標(biāo)值畫出光標(biāo)。</p><p>  //填充棋盤函數(shù),棋盤在下棋的過程中,不斷在變化著,因此要時時的更新棋盤的信息</p><p>

101、;  void fuwei(int x, int y);</p><p>  4.3 核心功能函數(shù)模塊</p><p>  4.3.1 相關(guān)功能</p><p> ?。?)悔棋操作功能函數(shù)-- huiqi</p><p>  悔棋子的操作,即將記錄到棧中的行徑路線,一次出棧,并清空出棧的節(jié)點位置的棋子即可。</p><p&

102、gt;  int huiqi(int (*a)[100])</p><p><b>  {</b></p><p>  int x;//x,y分別用來記錄悔棋子的坐標(biāo)</p><p><b>  int y;</b></p><p>  int flag;//用來記錄旁邊

103、提示的棋子的顏色</p><p>  if (empty(top) != 1)</p><p><b>  {</b></p><p>  LinkQZ * s = readtop(top);</p><p>  x = s -> qx;</p><p>  y = s -> qy;&

104、lt;/p><p>  a[x][y] = 0;</p><p>  flag = s -> qflag;</p><p>  top = pop(top);</p><p>  g_fore_color=GCWhite;//是白旗下的話,設(shè)置前景色為白色</p><p>  wattrset(g_win,CURR

105、ENT_ATTRIBUTE);//更新前景色和背景色</p><p>  mvaddstr(x, y, " ");</p><p>  wrefresh(g_win);//刷新</p><p>  fuwei(x, y);//在該坐標(biāo)點下棋子</p><p>  wrefresh(g_win);//刷新

106、</p><p>  if (!flag)</p><p><b>  {</b></p><p>  g_fore_color=GCBlack;</p><p><b>  }</b></p><p>  wattrset(g_win,CURRENT_ATTRIBUTE);

107、//更新前景色和背景色</p><p>  mvaddstr(12, 70, CHESS);//顯示當(dāng)前所下棋子為白旗還是黑棋</p><p>  wrefresh(g_win);//刷新</p><p><b>  return 1;</b></p><p><b>  }</b><

108、;/p><p><b>  return 0;</b></p><p><b>  }</b></p><p> ?。?)輸贏的判斷函數(shù)—result</p><p>  int result(int x, int y, int (*a)[100], int flag)</p><p

109、>  x,y為當(dāng)前下棋點所在的坐標(biāo),二維數(shù)組a記錄了下棋過程中每一個下棋點的坐標(biāo)的詳細(xì)信息(包括坐標(biāo)信息,棋種信息),flag為標(biāo)志位,用來判斷是白旗還是黑棋(2表示黑棋,1表示白旗)。獲勝的標(biāo)準(zhǔn)為:無論哪一方,只要在水平,垂直,斜線方向有連續(xù)的五個相同的棋子,即代表游戲結(jié)束,獲得勝利。如果棋盤下滿后,仍為判斷出輸贏,則該局為平棋。其核心思想為:從當(dāng)前所在點的坐標(biāo)的四個方向找起,看是否找到獲勝的標(biāo)準(zhǔn),主要是for循環(huán)的應(yīng)用。<

110、;/p><p> ?。?)五子閃爍函數(shù)——wuzishansuo</p><p>  下棋贏的時候,棋子閃爍的樣式函數(shù)</p><p>  void wuzishansuo(int (*p)[2], int f)//五子閃爍</p><p>  二維數(shù)組p記錄了獲勝時的五個棋子的坐標(biāo),f為標(biāo)志位,1表示白旗,2表示黑棋。讓棋子閃爍的思想就是:

111、不斷的清除棋子,然后重現(xiàn)棋子即可。其核心代碼如下:</p><p>  while (j >= 0)</p><p><b>  {</b></p><p><b>  if (flag)</b></p><p><b>  {</b></p><p&

112、gt;  for (i = 0; i < 6; i++)</p><p><b>  {</b></p><p>  mvaddstr(p[i][0], p[i][1], " ");</p><p>  wrefresh(g_win);//刷新</p><p>  fuwei(p[i][

113、0], p[i][1]);//在該坐標(biāo)點下棋pan</p><p><b>  }</b></p><p><b>  flag = 0;</b></p><p><b>  }</b></p><p><b>  else</b></p>

114、<p><b>  {</b></p><p>  for (i = 0; i < 6; i++)</p><p><b>  {</b></p><p>  mvaddstr(p[i][0], p[i][1], CHESS);//在該坐標(biāo)點下棋子</p><p><b&

115、gt;  }</b></p><p><b>  flag = 1;</b></p><p><b>  }</b></p><p>  wrefresh(g_win);</p><p>  usleep(150000);</p><p><b>  j

116、--;</b></p><p>  (4)棋局重現(xiàn)函數(shù)——CXqiju</p><p>  void CXqiju(void)//棋局重現(xiàn)</p><p>  重現(xiàn)棋局的操作與悔棋的操作有點類似,不過重現(xiàn)棋局是用到了隊列的操作,即將記錄的下棋的路徑操作進(jìn)行入隊,重現(xiàn)棋局子還要將隊列進(jìn)行出隊操作即可。但在這里,我是用之前在悔棋操作定義的全局變量

117、top棧實現(xiàn)了隊列的操作。其核心代碼如下:</p><p>  LinkQZ * qz = NULL;</p><p>  qz = readtop(top1);</p><p>  x = qz -> qx;</p><p>  y = qz -> qy;</p><p>  flag = qz ->

118、; qflag;</p><p>  top1 = pop(top1);</p><p>  g_fore_color=GCWhite;//是白旗下的話,設(shè)置前景色為白色</p><p>  if (flag)//如果為黑棋的話,設(shè)置前景色為黑色</p><p><b>  {</b></p>

119、<p>  g_fore_color=GCBlack;</p><p><b>  }</b></p><p>  wattrset(g_win,CURRENT_ATTRIBUTE);//更新前景色和背景色</p><p>  mvaddstr(12, 70, CHESS);//顯示當(dāng)前所下棋子為白旗還是黑棋</p&g

120、t;<p>  mvaddstr(x, y, CHESS);//在該坐標(biāo)點下棋子</p><p>  wrefresh(g_win);//刷新</p><p>  usleep(650000);</p><p>  4.4 游戲功能模塊</p><p>  4.4.1 游戲主要操作流程圖</p><

121、p>  程序主要分三個游戲模塊人人對戰(zhàn),人機(jī)對戰(zhàn),網(wǎng)絡(luò)對戰(zhàn),并將三個模塊組合在一起,經(jīng)過菜單操作,玩家可以任意選擇游戲模式,模塊之間相互轉(zhuǎn)換與運(yùn)行的流程圖如圖4.4.1.1:</p><p><b>  否</b></p><p><b>  是</b></p><p>  圖4.4.1.1 游戲主要操作流程圖<

122、;/p><p>  4.4.2 人人對戰(zhàn)模塊</p><p><b> ?。?)功能模塊說明</b></p><p>  人人對戰(zhàn)是單機(jī)下的五子棋模式,可以自己和自己下棋模擬練習(xí),也可以兩個人一起玩;</p><p>  操作的過程中,只有在黑子或者白子某一方勝出時,棋局重現(xiàn)功能能才能有效;</p><p

123、>  每落一顆子都會進(jìn)行一次判贏,如果某一方贏了,此局結(jié)束,不能再落子。</p><p><b> ?。?)流程圖</b></p><p>  進(jìn)入人人對戰(zhàn)游戲模塊后,其流程圖如圖4.4.2所示:</p><p><b>  是</b></p><p><b>  否</b&g

124、t;</p><p>  是 </p><p><b>  繼續(xù)上步</b></p><p><b>  否</b></p><p><b>  是</b></p><p>  圖4.4.2 人人對戰(zhàn)模塊流程圖</p>&l

125、t;p>  (3)人人對戰(zhàn)函數(shù)說明</p><p>  void renrenStart(void)//人人對戰(zhàn)開始</p><p>  其思想是:雙方進(jìn)行交替的下棋,直到有一方獲得獲勝為止,或者棋盤下滿,平局為止。</p><p>  4.4.3 人機(jī)對戰(zhàn)模塊</p><p><b>  (1)流程圖</b>

126、;</p><p>  人機(jī)對戰(zhàn)的功能和人人對戰(zhàn)的功能類似,少了悔棋那一項功能,只是對方不是人在下,是電腦在下棋。</p><p>  進(jìn)入人機(jī)對戰(zhàn)后,其流程如圖4.4.3.1所示:</p><p><b>  是</b></p><p><b>  否</b></p><p&g

127、t;  是 繼續(xù)上步</p><p><b>  否</b></p><p><b>  是</b></p><p>  圖4.4.3.1 人機(jī)對戰(zhàn)模塊流程圖 </p><p> ?。?)人機(jī)對戰(zhàn)的算法</

128、p><p>  人機(jī)對戰(zhàn)功能是整個項目的核心部分,在人機(jī)對戰(zhàn)的過程中,電腦會根據(jù)人工智能算法,判斷下一步最優(yōu)落子位置。最后,電腦根據(jù)棋盤上棋子的狀態(tài),判斷是否存在有五子相連的棋型,如果有則判斷輸贏??偟膩碚f,人機(jī)對戰(zhàn)的精髓在于人工智能算法的實現(xiàn),就是要讓電腦知道該在哪一點下子,這就需要根據(jù)盤面的形勢,為每一可能落子的點計算其重要程度,也就是就是當(dāng)這子落下后會形成什么棋型(例如“沖四”、“活三”等),然后通覽全盤選出最

129、重要的一點,這便是最基本的算法思想。當(dāng)然,僅依靠當(dāng)前盤面進(jìn)行判斷是遠(yuǎn)遠(yuǎn)不夠的,這樣下棋很容易掉進(jìn)對方預(yù)先設(shè)下的陷阱,因為沒有考慮以后的變化。所以在此基礎(chǔ)上可以加入遞歸調(diào)用,即在電腦中預(yù)測今后幾步的各種走法,以便作出最佳選擇。</p><p> ?。?)人機(jī)對戰(zhàn)函數(shù)說明</p><p>  a.求出棋盤上所有棋子處的信息 </p><p>  void poss(in

130、t x, int y, int (*a)[100], int flag, int n)//求出當(dāng)前棋盤所有棋子處的詳細(xì)信息(坐標(biāo),白旗數(shù)目,黑棋數(shù)目)</p><p>  x,y代表空格棋子處的坐標(biāo),二維數(shù)組a為全局變量,記錄了下棋點的信息,flag為標(biāo)志位,1表示白棋,2表示黑棋。其思想:遍歷棋盤,然后四個方向?qū)ふ?,記錄其周邊信息(黑棋子的個數(shù),白棋子的個數(shù),“沖3”“沖4”的可能性)。完成此功能主要是為了電

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論