freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

基于cocos2d-x的斗地主游戲開發(fā)畢業(yè)論文(編輯修改稿)

2025-07-24 17:14 本頁面
 

【文章內容簡介】 詢,若用戶名不存在或密碼錯誤則登錄失敗。保存數據時用一個變量來標識賬號是否被記住,若記住則下次登錄時初始化賬號輸入框。(2)網絡通信作為一個聯網多人斗地主游戲,實現網絡通信則要借助服務器與客戶端,利用SOCKET與多線程技術可實現。為了對傳輸的數據有一個很好的處理,制定一個套協議,每個字節(jié)代表一定的含義。服務器則主要承擔數據轉發(fā)、發(fā)牌給玩家、通知玩家叫分和打牌環(huán)節(jié)的開始等責任,客戶端則通過創(chuàng)建一個接受線程,通過接受到的數據來更新客戶端界面,并且通過數據來控制游戲的邏輯。每個玩家的操作都可以發(fā)送到服務器,服務器轉發(fā)消息給其他客戶端來理解玩家執(zhí)行的一些操作。至此,服務器與客戶端的通信,玩家與玩家間的通信可以正常進行。(3)自動發(fā)牌自動發(fā)牌可以理解為:當有3個玩家連接到服務器時,服務器自動洗牌分發(fā)給玩家,玩家收到牌數據后利用客戶端的繪圖函數動態(tài)的繪制牌,繪制牌的函數可以利用vector容器的一些增刪查改操作結合Cocos2Dx自帶的定時器,每隔一段時間繪制一張牌,即可實現動態(tài)發(fā)牌的效果。(4)玩家叫分當玩家叫分時,玩家間需要時刻進行叫分數據間的通信。發(fā)牌之后,服務器會默認指定第一個連上服務器的玩家擁有初始叫分的權利,玩家順時針輪流叫分。叫分時客戶端主要負責菜單項的加載、禁用、移除,當玩家獲得叫分資格時加載菜單項并創(chuàng)建叫分計時器,然后根據上家叫的分數禁用部分菜單項(低于上家所叫分數的菜單項被禁用),當玩家叫分結束后移除菜單項。當然,叫分過程中需要注意叫分數據的保存,數據的改動及叫分過程要及時在客戶端界面上反應出來。(5)出牌選牌設計這個模塊時需要設計出牌選牌的多個輔助功能,里面伴隨著大量的判牌、查牌算法,玩家出牌分為主動出牌很跟牌兩種方式。主動出牌時:先利用Cocos2Dx的觸屏功能執(zhí)行玩家選牌操作,當選的牌不符合規(guī)則時會禁用出牌菜單項,這時需重新選牌(可借助重選操作取消選中的所有牌),若玩家出牌符合規(guī)則則出牌菜單項可用,玩家出牌(由于是主動出牌,故提示功能被禁用)。跟牌時:首先先判斷上家所出牌的類型,此時玩家可借助提示功能跟牌,如果玩家自己選牌則先判斷牌是否符合規(guī)則并且其類型需與上家的牌類型一致且打過上家的牌時,經過一系列的判定之后玩家方可出牌(跟牌)。(6)人工智能人工智能模塊主要是針對斗地主游戲的單機版設計的,因為電腦玩家需要具備主動出牌及跟牌的能力,這樣才能更真實的還原玩家一起打牌的娛樂性。斗地主的人工智能其實是根據一般玩家的出牌習慣及一些經驗給電腦玩家制定出一套具有出牌與跟牌有優(yōu)先級順序的規(guī)則。如當某一電腦玩家手上的牌有三帶一、單順、雙順、飛機帶翅、單牌等牌型時,在主動出牌時可以設計出牌優(yōu)先級出飛機帶翅(本軟件是這樣設計的),跟牌的時候可以根據上家的牌型找出手中牌類型一致且能大過上家牌的最小牌。 功能的構建(1)用戶驗證當玩家通過賬號密碼登陸游戲時,需要對用戶的賬號密碼進行驗證,驗證是客服端將賬號和密碼發(fā)送到服務器,服務器驗證完成后反饋給客戶端,客戶端根據反饋信息決定是否有權限進入游戲界面。(2)動態(tài)發(fā)牌動態(tài)發(fā)牌可以理解為:客戶端將從服務器接受到的原始牌數據一張一張?zhí)砑拥酵婕业漠斍芭茢祿?,并通過界面的形式將牌繪制到游戲界面,給人一張動態(tài)發(fā)牌的感覺。實現動態(tài)發(fā)牌需要借助vector存儲數據并利用其自帶的算法添加數據及排序操作,首先插入“新發(fā)”的一張牌并排序,通過牌的張數確定繪制牌時的其實位置,然后利用getChildByTag()函數找出上次當前位置的精靈圖片(繼承自CCSprite類,添加牌的一些屬性)更新其顯示的精靈幀及一些屬性(像索引值等),更新完圖片后再繪制新添加的精靈。至此界面上顯示的牌位置發(fā)生了一定的改動,最后只要判斷牌的張數達到17張時動態(tài)發(fā)牌結束,進入到下一個環(huán)節(jié)。(3)提示出牌為了方便玩家在跟牌時能方便的找到同類型的牌,設計提示玩家出牌的功能是很有必要的。實現提示出牌的功能首先需要判斷上家出牌的張數、類型,然后從玩家的整手牌中找出所有符合此類型并且張數一樣的牌(同一類型的牌張數有可能不同),并不是所有類型相同的牌都符合出牌規(guī)則,還需要比較牌的大小,只有當滿足以上條件的同時還需要大過上家的牌。要實現這些小的算法需要借助vectorint、mapint,int和mapint,vectorint來完成牌的一些分類、計數和存儲。(4)托管當玩家有事或者時間到還沒有出牌時等等情況時,都需要有一個自動幫助玩家出牌的功能——托管。實現托管功能需要處理兩種情況:跟牌和主動出牌。跟牌的情況處理比較簡單,只需要根據提示功能找出的牌數據,然后找出大過上家的最小牌數據即可;主動出牌的情況則類似電腦玩家自動出牌,詳情參考下文“電腦自動出牌和跟牌”。(5)電腦自動出牌和跟牌在單機版的人工智能模塊需要設計一個重要的功能——電腦自動出牌和跟牌。跟牌功能的設計較為簡單,類似于上文所說的托管的跟牌情況,根據上家出的牌來出牌;自動出牌則需要根據大部分玩家出牌的一些喜歡及一些經驗設計好出牌的優(yōu)先級,本文所設計的斗地主游戲只是簡單的根據牌的類型人為了設計了出牌順序(優(yōu)先級),主要是為了不破壞整副牌的完整性(不會因為出的牌而破壞牌的類型多樣性)。出牌順序初步設計為:飛機帶翅、雙順、單順、三帶一(二)、四帶二(2張或2對)、三順、三不帶、炸彈、對子、單張。 軟件的框架本文設計的斗地主游戲分為網絡和單機兩個版本,其中網絡版有獨立的服務器與之相連,單機版則集成在客戶端的單機菜單項中,也就是說通過網絡版的客戶端來啟動單機版的進程。(詳見下面41 軟件框架流程圖)斗地主游戲服務器斗地主游戲客戶端 發(fā)送數據到服務器接收數據  單機登錄注冊游戲結束再玩一局結束游戲否是游戲結束再玩一局?單機版游戲界面用戶注冊界面否否是是判斷用戶賬戶和密碼是否正確結束游戲網絡版游戲界面 41 軟件框架流程圖5 軟件設計與實現(詳細設計) 數據結構及算法的設計要開發(fā)一款紙牌類游戲,里面必然會牽涉到大量的算法及數據處理,一個好的算法實現需要借助一個好的數據結構。軟件中涉及到數據結構和核心算法的兩個類主要是卡牌類Cards和玩家類Player。(1)Cards類設計表51 Cards類核心函數函數原型函數功能vectorint GetRandomCard()隨機產生一副牌vectorint SplitCard(int ,vectorint)獲取一手牌(某位玩家)vectorint getHoleCard(vectorint)獲取底牌CCRect getRect(int)根據牌標識獲取牌位置int getValueByIndex(int)根據索引獲取牌的大小值bool IsSanDai(mapint,int)判斷三帶一(二)bool IsSiDai(mapint,int)判斷四帶二(2張或2對)bool IsShunZi(mapint,int,int)判斷順子bool IsDanShun(mapint,int)判斷單順bool IsShuangShun(mapint,int)判斷雙順bool IsSanShun(mapint,int)判斷三順bool IsPlane(mapint,int,int)判斷飛機帶翅int getCardType(vectorint)獲取牌的類型int getCardKeyValue(vectorint)獲取(多張)牌的關鍵值int getBigCardCount(vectorint)得到大牌的張數(2或王的數目)bool CompareCardValue(vectorint,vectorint)比較兩手牌的大小vectorint getNeedCard(vectorint,int ,int n)根據類型獲取提示牌vectorintgetCardByHitCard(vectorint,vectorint) 從提示牌中取大過上家的第一手牌bool IsBigLastCard(vectorint,vectorint)判斷是否有牌大過上家Cards類主要是提供判牌的一系列靜態(tài)方法供其他類使用。之所以全部設計為靜態(tài)方法是為了簡化類結構,可以服務于整個程序。為了更好的實現我們需要的算法,利用C++STL模板可以很好組織數據。在設計軟件時實例化模板為vectorint做為動態(tài)數組來使用,其目的只是為了存儲數據及一些增刪查改,在Cards類主要作為函數參數來傳遞;在獲取牌的類型時,像判斷對子、三帶、飛機等等的類型時需要統(tǒng)計同一牌值的張數,軟件使用mapint,int來組織數據,第一個參數來表示牌值,第二個參數表示張數,除此之外map容器還有一個特性:按升序自動排列數據;在設計提示出牌算法時,組織數據也是非常關鍵的,再此我們選擇mapint,vectorint結構,因為出牌必須要知道牌的索引,第二個參數不再表示牌的張數,而是同一牌值的所有索引值,這樣不僅能正確處理牌的類型,還能很好的保存數據。Cards類主要是圍繞發(fā)牌、判牌、比牌、取牌等展開設計。其中,提供給發(fā)牌的方法主要有:隨機產生一副牌、獲取一手牌(給某個玩家)、獲取底牌;提供給判牌的方法主要有:判斷牌型子方法(單順、雙順、三帶、四帶、飛機帶翅等)、獲取牌的類型、通過索引獲取牌值;提供給比牌的方法主要有:獲取牌的關鍵值、比較兩手牌的大??;提供給取牌的方法有:根據類型獲取提示牌、從提示牌中取第一手大過上家的牌、判斷提示牌中是否有大過上家的牌。(2)Player類設計表52 Player類核心函數函數原型函數功能static void CharToInt(char*,vectorintamp。)將字符信息轉換為牌數據static void IntToChar(vectorint,char*)將牌數據轉換為字符數據int getAIPlayerMaxScore()獲取電腦玩家最大叫分數vectorint getNeedOutCard()得到電腦玩家應出的牌Player類是一個玩家類,在設計主要是提供玩家一些牌的顯示操作和一些牌數據的處理,CharToInt()函數跟IntChar()函數主要應用于網絡版在收發(fā)數據時進行的數據類型轉換。getAIPlayerMaxScore()函數沒有過多的技巧,主要還是調用Cards類提供的一些靜態(tài)方法。getNeedOutCard()可以說是單機版電腦玩家的靈魂算法,里面一個非常關鍵的結構vectorvectorint,該結構主要是構造電腦玩家出牌的優(yōu)先級,其類型參數第一個元素表示牌的類型,此后便是所有可能出現此類型的牌的張數。構造玩家出牌的優(yōu)先級后,之后遍歷優(yōu)先級數據結構找出最先存在的牌型,就很容器得到返回值了。(亦可以用mapint,vectorint來代替vectorvectorint)。 數據庫的設計本文設計的都地主游戲需要存儲的信息并不多,只需要保存好玩家的個人信息,用于用戶的登錄驗證和打牌時玩家游戲信息的顯示。由于本文設計的游戲對數據庫的要求并不是很高,故使用Cocos2Dx中支持的存儲類CCUserDefault作為一個輕量級數據庫來使用。它支持存儲的數據類型包括bool(布爾型)、int(整型)、float(浮點型)、double(雙精度浮點型)、string(字符串型)。CCUserDefault類常用函數如表53所示。表53 CCUserDefault類的常用函數函數名返回類型描述getBoolForKey布爾型根據傳入的鍵值參數返回相應的布爾值,第二個參數為可選的默認值,一旦該鍵值的值不存在,將返回默認值getIntergerForKey整型同上getFloatForKey浮點型同上getStringForKey字符串型同上setBoolForKey空第一個參數為鍵,第二參數為對應的值,布爾型存檔setIntergerForKey空同上setFloatForKey空同上setStringForKey空同上flush空存儲為XML文檔使用此類來存儲及提取數據都是很容易實現的,存儲時調用setTypeForKey系列函數以鍵值對的形式存儲數據,獲取時調用getTypeForKey系列函數傳遞鍵參數返回其值,最后調用flush以XML文檔保存即可。(詳見表54)表54 玩家信息字段名數據類型大小備注AccountVARCHAR20賬號PwdVARCHAR20密碼NicknameVARCHAR10昵稱ScoreINTEGER4游戲積分LevelVARCHAR10游戲等級 模塊的設計與實現 用戶登錄注冊及驗證模塊登錄注冊界面通過CCLayer類來實現,與登錄注冊界面相關的類如下:class HostScene : public cocos2d::CCLayer{}只需在init()函數中添加相關控件即可簡單地設計出登錄注冊界面,關鍵代碼如下:bool HostScene::init(){ AddEditBox(this,1)。 //添加賬號和密碼編輯框 AddMenuItemOrder1(this)。 //添加1級(Z次序)菜單項和標簽 AddSprites(this)。 //添加精靈圖片}注冊及驗證功能則需要CCUserDefault來進行數據的存取。注冊部分采用鍵—值(鍵)—值的方式來存儲數據,關鍵代碼如下:
點擊復制文檔內容
職業(yè)教育相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1