基于Android系統(tǒng)的五子棋游戲開發(fā)與實現_第1頁
基于Android系統(tǒng)的五子棋游戲開發(fā)與實現_第2頁
基于Android系統(tǒng)的五子棋游戲開發(fā)與實現_第3頁
基于Android系統(tǒng)的五子棋游戲開發(fā)與實現_第4頁
基于Android系統(tǒng)的五子棋游戲開發(fā)與實現_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

題目基于Android系統(tǒng)的五子棋游戲開發(fā)與實現學生姓名學號所在系(院)計算機科學與技術專業(yè)名稱年級指導教師于桂玲職稱講師2013年6月10日北京郵電大學畢業(yè)設計(論文)誠信聲明本人聲明所呈交的畢業(yè)設計(論文),題目《基于Android平臺的五子棋游戲開發(fā)與實現》是本人在指導教師的指導下,獨立進行研究工作所取得的成果,除了文中特別加以標注和致謝中所羅列的內容以外,畢業(yè)設計(論文)中不包含其他人已經發(fā)表或撰寫過的研究成果,也不包含為獲得北京郵電大學或其他教育機構的學位或證書而使用過的材料。申請學位論文與資料若有不實之處,本人承擔一切相關責任。本人簽名:日期:畢業(yè)設計(論文)使用權的說明本人完全了解北京郵電大學有關保管、使用論文的規(guī)定,其中包括:①學校有權保管、并向有關部門送交學位論文的原件與復印件;②學校可以采用影印、縮印或其它復制手段復制并保存論文;③學??稍试S論文被查閱或借閱;④學校可以學術交流為目的,復制贈送和交換學位論文;⑤學??梢怨紝W位論文的全部或部分內容。本人簽名:日期:指導教師簽名:日期:北京郵電大學畢業(yè)設計(論文)PAGEI目錄1前言 11.1課題研究背景 11.2課題研究的意義和目的 41.3可行性研究 51.3.1技術可行性 51.3.2經濟可行性 61.3.3操作可行性 61.4本章小結 72需求分析與系統(tǒng)設計 82.1需求分析與創(chuàng)新意義 82.1.1系統(tǒng)的需求分析 82.1.2系統(tǒng)的創(chuàng)新與意義 82.2系統(tǒng)的功能設計 92.2.1人機對戰(zhàn) 92.2.2人人對戰(zhàn) 92.2.3關于 102.3系統(tǒng)的組成與實現原理 102.3.1系統(tǒng)組成 102.3.2系統(tǒng)實現原理 102.4本章小結 113客戶端系統(tǒng)的實現 123.1用戶進入游戲 133.2人人對戰(zhàn) 153.3人機對戰(zhàn) 203.4關于 223.5本章小結 224系統(tǒng)的測試 234.1系統(tǒng)的測試環(huán)境 234.1.1系統(tǒng)的開發(fā)環(huán)境 234.1.2系統(tǒng)運行環(huán)境 234.2系統(tǒng)功能測試 234.2.1人人對戰(zhàn)測試 244.2.2人機對戰(zhàn)測試 244.2.3關于測試 254.3本章小結 255系統(tǒng)存在問題及改進方法 265.1系統(tǒng)存在的問題 265.2系統(tǒng)改進方法 266結論 27致謝 29參考文獻 30附錄 31前言課題研究背景智能手機,和電腦是一樣的,它不依賴于任何系統(tǒng)而操作,玩家可以自行下載并且安裝軟件或者游戲等應用來不斷的擴充手機的功能,其中包括利用運營商通訊網絡來接入無線進行網絡操作。目前,細數全球范圍內多數的手機廠商都在做智能手機,例如具有代表性的蘋果、三星、HTC、小米等。我們分析智能手機具備以下五大特點:1.可以通過無線技術接入因特網,即要有GSM網絡支持下的GPRS或者是CDMA網絡支持下的CDMA1X或3G網絡。2.比較人性化,可以根據個人需求自行更改主題界面等。3.具有開放性,可以根據不同用戶的需求自行下載安裝特別多的應用程序,比如社交軟件或者游戲等,從而可以達到無限的擴充智能手機功能的效果。4.具有PDA(掌上電腦)功能,例如有文件的管理、便簽、地圖搜索、網頁瀏覽、多媒體播放、辦公軟件、應用程序管理等。5.具有很強大的功能,可以在很多的地方下載并安裝別的軟件。Android的誕生:準確的來說是在二零零三年,創(chuàng)始人AndyRubin在Android的傳奇開始之前就說過:“我們有很大的潛力來開發(fā)能夠捕捉用戶地理位置信息以及狀態(tài)的不固定的設備。如果這些設計者很有想法的話,那么在很短的時間內這些東西就會被應用到那些產品中?!爆F在看,估計創(chuàng)始人自己都不會想到他的預言是這么的準確。事實上,我們可以預見未來在移動領域將會有巨大的改變,從而催生出類似于概念機那樣新穎、獨特、超前的智能機。二零零五年的時候,有很多謠傳說Google通過專注于制造可以捕捉位置服務的手機從而進軍手機制領域,但是擺在它面前最大難題就是它并沒有實現這個愿望的可搭載的平臺。Google在二零零五年的七月收購了Android,雖然是一次小規(guī)模的收購行動,但大家懷疑這標志著Google進入了移動市場,所以還是立刻就引起了業(yè)界的大力關注。盡管是這樣,在那個時候,這個發(fā)展沒有很壯大的做軟件的公司正是由?AndyRubin、RichMiner、NickSears以及ChrisWhite四個人共同創(chuàng)建的?,F在看來,他們的疑慮是對的。差不多就在二零零七年十一月五日的時候,Google對公眾開放了Android,這個不僅僅是一個基于Linux的全新的移動操作系統(tǒng),最重要的是它完全是不保密設計代碼的,不用說,這在業(yè)內肯定會使人們震驚,做出很大的改變。這是當時新成立的開放手機聯盟整合下的成果,諸如Google、HTC、Intel、Sprint-Nextel、T-Mobile以及NVIDIA都是一個組織的成員,這個組織是為了給所有的設備建造一個共同的可使用的標準。第一款搭載Android系統(tǒng)的手機是2008年9月由T-Mobile發(fā)布的G1,它擁有GPS功能,3.1M攝像頭,以及一系列的Google應用。G1的面市,正式拉開了一場巨大變革的序幕,不僅僅是Google,更是對于整個移動業(yè)界。2009年5月發(fā)布了第一個主要版本Android1.5“Cupcake”。在對它進行升級之后,用戶界面有了很大的改善,新的版本無疑給用戶帶來了全新的體驗,并且它還增加了一些功能。Android1.6“Donut”2009年9月發(fā)布。搭載Android1.6的HTCHero獲得了意想不到的成功。不僅得到了一些從未有過的關注,讓許多客戶真正對Android產生興趣,而且更觸動了蘋果和微軟兩家競爭者的敏感神經。Android2.0/2.1:,又有一個很重要的版本在2009年10月26日完成,這次完成的速度可以說是相當快的,無與倫比。這次,大版本升級到了Android2.0/2.1“Eclair”。繼2009年12月發(fā)布的Android2.0.1SDK后,是在2010年1月發(fā)布的2.1版本。會有很多的看客甚至是用戶都會奇怪,為什么Android的系統(tǒng)版本代號會被稱作甜點,其實是在Android1.5發(fā)布出來的時候開始使用的這個命名的方法。按照字母的順序,依次是小蛋糕,甜甜圈和松餅,所以每更新一個版本就可以被想象成是對它的大小的擴充。Android2.2“FroYo”:NexusOne的用戶已經開始接受Android2.2“FroYo”的無線更新,并會在很快速的時間內使所有使用其他手機的玩家能夠使用這個新的版本。這個系統(tǒng)版本新的升級,讓很多的使用其他手機的人們很是羨慕,因為它有很好的界面,還增加了許多新的功能,玩家使用會有新的感受。有關的消息眾口一詞聲稱?Android3.0“Gingerbread”,它會讓用戶有更新穎的更獨特的體驗,并且Google估計會在今年秋天的時候將它發(fā)布出來??v觀Android的發(fā)展史,在2003年的時候,出現了特別有遠見的Andy,他的預言得到了證實,2005年經歷了正式起步以及被Google收購。一路以來,系統(tǒng)一直在進步,并且新的機型也一直在快速的發(fā)布。通過這一切,我們有理由相信,Android很有可能會成為手機系統(tǒng)同行業(yè)內的最優(yōu)秀的,這樣的勢頭,不容易被改變。Android平板電腦也在今年的夏天開始發(fā)布以及GoogleTV發(fā)布以后(也許還有GoogleMusic),Android有很大的可能讓我們領會未來手機的發(fā)展趨勢,讓我們具有不一樣的體驗[10]。Android平臺對比其他的平臺有很多的有點。首先分析Symbian,主要是在諾基亞手機上運行,雖然說已經發(fā)展的很成熟,但是它在理念上與我們平時經常用的系統(tǒng)還是有很大的差別,整個感覺上還是偏向于以前舊一點的設計。重要的是它對互聯網并沒有連接的特別好,不能夠讓用戶體驗到特別滿意的聯網速度,在這樣一個信息化時代就顯得沒有競爭力。但是Android不同,它最主要最關注的就是對于聯網這一塊兒,不管是軟件還是硬件的設計,都是在主要突出互聯網的重要,正好是彌補了Symbian最大的不足。這樣,就會讓用戶更好更舒適的感受信息化時代,所以更容易贏得用戶的喜愛,得到廣大用戶的接受與認可。還有就是現在比較流行的ios,雖然它有很完整的應用,可以給用戶帶來很多很豐富的體驗,但是它只是相對于蘋果用戶而言,并不可以針對多數的手機用戶。但是Android同樣不同于ios,它是完全開放的,這樣更多的開發(fā)者可以為其設計多種多樣不同的應用,繼而迎來越來越多的開發(fā)創(chuàng)意,進而豐富其應用領域。而且,它具有一定的標準,各種不同的平臺都可以兼容使用,所以完全可以植于好多的手機品牌上,這樣更有利于它的推廣,讓更多的用戶熟知。總的來說,現在流行的系統(tǒng)中,從不同的方面都可以看出Android系統(tǒng)相比其他系統(tǒng)的優(yōu)勢,可以說它擁有很多手機用戶的支持者[2]。所以完全可以這樣說,隨著人們對移動設備的要求變得越來越高,那就必須有能夠逐漸滿足這樣一個高要求的開發(fā)平臺,那么Android就是在這樣的環(huán)境下應運而生的。綜合的來講,它完全符合目前的趨勢,可以說是真正意義上的一個具有開放性的綜合平臺,不論是開發(fā)軟件的公司還是搞研發(fā)的個人,都可以用它來作為開發(fā)的基礎。在技術方面,由于它具有很強的可操作性,人們在編寫程序的時候可以根據自己的意向來實現,這樣就給開發(fā)者進行創(chuàng)新提供了很大的可能。在成本方面,只要擁有編程的技術就可以在Android平臺上進行功能的實現,是很節(jié)約的,因此它就完全可以降低不少的成本。設計者們可以在此基礎上設計出具有個性特色的各類應用,所以,綜合用戶的需求,并從軟件這個很大的市場來說,Android很明顯具有很大的發(fā)展?jié)摿4]。課題研究的意義和目的游戲,作為一種娛樂項目,在我們現在這樣會面臨很多壓力的生活中,真的是一類不可或缺的活動。在我們的生活中,游戲的種類有千種萬種,不同的游戲也會給人帶來不同的放松和娛樂感受,正因為它的必不可少性,帶動很大一部分人來研究越來越多的游戲,這不經意間就豐盛了手機游戲行業(yè)。隨著歷史的發(fā)展,游戲也有了很大的發(fā)展和改變,從之前最簡單的到后來在電視上進行的游戲,繼而到pc游戲,再到現在的手機游戲,其發(fā)展過程也經歷了很多樣的技術革新。隨著我們生活水平的日益發(fā)展和新技術的偉大變革,手機逐漸在我們的生活中普及起來,它小巧玲瓏,功能強大,并且方便攜帶,這些特性都讓它最終成為我們生活中的必需品。隨著3g以至4g的開通及應用,手機必然會迎來一輪更深層次的普及,而可以讓用戶在手機上玩游戲也就隨著手機火爆起來,因此這類游戲的研究還是有很大的發(fā)展空間的,必將會迎來手機用戶的追捧!五子棋,它可以說是一種棋牌類的游戲,是需要有一定的策略的。棋盤和圍棋是通用的,有黑色和白色棋子兩種,但規(guī)則相對來說就比較簡單了,在我國古代,是比較流行的棋術之一。兩個人進行游戲,各拿一個顏色的棋子,一人接一人輪流落子,經過主動進攻或者是防守,直到有一方會出現五顆或者五顆以上的棋子連成一條線,就判定這一方獲勝,那么游戲將結束。由于落子之后棋子不像象棋那些可以隨意的移動位置,有時候也是可以用紙質的棋盤和筆來進行的。該游戲由于規(guī)則簡單,很容易就可以上手的,而且老少皆宜,玩起來比較有趣,不僅需要很好的策略,也需要隨時來處理不同的情況。這樣的游戲簡單易玩,并且鍛煉思維,更對于小孩兒來說,可以開發(fā)智力。這些在手機上開發(fā)的游戲,更是對方便快捷悠閑的最好體現。五子棋會有很強大的客戶群,即使是之前完全沒有接觸過該游戲的人也可以輕而易舉的明白具體的玩兒法,并且會感覺到特別有趣;它是以手機平板平臺為主的,只要是裝載它的話就可以隨時來玩兒,這樣在人們感受特別方便的同時,還可以享受現在這樣的高科技生活下的悠閑;這個游戲還需要一定的策略,每走一步都會引起思考,但是卻不會給人帶來壓迫感,就是這樣略微輕松的思考,鍛煉了思維的同時也娛樂了身心。所以,綜合上述該游戲的各方面好處,設計在手機上可以進行此游戲的應用就顯得很重要了。本課題的目的是基于Android平臺,設計出一款基于Android平臺的五子棋游戲,該游戲將可以玩人人對戰(zhàn)及人機對戰(zhàn)兩類。可行性研究這個階段,在對系統(tǒng)的目標進行了初步的調查和分析的基礎上,得出了一個可行性方案,并對其進行了論證。本文主要從三個可行性方面進行了分析,分別是技術、經濟和操作。技術可行性技術可行性有很多因素要考慮到,比如說目前擁有的技術條件是否可以滿足使得游戲可以最終達到計劃的要求,軟件和硬件的型號級別能否跟上完成的節(jié)奏等。本軟件用的是Java語言進行的,它的操作相對來說比較簡單,現在使用的計算機的硬件方面也完全跟得上研發(fā)的節(jié)奏。軟件方面:在不用聯網的模式已經發(fā)展的很強大的前提下,軟件就有了很好的發(fā)展平臺,它們具有很多的優(yōu)勢,比如很快的速度、高的可靠性、低的價格和大的容量,系統(tǒng)的需求完全能夠得到滿足。所以從技術層面上講是一定可以的。我們經常需要根據不同的客戶需求來設計出好多不同的功能,然后把這些功能嵌入整合到一個產品中,整合配置到那種大型的計算機系統(tǒng)中,這就是所謂的嵌入式系統(tǒng)。隨著時代一步步的發(fā)展,計算機慢慢在和通信技術融合,慢慢的深入到人們生活中的各個層面,信息無處不在,獲取的方式越來越網絡化,信息化已經成為一個不可避免的大趨勢,所有在這樣一個大的背景下,嵌入式的發(fā)展也得到了不可估量的前景。目前的嵌入式已經深入到我們日常生活中的各個行業(yè),它的使用或許也遠遠高過了普通的計算機系統(tǒng),包括通訊網絡等,。其中最典型的一個代表就是手機的嵌入式,給我們帶來了很大的便利,為我們的生活增添了很多不一樣的樂趣。經濟可行性我們可以通過去圖書館借閱有關聯的圖書或者上網搜索等途徑來獲得開發(fā)該應用所需要的有關聯的圖書資料,并且其中所需的應用相關方面的軟件和硬件也是很容易找到的,總之所需的成本是比較低的,所以說從經濟層面來看是可以的。操作可行性Eclipse是一個開放源代碼的研發(fā)平臺,它是基于Java的,是可擴展的。Eclipse是利用特殊規(guī)范的代碼來形成一個可供研發(fā)的程序,但是對于它自己而言,只是一個大概的結構和一些可供使用的命令。令人欣慰的是Eclipse附帶了一個標準的插件集,包括Java開發(fā)工具(JavaDevelopmentTools,JDT)。它主要由Eclipse項目、Eclipse工具項目和Eclipse技術項目三個項目組成,具體包括四個部分組成——EclipsePlatform、JDT、CDT和PDE。JDT支持Java開發(fā)、CDT支持C開發(fā)、PDE用來支持插件開發(fā),EclipsePlatform則是一個開放的可擴展IDE,它構造并且運行了集成軟件開發(fā)工具的基礎,提供構造塊,并且向用戶提供了一個通用性的開發(fā)平臺。EclipsePlatform對任何一個工具可以實現的結果從什么地方開始或者別的從什么地方結束是沒有辦法區(qū)分的,因為它不限制工具的制造者與其他的工具是不需要格式的轉換的。EclipseSDK(軟件開發(fā)者包)是EclipsePlatform、JDT和PDE所生產的組件合并,它們是不必要分開下載的。這些組合合并在一起共同組成了一個超級豐富并完善的可供開發(fā)的程序,開發(fā)者可以通過它建造一種工具,能夠不受限制不用進行轉換格式就可以連接到EclipsePlatform。EclipseSDK是由兩部分組成的,一個是Eclipse項目生產的工具,另外的來自第三方軟件,它們是開放源代碼的。這兩部分的協議是不一樣的,其中第一部分Eclipse自己產生的軟件通過GPL發(fā)布,而第二部分的第三方軟件是具有自己的許可協議的[7]。從以上的論述可以看出,本軟件的開發(fā)完全具備技術、經濟和操作三個方面的可行性。本章小結本章主要是從研究的背景、目的和意義三個方面對五子棋游戲在Android平臺上的研發(fā)和完成的情況進行了詳細的介紹,并分析了該設計是不是可以運行的,分別是技術、經濟和操作三個方面。

需求分析與系統(tǒng)設計在Android的系統(tǒng)上來研發(fā)五子棋游戲,并讓它順利運行,這樣一個游戲的開發(fā)確保了用戶可以隨時隨地的進行并且通過它來鍛煉自己的大腦。通過本系統(tǒng),用戶只要使用Android手機,并且安裝有本軟件,就可以再無聊之余一邊進行五子棋游戲,一邊來感受這樣的小游戲帶來的清新與悠閑。用戶可以通過五子棋游戲來享受愉悅的游戲氛圍,娛樂自己,放松身心。需求分析與創(chuàng)新意義下面從在Android上來對五子棋游戲研發(fā)和運行的幾個方面來展現五子棋游戲包含的樂趣,首先是游戲的簡單需求分析,然后是簡要的描述該系統(tǒng)的創(chuàng)新點和意義。系統(tǒng)的需求分析本系統(tǒng)的目的就是開發(fā)一個在Android上進行研發(fā)的五子棋游戲,有人人對戰(zhàn)和人機對戰(zhàn)兩個類別供玩家選擇,這兩種類別的選擇或者切換玩家是可以利用操作不同的按鈕來進行的。通過本系統(tǒng),用戶可以選擇人人對戰(zhàn)與自己的好友一同進行游戲,增進朋友之前的友誼,也可以選擇人機對戰(zhàn),與功能強大的電腦一決高下。主要包括的功能有:人人對戰(zhàn),人機對戰(zhàn),關于。該系統(tǒng)功能全面,并且具有良好的界面和易用性,可以給用戶帶來全新的游戲體驗。系統(tǒng)的創(chuàng)新與意義就目前android軟件市場上來說,已經有很多類似的五子棋的游戲,但是大多游戲都只是人機對戰(zhàn),沒有實現人機對戰(zhàn)與人人對戰(zhàn)結合,本游戲的目的就是為了整合人機對戰(zhàn)與人人對戰(zhàn),將他們結合到一個游戲中。而且如果游戲者想要轉換或者改變游戲的屬性是可以通過摁游戲設置那個按鈕來進行的,游戲設置那個按鈕設計在主界面上。在游戲設置中,用戶可以修改游戲的難易程度,游戲的趣味洗牌,是否標記行和列,是否為反向等等。系統(tǒng)的功能設計本系統(tǒng)主要分為三大塊,分別為人機對戰(zhàn),人人對戰(zhàn),關于。人機對戰(zhàn)人機對戰(zhàn)就是當用戶點擊手機上的歡樂五子棋圖標時,進入到主界面之后,可以摁那個人機對戰(zhàn)按鈕來開始。摁那個人機對戰(zhàn)的按鈕,屏幕會更改所選的界面。人機對戰(zhàn)中,默認設置是白色棋子屬于電腦,而黑色棋子屬于玩家,并且在游戲過程中無論是玩家還是電腦,只要有一方所用的棋子有五顆及以上的棋子連在一起,則系統(tǒng)會判定該方獲勝,反之則失敗。人人對戰(zhàn)人人對戰(zhàn)就是當用戶進入到游戲最開的那個界面的時候,摁那個人人對戰(zhàn)按鈕從而開始的游戲。利用將講監(jiān)聽器與空間button綁定一起通過相應算法實現摁那個人人對戰(zhàn)按鈕,屏幕將會更改到人人對戰(zhàn)棋盤界面,該界面與人機對戰(zhàn)界面是一樣的,區(qū)別只是棋子所執(zhí)者不一樣。在該游戲過程中是沒有電腦人工智能計算機算法的。而是游戲玩家可以找一個自己的好朋友一起來玩游戲的。在人人對戰(zhàn)那個游戲中兩個人分別擁有白色和黑色棋子,應為五子棋游戲規(guī)則就是黑子先行,所以默認第一玩家為黑子,第二玩家為白子,并且在棋子的數組中儲存兩種顏色的點的圖樣分別是黑子為0白字為1,系統(tǒng)默認第一個落子的玩家為黑子,第二個落子的玩家為白子。當每次落子之后,系統(tǒng)會判斷一次是否獲勝當黑色或者白色的棋子有五顆及以上連在一起的,則系統(tǒng)會判定該棋子所執(zhí)者獲勝,反之則失敗,并且會彈出對話框顯示“黑子獲勝”或者“白字獲勝”。關于當用戶對此游戲有疑問時,比如該游戲的作者或者是該作者的信息等,可以點擊主界面的關于按鈕,這是屏幕上會出現一個對話框,上面詳細介紹所要看的內容。系統(tǒng)的組成與實現原理下面從“歡樂五子棋”游戲的組成部分來闡述程序的設計原理。系統(tǒng)組成“歡樂五子棋”游戲主要包括三大功能點,通過三大功能點來完成人人對戰(zhàn),人機對戰(zhàn),關于等功能。(如圖2.1所示)圖2.1系統(tǒng)組成部分系統(tǒng)實現原理游戲是怎么樣運行的,原理有下面幾點:玩家用戶進入該系統(tǒng)開始游戲后,系統(tǒng)調用的都是同一張棋盤,不管游戲者選擇的是人人對戰(zhàn)模式還是人機對戰(zhàn)模式,其中的區(qū)別只是在棋盤中所執(zhí)行的方法不同。不管游戲者選擇的人和人玩還是人和機玩,當白子或者黑子,任意一種顏色的棋子五顆及以上連在一起的時候,系統(tǒng)將判定該顏色棋子所執(zhí)者贏得了游戲(如圖2.2所示)。圖2.2系統(tǒng)實現原理本章小結本章內容主要是略微介紹了一下“歡樂五子棋”游戲的需求分析,創(chuàng)新與意義,還有三大功能模塊的設計,同時對本系統(tǒng)的組成部分以及系統(tǒng)實現的原理進行了詳細的分析說明,從而為接下來在編寫程序模塊時能夠思路清晰。

客戶端系統(tǒng)的實現在Eclipse中新建一個命名為MyGobang的Android工程,BuildTarget選擇Android2.2 。在本工程中共有5個包10個類(如圖3.1所示)。圖3.1五子棋游戲系統(tǒng)類全圖其中比較重要的類有:在activity包中,MyGobangActivity.java類用來顯示該游戲的主界面。OfAllWarActivity.java類用來顯示人人對戰(zhàn)的界面。TheWarMachineActivity.java類用來顯示人機對戰(zhàn)的界面。在base包中,BaseComputerAi.java類用來存放人機對戰(zhàn)的算法,BasePlayer.java類用來存放人人對戰(zhàn)的算法。在entity包中,Chessboard.java類為棋盤類,改類用于棋盤界面的顯示。Point.java類為每顆棋子所落的點的實體類。在utils包中,HumanPlayer.java為人類玩家的一個實例。在res/layout中,有兩個文件需要被創(chuàng)建:游戲的原始界面的xml文件是main.xml,play.xml文件為顯示棋盤的主界面。用戶進入游戲第一次啟動Android拼圖游戲程序會進入到程序的主界面。在游戲的主界面中,用戶可以摁不同的功能選項按鈕來選擇對應功能。例如游戲用戶可以綜合自己的喜好,通過點擊人人對戰(zhàn)、人機對戰(zhàn)或者是關于按鈕來分別進入三類不同模式的界面(如圖3.2所示)。圖3.2游戲主界面主要代碼如下: publicvoidonCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews();} privatevoidfindViews() {mHumanBtn=(Button)findViewById(R.id.button1); mComputerBtn=(Button)findViewById(R.id.button2); mAboutBtn=(Button)findViewById(R.id.button3); mHumanBtn.setOnClickListener(this); mComputerBtn.setOnClickListener(this); mAboutBtn.setOnClickListener(this);}依據自己的喜好不同,用戶可以選擇摁原始面上任何一個功能按鈕,即可以摁人和人玩的按鈕、人和機玩的按鈕或者關于按鈕來分別進入人人玩模式、人機玩模式或者關于功能,進而屏幕上將會轉換出所選擇按鈕對應的框框來展示,每個Activity之間的轉換是通過Intent來實現的,Intent負責對應中一次操作的動作、動作涉及數據、附加數據進行描述,Andorid則根據此Intent的描述,負責找到對應的組件,將Intent傳遞給調用的組件,并且完成組件的調用。在本程序中一共有三個Activity分別是主界面,人人對戰(zhàn)以及人機對戰(zhàn)界面,通過把事件與Button綁定一起,利用Intent意圖功能來實現Activity的相互調用,從而達到我們所預期的玩家可以在主界面上選擇相應模式,并且跳轉到相應界面功能的效果,其中主體是通過Switch選擇語句實現的。主要代碼如下: publicvoidonClick(Viewv) { intent=newIntent(); switch(v.getId()) {caseR.id.button1: intent.setClass(this,OfAllWarActivity.class); startActivity(intent); break; caseR.id.button2: intent.setClass(this,TheWarMachineActivity.class); startActivity(intent); break; caseR.id.button3: newAlertDialog.Builder(this).setTitle("作者:麻博超").setMessage("學號:09060118").setPositiveButton("確定", newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterfacedialog,intwhich) { dialog.cancel();} }).show(); break;} }

人人對戰(zhàn)當用戶玩家想要跳轉到人和人玩的界面,可以在主界面摁人人玩的按鈕來運行。進入該界面后,玩家自己可以扮演兩個角色,或者用戶可以邀請一位好友,與好友一同切磋棋藝,(如圖3.3所示)。圖3.3人人對戰(zhàn)界面主要代碼如下: protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.play); gameView=(Chessboard)findViewById(R.id.myBang); gameView.player2=Chessboard.human; }我們在這里可以看到控制界面的Activity的setContentView()方法中的view為play.xml。Play.xml文件的代碼如下:<com.mbc.entity.Chessboardandroid:id="@+id/myBang"android:layout_width="fill_parent"android:layout_height="fill_parent"></com.mbc.entity.Chessboard>這里的布局文件中的元素引用的是entity包中的ChessBoard.java類,這個類繼承的是view,作用是用于顯示棋盤。主要代碼如下:(1)這里把代表不同顏色的許多點分別存入數組 Resourcesr=this.getContext().getResources(); fillPointArrays(BLACK,r.getDrawable(R.drawable.black)); fillPointArrays(WHITE,r.getDrawable(R.drawable.white));(2)設置畫線時用的顏色 paint.setColor(Color.LTGRAY);}(3)初始化好倆種顏色的點 publicvoidfillPointArrays(intcolor,Drawabledrawable){Bitmapbitmap=Bitmap.createBitmap(pointSize,pointSize, Bitmap.Config.ARGB_8888); Canvascanvas=newCanvas(bitmap); drawable.setBounds(0,0,pointSize,pointSize); drawable.draw(canvas); pointArray[color]=bitmap;}(4)以上代碼為初始化棋盤上的可以落子的點,和初始化兩種顏色的棋子,但是棋盤上還要有橫豎相間的線,主要代碼如下: protectedvoidonSizeChanged(intw,inth,intoldw,intoldh) {maxX=(int)Math.floor(w/pointSize); maxY=(int)Math.floor(h/pointSize); xOffset=((w-(pointSize*maxX))/2); yOffset=((h-(pointSize*maxY))/2); createLines(); restart(); }(5)產生棋盤上所有的線 privatevoidcreateLines() {for(inti=0;i<=maxX;i++) {lines.add(newLine(xOffset+i*pointSize-pointSize/2,yOffset,xOffset+i*pointSize-pointSize/2,yOffset+maxY*pointSize));} for(inti=0;i<=maxY;i++) {lines.add(newLine(xOffset,yOffset+i*pointSize-pointSize/2,xOffset+maxX*pointSize,yOffset+i*pointSize-pointSize/2));}}(6)畫出棋盤 privateList<Line>lines=newArrayList<Line>(); privatevoiddrawChessboardLines(Canvascanvas) {for(Lineline:lines) {canvas.drawLine(line.xStart,line.yStart,line.xStop,line.yStop,paint);}}(7)當加載完棋盤之后,第一個玩家觸摸屏幕中的任意一個點,將獲取到觸摸點的位置,主要代碼如下: privatePointnewPoint(Floatx,Floaty) {Pointp=newPoint(0,0); for(inti=0;i<maxX;i++) {if((i*pointSize+xOffset)<=x &&x<((i+1)*pointSize+xOffset)){p.setX(i);}} for(inti=0;i<maxY;i++) {if((i*pointSize+yOffset)<=y &&y<((i+1)*pointSize+yOffset)) {p.setY(i);}}returnp;}當第一個用戶點擊某一個點之后,將黑子放到該點上,第二個用戶點擊其他的點,然后在這個點上放上白色的棋子,依次類推(如圖3.4所示)。圖3.4人人對戰(zhàn)主要代碼如下: privatevoidplayer1Run(MotionEventevent) {Pointpoint=newPoint(event.getX(),event.getY()); if(allFreePoints.contains(point)) {setOnProcessing(); player1.run(player2.getMyPoints(),point); refressCanvas(); if(!player1.hasWin()) { if(player2==computer) {refreshHputerRunAfter(10); }else{setPlayer2Run();}}else{setMode(PLAYER_TWO_LOST);}}} privatevoidplayer2Run(MotionEventevent) {Pointpoint=newPoint(event.getX(),event.getY()); if(allFreePoints.contains(point)) { setOnProcessing(); player2.run(player1.getMyPoints(),point); refressCanvas();if(!player2.hasWin()) {setPlayer1Run(); }else{setMode(PLAYER_ONE_LOST);}}}當有任何一種顏色的五顆及以上棋子出現連在一條線的情況,系統(tǒng)會判定該顏色棋子的所執(zhí)者取得勝利,反之另一方則失敗。并且一旦出現勝負的情況,玩家將不可以繼續(xù)下棋,即游戲結束(如圖3.5所示)。圖3.5勝利狀態(tài)判斷橫向縱向是否有五顆棋子連成一條直線的代碼如下: publicfinalbooleanhasWin() {if(myPoints.size()<5) returnfalse; Pointpoint=myPoints.get(myPoints.size()-1); intcount=1;intx=point.getX(),y=point.getY(); temp.setX(x).setY(y);橫向:判斷在所落子點的X軸負方向與正方向分別存在子數 while(myPoints.contains(temp.setX(temp.getX()-1)) &&temp.getX()>=0&&count<5) {count++;} if(count>=5)returntrue;temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()+1)) &&temp.getX()<maxX&&count<5) {count++;} if(count>=5) returntrue;縱向:判斷在所落子點的Y軸負方向與正方向分別存在子數 count=1;temp.setX(x).setY(y); while(myPoints.contains(temp.setY(temp.getY()-1)) &&temp.getY()>=0) {count++;}if(count>=5)returntrue; temp.setX(x).setY(y); while(myPoints.contains(temp.setY(temp.getY()+1)) &&temp.getY()<maxY&&count<5) {count++;} if(count>=5)returntrue;判斷斜向是否有五顆棋子練成一條直線的代碼如下:正斜:判斷X軸負方向Y軸正方向以及X軸正方向Y軸負方向落子數。 count=1;temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()-1).setY(temp.getY()+1)) &&temp.getX()>=0&&temp.getY()<maxY) {count++;}if(count>=5)returntrue; temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()+1).setY(temp.getY()-1)) &&temp.getX()<maxX&&temp.getY()>=0&&count<6) {count++;}if(count>=5)returntrue;反斜:判斷X軸負方向Y軸負方向以及X軸正方向Y軸正方向落子數 count=1;temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()-1).setY(temp.getY()-1)) &&temp.getX()>=0&&temp.getY()>=0) {count++;}if(count>=5)returntrue; temp.setX(x).setY(y); while(myPoints.contains(temp.setX(temp.getX()+1).setY(temp.getY()+1)) &&temp.getX()<maxX&&temp.getY()<maxY&&count<5) {count++;}if(count>=5)returntrue;returnfalse;}當有五顆棋子無論橫向縱向或者斜向練成一條直線之后,將提示改顏色棋子獲勝。(如圖3.6所示)。

圖3.6獲勝提示主要代碼如下: publicvoidsetMode(intnewMode) {currentMode=newMode; if(currentMode==PLAYER_TWO_LOST) {Toast.makeText(getContext(),"黑子贏了",3000).show(); currentMode=STOP;}elseif(currentMode==PLAYER_ONE_LOST) { Toast.makeText(getContext(),"白子贏了",3000).show(); currentMode=STOP;}}人機對戰(zhàn)游戲用戶可以在界面上摁那個人機玩按鈕從而轉換到人和機玩的那個界面(如圖3.7所示)。圖3.7人機對戰(zhàn)界面 主要代碼如下: protectedvoidonCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.play); gameView=(Chessboard)findViewById(R.id.myBang); gameView.player2=Cputer;}人機對戰(zhàn)的界面樣式與人人對戰(zhàn)的樣式是一樣的,對于棋盤的畫法也是一樣的,兩者的區(qū)別就是,在人機對戰(zhàn)的模式中,程序的設置增添了人機對戰(zhàn)的算法。當開始人和機玩的游戲后,系統(tǒng)會默認人這一方第一個落子,即玩家所執(zhí)的是黑色棋子。當玩家成功落子后,計算機將會根據玩家落子點的位置根據對應的解題步驟處理,然后落第二個子,電腦執(zhí)黑子。電腦的算法步驟如下:第一步:首先分析當前的棋盤局勢,并設想在某個范圍內和對方繼續(xù)游戲,循環(huán)設定雙方棋子落地之后,分析在這個范圍內雙方的局勢變化,比如說會不會四子連在一起,或者雙方會不會出現雙3等。第二步:根據第一步的分析,將上述設想的每一步棋子落地后的結果都整合起來,其中有游戲兩方接下來會形成的全部的可能性即每個試探點存在的棋子活3半活4活2等情況的個數。第三步:根據五子棋游戲的規(guī)則將第二步所有的結果綜合排序,并選擇最適當的那一種情況落子(有主動形、被動形兩種)。人機對戰(zhàn)主要代碼與講解請見附錄【1】。當在人機對戰(zhàn)的過程中,我們不管哪種顏色的棋子五顆及以上連成了一條直線,則程序將判定該方獲勝(如圖3.8所示)。 圖3.8獲勝顯示該模式的主要代碼在判斷獲勝一方是與人人對戰(zhàn)模式一致的。關于當玩家想要查看關于選項里面的信息時,可以在主界面上點擊關于按鈕,然后會有一個對話框,上面會介紹該游戲的作者的相關信息,如果想讓對話框消失,摁那個確定按鈕就可以了(如圖3.9所示)。圖3.9關于主要代碼如下:newAlertDialog.Builder(this).setTitle("作者:麻博超").setMessage( "學號:09060118").setPositiveButton("確定", newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterfacedialog,intwhich) { dialog.cancel(); } }).show(); break;本章小結本章節(jié)主要就是介紹了“歡樂五子棋”包含的游戲功能,它是一款基于Android平臺的游戲,我們要想實現游戲的操作,可以通過點擊手機程序圖標進入到游戲主界面,然后再根據不同的游戲玩家的興趣來轉換不同的界面,這個可以摁不同的按鈕來完成操作。

系統(tǒng)的測試系統(tǒng)的測試環(huán)境接下來要對“歡樂五子棋”游戲的系統(tǒng)的幾個方面進行簡要的說明,包括開發(fā)、運行和網絡環(huán)境。本系統(tǒng)測試時,必須支持以下的環(huán)境配置,否則無法保證系統(tǒng)的可運行性。系統(tǒng)的開發(fā)環(huán)境操作系統(tǒng):WindowsXP、Android2.3.1開發(fā)環(huán)境:Eclipse3.5.0開發(fā)工具:AndroidSDK開發(fā)語言:Java硬件設備:戴爾本電腦華為Android智能手機NetcoreNW336150MUSB無線網卡系統(tǒng)運行環(huán)境服務器端程序目前只能運行Windows系列的操作系統(tǒng),日后也許會支持跨平臺的應用。服務端程序是由java語言實現的,因此不需要預裝任何軟件,可以直接運行。手機客戶端方面操作系統(tǒng)必須是Android1.6以上版本,推薦使用Android2.1以上版本。系統(tǒng)功能測試接下來主要進行的是測試“歡樂五子棋”游戲的一些基本功能。人人對戰(zhàn)測試功能實現:可以進入人和人玩的方式。測試目的:可以實現人人對戰(zhàn)游戲,游戲中的玩家將一人分飾兩角,玩家一和玩家二。測試結果:當玩家一或玩家二有一方的五顆棋子連成一條線,將判定該方獲勝。(如圖4.1所示)圖4.1人人對戰(zhàn)測試人機對戰(zhàn)測試功能實現:可以進入人和電腦玩的方式。測試目的:可以進行人機對戰(zhàn),并且電腦算法準確,難度比較大。測試結果:實現人機對戰(zhàn)。(如圖4.2所示)圖4.2人機對戰(zhàn)測試關于測試功能實現:會轉化出一個關于的框框來提示。測試目的:是否可以通過摁主界面上的關于按鈕來轉換出框框提示。測試結果:屏幕上轉換出了關于對話框來提示。(如圖4.3所示)。圖4.3關于測試本章小結本章主要介紹了“歡樂五子棋”游戲的最終功能測試,通過對開人人對戰(zhàn),人機對戰(zhàn),關于等功能進行測試測試,并且最后都測試通過,整個項目功能已經順利完成。

系統(tǒng)存在問題及改進方法系統(tǒng)存在的問題此系統(tǒng)基本實現了基于Android系統(tǒng)的五子棋游戲,但是由于時間較緊,還有一些沒有實現的功能。首先玩家在進行游戲之前應該選擇自己喜歡的棋子顏色,如白色或黑色。其次,程序中沒有響應的成績存儲功能。再次,游戲再過程中沒有音效,這讓玩家在玩游戲的過程中感覺有些枯燥乏味。最后,此款游戲的界面,也就是Android客戶端的界面,還存在一定的不足,并沒有特別好看的視覺感覺。系統(tǒng)改進方法針對提出的一些不足之處,我們分析出有以下幾種辦法來彌補:陣營選擇:如果想要設計的更貼近用戶,那么在開始游戲之前加入提示玩家是否要對棋子的顏色來進行選擇,或是紅色或是黑色,又玩家自己決定。存儲成績與排名:如果要使得該游戲更人性化,可以加入對各個玩家游戲的成績的儲存以及和其他各玩家相比的排名,根據前面介紹的存儲技術來對成績進行存儲,這樣使得游戲具備的功能全面。背景音樂:該游戲若能加上落子的音效,更加能夠提升游戲的可玩性。

結論Android可以說是目前最受歡迎的手機系統(tǒng)了,而對于手機來說多點觸控則是屬于當前的熱點。多點觸控系統(tǒng)摒棄了傳統(tǒng)的手機按鍵式操作方式,用戶只需用手指輕觸手機屏幕就可以方便的完成打開界面、轉換畫面、信息查詢、拖動控制等功能。在Android平臺上開發(fā)一款功能強大的系統(tǒng),可以上讓用戶使用手機更加的方便,靈活。本游戲是在Eclipse上面設計出來的,運用的Java語言,基于JAVA來運行服務功能的,對于手機客戶來說,需要使用的操作系統(tǒng)為Android1.6以上的版本,并且主要運行成功了以下幾個的功能:人和人玩、人和電腦玩,關于。1.人人對戰(zhàn):人人對戰(zhàn)就是當用戶進入到主界面之后,摁人人對戰(zhàn)按鈕從而開始的游戲。如果摁人和人玩的那個按鈕,那么屏幕會進入人和人玩的方式,其棋盤界面與人機對戰(zhàn)模式的界面是一樣的。在該游戲過程中是沒有計算機算法的。游戲玩家可以找一個自己的朋友來一起玩這個人和人的方式,或者自己擔任兩個角色。在該游戲過程中,兩種顏色的棋子分別被參與游戲的雙方玩家執(zhí)有,而且游戲規(guī)定先落子的一方默認使用的是黑色的棋子,另一方則為白色棋子,系統(tǒng)默認當游戲雙方有任意一方出現五顆及以上的棋子連在一起時,則判定該游戲玩家勝利,反之另一方則失敗。2.人機對戰(zhàn):用戶在使用手機客戶端的時候,先打開該游戲的應用程序,然后在主界面上摁人和機玩的那個按鈕,這樣就可以開始這個方式的游戲,此時,手機屏幕會跳轉到人機對戰(zhàn)的界面。在此模式中,系統(tǒng)默認游戲玩家執(zhí)有黑色的棋子,那么白色棋子歸電腦所有。玩家或者電腦雙方只要有一方棋子有五顆及以上連在一起時,則該方將贏得勝利。3.關于:當用戶在主界面摁那個關于按鈕時,將轉換到關于那個框框,出現的將是次游戲的作者的資料。通過這段時間對Android編程的學習,不僅讓我學習到了以前沒有深入學到的知識,同時讓我對手機開發(fā)產生了一定的興趣。每一次發(fā)現問題,解決問題都讓我印象深刻,每一次實現一個功能,都會對本系統(tǒng)有更深的理解。以前沒有學習到Android中手勢識別和方向傳感器的知識,通過本次畢業(yè)設計的考驗,讓我學習到了手機經常用到的,比較新意的東西,而對Java語言和Eclipse開發(fā)平臺也有了進一步的熟悉。雖然如此,我所學到的還是很有限的,需要在今后更一步的深入學習。

致謝本次畢業(yè)設計在我的指導老師于桂玲老師的精心指導下,前前后后歷經三個多月的忙碌,終于可以說就要完成了。雖然中間有很多的艱辛與不易,但現在終見成效,喜悅的心情難以言表。首先我很感謝我的指導老師,她的平易近人與悉心教導,讓我領悟很多,不僅僅是該論文的寫作,更是她的人格魅力,讓我感悟到做人應有的對學業(yè)以及生活的嚴謹與認真的態(tài)度,這對我受益匪淺,也可以說終將會受益終身。在此,我再次向于桂玲老師表示感謝并致以祝福!同時,我還要對我的母校說聲感謝,感謝她四年來的照顧,感謝她給我?guī)淼淖院栏?,以及母校所有的師生們。因為你們無私的奉獻與關懷,不僅使我順利完成了學業(yè),還教會我很多很多。四年的大學生活使我們真正成長為一個有理想,有追求,有知識的當代青年。在此我還想感謝論文中涉及到的參考文獻的學者們。你們就像行路上的明燈,有你們的辛苦鉆研與考究,才有那么多可以稱得上經典的參考文獻,給我完成論文帶來了很多靈感的啟發(fā)。我作為一個本科生,對文章中涉及到的知識的掌握還不是特別的深刻,所以難免會存在一些不足之處,在此,也懇請各位老師能夠諒解并且指正,讓我能夠學習的更好!最后,我要感謝陪伴了我生命中很重要的大學時光的同學們,尤其是幫助我在畢業(yè)設計中解決問題與難點的師姐。大學四年,與同學們一起互相幫助,共同進步,不斷充實自己。我發(fā)自心底地感謝你們對我的幫助和支持!

參考文獻[1]林城.Android2.3應用開發(fā)實戰(zhàn)[M].第一版.機械工業(yè)出版社,2011:17-321.[2]韓超.Android經典應用程序開發(fā)[M].第二版.人力資源出版社,2011:5-18.[3](美)CayS.Horstmann,CornellG.Java核心技術[M].第一版.機械工業(yè)出版社,2008:5-18.[4]劉衛(wèi)國,姚昱禹.Android與J2ME平臺間即時通信的研究與實現[J].Android工程師,2008(11):118-120.[5]劉平.Android手機訪問服務器的一種數據交互方法[J].西安財經學院網絡與現在教育技術,2010(6):96-102.[6]劉玉平.Java輸入輸出流及在網站開發(fā)中的應用探討[J].科技實況,2009(18):35-49.[7]趙亮,張維.基于Android技術的界面設計與研究[D].徐州:徐州建筑職業(yè)技術學院,2001.[8]陳璟,陳平華,李文亮.Android內核分析[J].Android程序員,2009(4):112-115.[9]劉衛(wèi)國,姚昱禹.Android的架構與應用開發(fā)研究[J].Android程序員,2009(7):110-112.[10]FriesenJ.LearnJavaforAndroidDevelopment[M].NewYork:Apress,2010:19-142.[11]AblesonF,CollinsC,SenR.UnlockingAndroid:ADeveloper’sGuide[M].NewYork:ManningPublications,2009:75-186.

附錄【1】人機對戰(zhàn)主要代碼:privatevoidinitRange(List<Point>comuters,List<Point>humans) { currentRange.xStart=humans.get(0).getX()-RANGE_STEP; currentRange.yStart=humans.get(0).getY()-RANGE_STEP; currentRange.xStop=humans.get(0).getX()+RANGE_STEP; currentRange.yStop=humans.get(0).getY()+RANGE_STEP; for(Pointpoint:humans) { if(point.getX()-RANGE_STEP<currentRange.xStart) { currentRange.xStart=point.getX()-RANGE_STEP; }elseif(point.getX()+RANGE_STEP>currentRange.xStop) { currentRange.xStop=point.getX()+RANGE_STEP; } if(point.getY()-RANGE_STEP<currentRange.yStart) { currentRange.yStart=point.getY()-RANGE_STEP; }elseif(point.getY()+RANGE_STEP>currentRange.yStop) {currentRange.yStop=point.getY()+RANGE_STEP;}} for(Pointpoint:comuters) { if(point.getX()-RANGE_STEP<currentRange.xStart) { currentRange.xStart=point.getX()-RANGE_STEP; }elseif(point.getX()+RANGE_STEP>currentRange.xStop) { currentRange.xStop=point.getX()+RANGE_STEP; } if(point.getY()-RANGE_STEP<currentRange.yStart) { currentRange.yStart=point.getY()-RANGE_STEP; }elseif(point.getY()+RANGE_STEP>currentRange.yStop) { currentRange.yStop=point.getY()+RANGE_STEP; }//如果棋盤被擴充之后多于之前的,那么選之前的棋盤大小 } currentRange.xStart=currentRange.xStart<0?0:currentRange.xStart; currentRange.yStart=currentRange.yStart<0?0:currentRange.yStart; currentRange.xStop=currentRange.xStop>=maxX?maxX-1 :currentRange.xStop; currentRange.yStop=currentRange.yStop>=maxY?maxY-1 :currentRange.yStop; }首先先判定計算機算法的計算范圍,然后將分析現有棋盤的形式。主要代碼如下: privatePointdoAnalysis(List<Point>comuters,List<Point>humans) {//我們來對屬于現行的入口方式進行研究,可以分三個步驟,其中第三步驟的難度控制可由子類干預 if(humans.size()==1) {//第一步 returngetFirstPoint(humans); } //初始化計算范圍 initRange(comuters,humans); //清除以前的結果 initAnalysisResults(); //開始分析后,我們通過對所有沒有棋子的點來得出第一次分析結果 PointbestPoint=doFirstAnalysis(comuters,humans); if(bestPoint!=null) { //System.out.println("這步就必須這么走了,是非常需要的"); returnbestPoint; } //我們通過第一次的結果來判斷哪個點最適合自己 bestPoint=doComputerSencondAnalysis(computerFirstResults, computerSencodResults); if(bestPoint!=null) {//System.out.println("馬上就贏了,必須走這步"); returnbestPoint; } computerFirstResults.clear(); System.gc(); //我們利用第一次的結果來選出敵人最重要的那個的點 bestPoint=doHumanSencondAnalysis(humanFirstResults, humanSencodResults); if(bestPoint!=null) { //System.out.println("再不下這個棋子就輸了"); returnbestPoint; } humanFirstResults.clear(); System.gc(); //沒有找到一招致命的點,第三次結果分析 returndoThirdAnalysis(); } //根據人和人玩的時候分析首先要進行的落子步驟來進行,這個過程的計算過程很簡單 privatePointgetFirstPoint(List<Point>humans) { Pointpoint=humans.get(0); if(point.getX()==0||point.getY()==0||point.getX()==maxX &&point.getY()==maxY) returnnewPoint(maxX/2,maxY/2); else { returnnewPoint(point.getX()-1,point.getY()); } }當第一步完成之后,計算機開始分析,掃描所有空白的點,形成第一次分析結果,主要代碼如下: privatePointdoFirstAnalysis(List<Point>comuters,List<Point>humans) {//我們通過觀察所有沒有棋子的空格來分析得出第一次結果 intsize=allFreePoints.size(); PointcomputerPoint=null; PointhumanPoint=null; intx,y; FirstAnalysisResultfirstAnalysisResult; for(inti=0;i<size;i++) { computerPoint=allFreePoints.get(i); //為了防止在分析的時候會將原來的對象改變,我們需要把坐標記下 x=computerPoint.getX(); y=computerPoint.getY(); if(x<currentRange.xStart||x>currentRange.xStop ||y<currentRange.yStart||y>currentRange.yStop) { continue; } //我們在這個位子落子,并分析落子后在橫向上的狀態(tài),如活4,活3,半活4,活2等所有狀態(tài) firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,HENG); computerPoint.setX(x).setY(y);//為了下一次分析撤銷此步 if(firstAnalysisResult!=null) {//如果沒有結果,那么這個情況下不能分勝負 if(firstAnalysisResult.count==5)//如果等于5,那表明有一種顏色的棋子已經出現五個及以上在一起的情況,勝負已定 returncomputerPoint; //記錄第一次分析結果 addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } //在“縱向”對上面的步驟再走一次 firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,ZHONG); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) {//死棋,不下 if(firstAnalysisResult.count==5) returncomputerPoint; addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } //正斜向 firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,ZHENG_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) returncomputerPoint; addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } firstAnalysisResult=tryAndCountResult(comuters,humans, computerPoint,FAN_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) returncomputerPoint; addToFirstAnalysisResult(firstAnalysisResult, computerFirstResults); } //分析在橫向上對方棋子的狀態(tài)是怎樣的,如敵方的活3、半活4等 firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,HENG); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) humanPoint=computerPoint; addToFirstAnalysisResult(firstAnalysisResult,humanFirstResults); } firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,ZHONG); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) humanPoint=computerPoint; addToFirstAnalysisResult(firstAnalysisResult,humanFirstResults); } firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,ZHENG_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5) humanPoint=computerPoint; addToFirstAnalysisResult(firstAnalysisResult,humanFirstResults); } firstAnalysisResult=tryAndCountResult(humans,comuters, computerPoint,FAN_XIE); computerPoint.setX(x).setY(y); if(firstAnalysisResult!=null) { if(firstAnalysisResult.count==5)

溫馨提示

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

評論

0/150

提交評論