本發(fā)明涉及桌面卡牌游戲與編程語言技術(shù)領(lǐng)域,特指一種桌面卡牌游戲引擎。
背景技術(shù):
卡牌類游戲是桌面游戲的一個(gè)類別,也是其中占比非常大的一個(gè)類別。主要包含以tcg(tradingcardgame集換式卡牌游戲)及其變種類型,針對廣泛的以牌(特指單張牌)為核心的一大類桌面游戲,這些桌面游戲的存在以下共同點(diǎn):一是牌之外的附帶部件少,區(qū)別于版圖、棋類游戲;二是重視牌與牌的互動而不是排列組合,區(qū)別于傳統(tǒng)的撲克、麻將等游戲。
由rpg(role-playinggame)游戲進(jìn)化而來的卡牌類游戲很自然地帶有了rpg游戲的很多元素。首先,卡牌類游戲的基本元素有:區(qū)域、卡牌、效果,大多數(shù)卡牌類游戲都會有生物、法術(shù)、裝備等不同類型的卡牌,這些牌會游走于戰(zhàn)場的各個(gè)區(qū)域之間,通過效果、戰(zhàn)斗等互動手段來進(jìn)行對決,對于生物而言,生命值、攻擊力等屬性也是不可或缺的。
其次是時(shí)間的離散性??ㄅ祁愑螒虻某踔允窃谧烂嫔线M(jìn)行rpg游戲的凝練,而桌面這一場合很難采取回合制以外的游戲方式,原因是缺少時(shí)鐘。游戲的突現(xiàn)性也是一個(gè)重要的特征,很少有桌面游戲會選擇設(shè)計(jì)固定數(shù)目的關(guān)卡,這十分不利于游戲的可玩性。而無限制的設(shè)計(jì)對于桌面游戲的開發(fā)與發(fā)行都是不可能的。所以桌面游戲往往把多變性體現(xiàn)在卡牌(或其他元素)的互動上。
卡牌類游戲的原本設(shè)計(jì)目的是在桌面上,用卡牌來表示玩家的動作,進(jìn)行交互式的游戲。而隨著時(shí)代的發(fā)展,人們對互聯(lián)網(wǎng)的依賴越來越大。卡牌類游戲的玩家們希望在不能見面時(shí),也能通過網(wǎng)絡(luò)進(jìn)行游戲,這便產(chǎn)生了用計(jì)算機(jī)實(shí)現(xiàn)卡牌類游戲的需求。
目前市面上的卡牌類游戲,一些主流游戲廠商大都推出了自己的自動化游戲?qū)?zhàn)平臺,如萬智牌的magiconline、三國殺的三國殺online、風(fēng)聲online(已停服),但小眾游戲基本都沒有實(shí)現(xiàn),而有實(shí)現(xiàn)的游戲也多不是最新版本。另外,多有著商業(yè)運(yùn)營的所不可避免的高昂費(fèi)用。此處高昂費(fèi)用并非指游戲發(fā)行時(shí)收取的購入費(fèi)用,而是指在游戲中購買虛擬卡牌的費(fèi)用。在商業(yè)運(yùn)營模式下此費(fèi)用會虛高不下。有民間愛好者自發(fā)的團(tuán)體或個(gè)人來實(shí)現(xiàn),但往往沒有持續(xù)的熱情,通常在幾個(gè)版本后放棄,另外與游戲規(guī)則不同的bugs也經(jīng)常出現(xiàn)。比較成功的案例有游戲王的ygopro(ygocore或mycard為不同版本名,均為基于同一開源軟件所構(gòu)建)。非自動化平臺,這種方案是一個(gè)代替方案,并不能直接解決以上需求。該方案實(shí)現(xiàn)一個(gè)“桌子”,提供給玩家自己操作卡牌的功能,而游戲卡牌的效果需要玩家自行模擬操作完成。該方案是成功的,它提供了玩家通過網(wǎng)絡(luò)進(jìn)行游戲的功能,同時(shí)缺點(diǎn)也很明顯——復(fù)雜。玩家會進(jìn)行繁復(fù)的操作以至于消耗過多的時(shí)間,玩家很容易記不清效果的正確處理規(guī)則,導(dǎo)致游戲非正常進(jìn)行。早期游戲王對戰(zhàn)工具nbx(netbattlex)、仍在使用的萬智牌對戰(zhàn)工具mws(magicworkstations[5])都是采取了這種方案,后者由于框架的開闊,被應(yīng)用于許多其他同類型游戲的網(wǎng)絡(luò)對戰(zhàn)。
目前,卡牌類游戲的自動化實(shí)現(xiàn)存在以下幾個(gè)難點(diǎn):
1、牌池龐大,需要實(shí)現(xiàn)的卡牌眾多;
2、更新速度快,新出現(xiàn)的卡牌往往帶來新的機(jī)制;
3、卡牌效果歧義與特例較多;
上述難點(diǎn)使得自動化實(shí)現(xiàn)卡牌類游戲一直以來都是個(gè)很繁重的工作。
以往的自動化實(shí)現(xiàn)架構(gòu)多為兩個(gè)部分,第一部分是使用通用程序設(shè)計(jì)語言實(shí)現(xiàn)的核心系統(tǒng),能夠管理游戲資源,同時(shí)提供接口以便于對效果的分類。第二部分是使用腳本語言(如lua)實(shí)現(xiàn)的卡牌效果,這有助于漸進(jìn)地實(shí)現(xiàn)整個(gè)游戲,同時(shí)腳本語言的輕便也被體現(xiàn)出來。
但是上面所述的自動化實(shí)現(xiàn)架構(gòu)也存在著許多問題。例如游戲資源交由核心管理,意味著對于游戲規(guī)則架構(gòu)的修改需要核心的修改,而使用通用語言的核心本身不會很易于維護(hù),同時(shí)游戲規(guī)則不成體系,易產(chǎn)生沖突。腳本語言雖然簡便,但亦需有編程基礎(chǔ)的人來更新維護(hù),即對于牌池的擴(kuò)展仍需開發(fā)者來進(jìn)行,不能將擴(kuò)展牌池的任務(wù)交給玩家。對于卡牌類游戲,自定義是游戲的一大樂趣,同時(shí)也是新版本的開發(fā)測試的重要組成。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題為提出一種能夠?qū)崿F(xiàn)游戲處理引擎核心和使得玩家能夠勝任自定義卡牌工作的桌面卡牌游戲引擎,有效克服目前自動化實(shí)現(xiàn)卡牌類游戲所存在的技術(shù)問題。
本發(fā)明的具體技術(shù)方案是:
一種桌面卡牌游戲引擎,所述桌面卡牌游戲引擎包括:
核心模塊、控制模塊、文法分析模塊、卡牌管理模塊、數(shù)據(jù)庫模塊、通信模塊;
所述核心模塊用來模擬實(shí)際效果流程,其包含實(shí)際效果處理的核心機(jī)制與語言解釋器;
所述控制模塊用于處理分發(fā)事件、初始化游戲資源,為主控制流程;
所述卡牌管理模塊用于管理卡牌包、卡牌、效果,其獨(dú)立于游戲單獨(dú)進(jìn)行數(shù)據(jù)庫的編輯或/和用于游戲牌庫編輯;
所述文法分析模塊用于將數(shù)據(jù)庫中卡牌及效果文本轉(zhuǎn)換為可使用的游戲資源;
所述通信模塊用于將實(shí)際游戲中玩家可視資源通過通信傳給客戶端,并進(jìn)行操作上的交互。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述控制模塊包括游戲初始化單元、游戲設(shè)置讀取單元與游戲主控制流程單元;
所述游戲初始化單元用于創(chuàng)建客戶端資源、客戶端通信線程,加載核心模塊、文法分析模塊、數(shù)據(jù)庫模塊;
所述游戲設(shè)置讀取單元用于將游戲所使用卡牌擴(kuò)展包、游戲規(guī)則效果從數(shù)據(jù)庫模塊中讀取出來,加載至核心模塊中;
所述主控制流程單元用于分發(fā)處理用戶級事件,調(diào)用核心模塊處理效果,將核心模塊中的游戲資源信息顯示給客戶端。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述文法分析模塊包括效果描述語言的文法結(jié)構(gòu)、lr分析與抽象語法樹的文法解析器;
所述效果描述語言的文法結(jié)構(gòu)包括元素的描述方式、效果的描述方式、以及條件分支與循環(huán)過程結(jié)構(gòu)的支持方式;
所述基于lr分析與抽象語法樹的文法解析器的語言定義于lr文法中,使用lr分析器進(jìn)行解析,將效果轉(zhuǎn)化為抽象語法樹后存于游戲資源中。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述元素的描述方式為:所述元素包括區(qū)域、卡牌、效果、屬性;游戲玩家擁有區(qū)域,區(qū)域擁有卡牌,卡牌擁有效果,區(qū)域、卡牌、效果可歸類為對象,對象間使用擁有的方式獲取,對象間是遞歸擁有的。
所述效果的描述包括:將卡牌效果分解為動作,所有每個(gè)動作均視為一個(gè)效果,所述一個(gè)效果含有多條命令,每條命令含有效果調(diào)用名、施法者、目標(biāo)、參數(shù);
條件分支與循環(huán)過程結(jié)構(gòu)的支持方式包括:
1)分支結(jié)構(gòu),在每條命令前加入條件,而所有命令仍構(gòu)成同一效果,每個(gè)效果只可能有一層命令調(diào)用,分支的層數(shù)只有一層,復(fù)雜的分支結(jié)構(gòu)使用多個(gè)效果疊加來實(shí)現(xiàn);
2)循環(huán)結(jié)構(gòu),選用遞歸的方式模擬可以實(shí)現(xiàn)不定次數(shù)的循環(huán)結(jié)構(gòu)。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述核心模塊的核心機(jī)制包括基于棧的效果調(diào)用機(jī)制、基于隊(duì)列的事件機(jī)制、屬性棧機(jī)制和世界分支機(jī)制;
所述基于棧的效果調(diào)用機(jī)制包括:將一切的游戲動作均定義為效果,效果可以由效果產(chǎn)生,也可由效果觸發(fā)。產(chǎn)生效果是指效果中所定義的必須發(fā)生的效果,產(chǎn)生效果是原效果的子效果;觸發(fā)效果是指其它效果響應(yīng)原效果后接連發(fā)生;由效果產(chǎn)生或觸發(fā)的效果將在效果棧的最上層出現(xiàn),并優(yōu)先結(jié)算,為了動態(tài)處理接在效果后觸發(fā)的效果,設(shè)置一個(gè)活動表記錄活動的效果,以便在效果結(jié)束時(shí)進(jìn)行搜索,直到調(diào)用了最底層的內(nèi)建效果,則由核心模塊中的內(nèi)建效果對游戲資源進(jìn)行操作;
所述基于隊(duì)列的事件機(jī)制包括:通過事件機(jī)制使用串行的方式模擬實(shí)體卡牌上描述的同時(shí)發(fā)生的效果;當(dāng)一個(gè)效果同時(shí)產(chǎn)生了多個(gè)效果時(shí),在所述多個(gè)效果結(jié)算完畢之前,所述多個(gè)效果將不能觸發(fā)新的效果,但所述多個(gè)效果仍將產(chǎn)生子效果,進(jìn)而對局面進(jìn)行改變,在所述多個(gè)效果的最后一個(gè)效果處理完之前,所述多個(gè)效果的其他前面的效果可能已經(jīng)處理完成;所述多個(gè)效果全部結(jié)算完畢前,每當(dāng)一個(gè)效果結(jié)算完畢時(shí),則需將已完成的效果加入事件隊(duì)列,當(dāng)所有效果結(jié)算完成后,由事件隊(duì)列中的事件觸發(fā)新的效果,觸發(fā)的效果可根據(jù)任意自定義的順序排序,加入效果棧;
所述屬性棧機(jī)制包括:采用實(shí)時(shí)演算來計(jì)算屬性,對屬性的修正分為一次性修正與持續(xù)修正,一次性修正為直接作用在原屬性值上,而持續(xù)修正為實(shí)時(shí)演算屬性值,每當(dāng)需要獲取屬性的情形出現(xiàn)時(shí)均進(jìn)行計(jì)算,并將屬性獲取與計(jì)算都定義為效果,每當(dāng)獲取某屬性時(shí),獲取的屬性值將觸發(fā)其它修正該屬性值的效果,達(dá)到實(shí)時(shí)演算的目的;屬性獲取過程只演算獲取到的值,而不對屬性原本值進(jìn)行修改;屬性獲取過程不存在對局面的修改,單獨(dú)設(shè)立屬性棧,其基本處理流程與效果棧相同,在處理時(shí)沒有中斷、優(yōu)先度優(yōu)先于效果棧。
所述世界分支機(jī)制包括:將游戲過程定義為世界,當(dāng)多個(gè)效果同時(shí)發(fā)生時(shí),將當(dāng)前世界復(fù)制兩份并分為原世界和新世界,所述原世界用以記錄同時(shí)效果發(fā)生時(shí),所有能影響原世界的效果與屬性;所述新世界用以記錄多個(gè)效果處理后的世界;對于屬性類的效果,從原世界中獲取,對于操作類效果,則于新世界中操作。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),其中,卡牌效果處理的核心結(jié)構(gòu)包括效果棧、活動記錄表、事件隊(duì)列、內(nèi)建效果、以及效果解釋器;
所述效果棧用以存儲將要處理的效果,處理效果時(shí)生成新的效果,當(dāng)效果處理完成時(shí)向事件隊(duì)列中添加新的事件;
所述活動記錄表包括使用字典以記錄當(dāng)前可被觸發(fā)的效果,每次對卡牌對象的移動,都將檢查卡牌中所有效果的位置是否與移動后的位置相符,并將其注冊或取消注冊;注冊后的效果可以觸發(fā)的位置,滿足條件即可觸發(fā),該注冊后的效果在活動記錄表中可以查詢到;
所述事件隊(duì)列用于存儲發(fā)生的事件,每次效果結(jié)算時(shí)所有事件都將產(chǎn)生效果,不分先后;
所述內(nèi)建效果用于定義內(nèi)建效果,提供內(nèi)建效果函數(shù)的回調(diào),用以存儲能直接作用于游戲資源的內(nèi)建效果的源代碼;
所述效果解釋器用于記錄當(dāng)前全局與局部資源,遞歸調(diào)用自身,根據(jù)效果調(diào)用將定義效果的抽象語法樹,通過全局資源與當(dāng)前效果獲得對應(yīng)的值或?qū)ο螅D(zhuǎn)化為更內(nèi)層的效果的調(diào)用,直到調(diào)用了內(nèi)建效果;效果調(diào)用的形式為名稱、參數(shù)列表;
所述效果解釋器據(jù)當(dāng)前事件產(chǎn)生會觸發(fā)的效果列表,對活動效果記錄表進(jìn)行條件匹配,直接將前一效果參數(shù)復(fù)制至新效果;其次對效果的實(shí)際動作所對應(yīng)抽象語法樹(ast)進(jìn)行解釋,從而產(chǎn)生新的效果;
所述效果解釋器會直接調(diào)用底層內(nèi)建效果,也會直接處理比較符,建立記錄表,使用字符串與回調(diào)函數(shù)的字典保存。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述卡牌管理模塊包括卡牌效果編輯器,所述卡牌效果編輯器用于編輯效果,實(shí)現(xiàn)手動向數(shù)據(jù)庫添加、修改效果,每條效果是一組效果描述語言語句,每次添加或修改效果時(shí)進(jìn)行文法分析以檢測部分的錯誤;規(guī)則效果與自定義效果分別存儲管理,可對數(shù)據(jù)庫中效果進(jìn)行顯示,每次操作后重新讀入數(shù)據(jù)庫并刷新顯示。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述數(shù)據(jù)庫模塊的數(shù)據(jù)庫系統(tǒng)使用分布式管理,每個(gè)數(shù)據(jù)庫作為一個(gè)文件管理,添加擴(kuò)展包版本編號,游戲時(shí)可定義不同的游戲池,通過版本編號來篩選卡牌。
作為本發(fā)明技術(shù)方案的進(jìn)一步改進(jìn),所述通信模塊將核心化為同一個(gè)線程,將需要顯示給玩家的信息拷貝到緩存中,在每個(gè)游戲響應(yīng)時(shí)間點(diǎn)刷新游戲信息,并將其轉(zhuǎn)化打包為網(wǎng)絡(luò)信息,供多線程玩家客戶端進(jìn)行訪問。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
1)游戲規(guī)則更加獨(dú)立,與核心的耦合性低。
2)游戲規(guī)則機(jī)制更加規(guī)范,歧義與沖突大大減少。
3)由單層結(jié)構(gòu)的效果組成的描述語言可以簡單地圖形化,使得游戲編輯能夠面向更多用戶。
4)框架開放,可以任意修改游戲機(jī)制,并能支持更多地游戲。
附圖說明
圖1為本發(fā)明提供的卡牌游戲引擎模塊結(jié)構(gòu)。
圖2為本發(fā)明提供的桌面游戲各元素間的泛化與包含關(guān)系。
圖3為本發(fā)明提供的世界分支機(jī)制過程。
圖4為本發(fā)明提供的卡牌效果處理流程的活動圖。
具體實(shí)施方式
現(xiàn)結(jié)合說明書附圖對本發(fā)明做詳細(xì)說明。
本實(shí)施例提供一種桌面卡牌游戲引擎,該桌面卡牌游戲引擎的模塊結(jié)構(gòu)如圖1所示,包括核心模塊、控制模塊、文法分析模塊、卡牌管理模塊、數(shù)據(jù)庫模塊、通信模塊;
其中,核心模塊用來模擬實(shí)際效果流程,其中包含實(shí)際效果處理的核心機(jī)制與語言解釋器,與外部獨(dú)立??刂颇K用于處理分發(fā)事件,初始化游戲資源,為主控制流程??ㄅ乒芾砟K用于管理卡牌包、卡牌、效果,可獨(dú)立于游戲單獨(dú)進(jìn)行數(shù)據(jù)庫的編輯,也可用于游戲牌庫編輯。文法分析模塊用于將數(shù)據(jù)庫中卡牌及效果文本轉(zhuǎn)換為可使用的游戲資源,減少處理時(shí)間。通信模塊將實(shí)際游戲中玩家可視資源通過通信方式傳給客戶端,并進(jìn)行操作上的交互。
進(jìn)一步地,所述控制模塊包括游戲初始化單元、游戲設(shè)置讀取單元與游戲主控制流程單元。
所述游戲初始化單元用于創(chuàng)建客戶端資源、客戶端通信線程,加載核心模塊、文法分析模塊、數(shù)據(jù)庫模塊。
所述游戲設(shè)置讀取單元用于將游戲所使用卡牌擴(kuò)展包、游戲規(guī)則效果從數(shù)據(jù)庫模塊中讀取出來,加載至核心模塊中。
所述主控制流程單元用于分發(fā)處理用戶級事件,調(diào)用核心模塊處理效果,將核心模塊中的游戲資源信息顯示給客戶端。
所述文法分析模塊包括效果描述語言的文法結(jié)構(gòu)、lr分析與抽象語法樹的文法解析器。
所述效果描述語言的文法結(jié)構(gòu)包括元素的描述方式、效果的描述方式、以及條件分支與循環(huán)過程結(jié)構(gòu)的支持方式。
所述元素的描述方式包括:
大多數(shù)卡牌類游戲都會有生物、法術(shù)、裝備等不同類型的卡牌,這些牌會游走于戰(zhàn)場的各個(gè)區(qū)域之間,通過效果、戰(zhàn)斗等互動手段來進(jìn)行對決??ㄅ祁愑螒虻幕驹赜校簠^(qū)域、卡牌、效果、屬性,各基本元素間的泛化與包含關(guān)系如圖2所示。
游戲玩家擁有區(qū)域,區(qū)域擁有卡牌,卡牌擁有效果。為了使效果更加靈活,所有對象均可擁有效果,每種對象均擁有屬性。
區(qū)域、卡牌、效果可歸類為對象,對象間使用擁有的方式獲取,具體體現(xiàn)為名稱與屬性或?qū)ο笈c屬性的二元組,對象間是遞歸擁有的。
屬性則是單一值,一般為數(shù)字或字符串,桌面卡牌效果中通常只出現(xiàn)數(shù)字或字符串這兩種值,集體體現(xiàn)為對象與屬性的二元組或常量。
當(dāng)效果不是單一目標(biāo)時(shí),就需要對多個(gè)目標(biāo)進(jìn)行處理;多個(gè)對象可稱為集合,集合由篩選獲得或由對象與集合聚合獲得。
對象聚合可表示為一個(gè)多元組與大小、權(quán)重的組合,多元組中的元素為對象或集合,關(guān)系為相并,支持其他操作是可行的,但并操作配合篩選已經(jīng)能選出所有局面組合,此處只是實(shí)現(xiàn)可行的最小方案。大小用于在縮小集合時(shí),標(biāo)明從待選元素中選擇的元素?cái)?shù)量,權(quán)重用于在隨機(jī)選擇時(shí)賦權(quán)。對象篩選是在某個(gè)位置將滿足條件的對象全部選出,條件可以有復(fù)數(shù)個(gè),篩選后獲得一個(gè)集合,仍可以對其進(jìn)行集合的聚合。
所述效果的描述包括:
將卡牌效果分解為動作,所有每個(gè)動作均視為一個(gè)效果,所述一個(gè)效果含有多條命令,每條命令含有效果調(diào)用名、施法者、目標(biāo)、參數(shù)。其中,所述參數(shù)是可變的,所有參數(shù)都由參數(shù)限定來指定。
文法規(guī)則實(shí)例:
arcane->{command}
command–>identifiercastertargetparams;
params–>identifier:parameter{\|identifier:parameter}
桌面環(huán)境的卡牌游戲中含有分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),本實(shí)施例中各類過程結(jié)構(gòu)的支持方式采用分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。
1)分支結(jié)構(gòu)
形如“若…則…”或“在…的情況下”的分支結(jié)構(gòu)描述。為了使語言描述盡量簡潔并且可視化,在每條命令前加入條件,而所有命令仍構(gòu)成同一效果,每個(gè)效果只可能有一層命令調(diào)用,分支的層數(shù)只有一層,復(fù)雜的分支結(jié)構(gòu)使用多個(gè)效果疊加來實(shí)現(xiàn)。
文法規(guī)則實(shí)例:
block->{[ifcondition{\|condition}]command}
2)循環(huán)結(jié)構(gòu)
自然語言描述中“進(jìn)行x次…”類似的循環(huán)結(jié)構(gòu)描述。出于復(fù)雜度代價(jià)的考慮,選用遞歸的方式模擬可以實(shí)現(xiàn)不定次數(shù)的循環(huán)結(jié)構(gòu)。對于特例,形如“對每個(gè)…”的描述出現(xiàn)頻率較高,加入枚舉的描述可獲得較好的支持。
文法規(guī)則實(shí)例:
target->everycardset
|cardset
所述基于lr分析與抽象語法樹的文法解析器的語言可以簡單地定義于lr文法中,可使用lr分析器進(jìn)行解析,將效果轉(zhuǎn)化為抽象語法樹后存于游戲資源中,更利于下一步處理,效率較高。
所述核心模塊的核心機(jī)制包括基于棧的效果調(diào)用機(jī)制、基于隊(duì)列的事件機(jī)制、屬性棧機(jī)制和世界分支機(jī)制;
基于棧的效果調(diào)用機(jī)制:
在本實(shí)施例中,一切的游戲動作均定義為效果,不論是將目標(biāo)的生命值改變,還是從手牌打出一張卡,或是某些卡牌發(fā)生了戰(zhàn)斗它都是一個(gè)效果,而并不是規(guī)則。
效果可以由效果產(chǎn)生,也可由效果觸發(fā)。產(chǎn)生效果是指效果中所定義的必須發(fā)生的效果,產(chǎn)生效果是原效果的子效果。觸發(fā)效果是指其它效果響應(yīng)原效果后接連發(fā)生,觸發(fā)效果與原效果之間可能并無關(guān)系。
由效果產(chǎn)生或觸發(fā)的效果將在效果棧的最上層出現(xiàn),并優(yōu)先結(jié)算,為了動態(tài)處理接在效果后觸發(fā)的效果,設(shè)置一個(gè)活動表記錄活動的效果,以便在效果結(jié)束時(shí)進(jìn)行搜索,直到調(diào)用了最底層的內(nèi)建效果,則由核心模塊中的內(nèi)建效果對游戲資源進(jìn)行操作。
基于隊(duì)列的事件機(jī)制:
卡牌游戲的離散時(shí)空中不會產(chǎn)生并行的處理流程,本實(shí)施例中通過事件機(jī)制使用串行的方式模擬實(shí)體卡牌上描述的同時(shí)發(fā)生的效果。
當(dāng)一個(gè)效果同時(shí)產(chǎn)生了多個(gè)效果時(shí),在所述多個(gè)效果結(jié)算完畢之前,所述多個(gè)效果將不能觸發(fā)新的效果,但所述多個(gè)效果仍將產(chǎn)生子效果,進(jìn)而對局面進(jìn)行改變,在所述多個(gè)效果的最后一個(gè)效果處理完之前,所述多個(gè)效果的其他前面的效果可能已經(jīng)處理完成。
所述多個(gè)效果全部結(jié)算完畢前,每當(dāng)一個(gè)效果結(jié)算完畢時(shí),則需將已完成的效果加入事件隊(duì)列,當(dāng)所有效果結(jié)算完成后,由事件隊(duì)列中的事件觸發(fā)新的效果,觸發(fā)的效果可根據(jù)任意自定義的順序排序,加入效果棧。
屬性棧機(jī)制:
為了描述屬性中復(fù)雜的計(jì)算過程,采用實(shí)時(shí)演算來計(jì)算屬性。
對屬性的修正分為一次性修正與持續(xù)修正,一次性修正可直接作用在原屬性值上,而持續(xù)修正則實(shí)時(shí)演算屬性值,每當(dāng)顯示卡牌屬性、請求對卡牌屬性進(jìn)行運(yùn)算等需要獲取屬性的情形出現(xiàn)時(shí)均進(jìn)行計(jì)算,故可將屬性獲取與計(jì)算都定義為效果,每當(dāng)獲取某屬性時(shí),獲取的值將觸發(fā)其它修正該值的效果,達(dá)到實(shí)時(shí)演算的目的。屬性獲取過程只演算獲取到的值,而不對屬性原本值進(jìn)行修改。
由于屬性獲取過程不存在對局面的修改,單獨(dú)設(shè)立屬性棧,其基本處理流程與效果棧相同,在處理時(shí)沒有中斷、優(yōu)先度優(yōu)先于效果棧。
世界分支機(jī)制:
對于名義上同時(shí)發(fā)生的效果,存在著另一種更為復(fù)雜的情況。如果同時(shí)發(fā)生的效果以某一順序處理,先處理的效果會產(chǎn)生局面的變動,導(dǎo)致同時(shí)發(fā)生的其它效果的處理方法發(fā)生了變化,這將產(chǎn)生意料之外的結(jié)果。將游戲過程類比為世界,當(dāng)多個(gè)效果同時(shí)發(fā)生時(shí),應(yīng)當(dāng)將當(dāng)前世界復(fù)制兩份并分為兩個(gè)世界:原世界用以記錄同時(shí)效果發(fā)生時(shí),所有能影響此世界的效果與屬性;新的世界用以記錄多個(gè)效果處理后的世界。對于屬性類的效果,從原世界中獲取,對于操作類效果,則于新的世界中操作。
多個(gè)效果同時(shí)發(fā)生,相當(dāng)于多個(gè)操作做卷積,但前提是多個(gè)效果互相不能有重疊,否則將無法在新世界中找到需要操作的對象。當(dāng)結(jié)算完成后,新的世界即為處理后的世界。如圖3所示,一個(gè)移除效果c將同時(shí)移除卡牌a、b,a的效果保護(hù)b,即使a被從新的世界中移除了,仍能從原世界中找到所述移除效果c處理時(shí)有a的效果在保護(hù)b,b將不被移除。
其中,卡牌效果處理流程如圖4所示,卡牌效果處理的核心結(jié)構(gòu)包括效果棧、活動記錄表、事件隊(duì)列、內(nèi)建效果、以及效果解釋器;
所述效果棧用以存儲將要處理的效果,處理效果時(shí)生成新的效果,當(dāng)效果處理完成時(shí)向事件隊(duì)列中添加新的事件;
所述活動記錄表包括使用字典以記錄當(dāng)前可被觸發(fā)的效果,每次對卡牌對象的移動,都將檢查卡牌中所有效果的位置是否與移動后的位置相符,并將其注冊或取消注冊。注冊后的效果意味著其在可以觸發(fā)的位置,滿足條件即可觸發(fā),該注冊后的效果在活動記錄表中可以查詢到。
所述事件隊(duì)列用于存儲發(fā)生的事件,每次效果結(jié)算時(shí)所有事件都將產(chǎn)生效果,不分先后。
所述內(nèi)建效果用于定義內(nèi)建效果,提供內(nèi)建效果函數(shù)的回調(diào),用以存儲能直接作用于游戲資源的內(nèi)建效果的源代碼。
所述效果解釋器用于記錄當(dāng)前全局與局部資源,遞歸調(diào)用自身,根據(jù)效果調(diào)用將定義效果的抽象語法樹,通過全局資源與當(dāng)前效果獲得對應(yīng)的值或?qū)ο螅D(zhuǎn)化為更內(nèi)層的效果的調(diào)用,直到調(diào)用了內(nèi)建效果。效果調(diào)用的形式為名稱、參數(shù)列表。
所述效果解釋器據(jù)當(dāng)前事件產(chǎn)生會觸發(fā)的效果列表,對活動效果記錄表進(jìn)行條件匹配,直接將前一效果參數(shù)復(fù)制至新效果。其次對效果的實(shí)際動作所對應(yīng)抽象語法樹(ast)進(jìn)行解釋,從而產(chǎn)生新的效果。
所述效果解釋器會直接調(diào)用底層內(nèi)建效果,也會直接處理比較符,建立記錄表,使用字符串與回調(diào)函數(shù)的字典保存。
卡牌管理模塊與數(shù)據(jù)庫模塊:
為了實(shí)現(xiàn)對于任意游戲,可編輯游戲規(guī)則,并且快速的自定義效果。本實(shí)施例首先創(chuàng)建了卡牌效果編輯器用以編輯效果,可以手動向數(shù)據(jù)庫添加、修改卡牌效果。每條效果是一組效果描述語言語句,每次添加或修改效果時(shí)進(jìn)行文法分析,可以檢測部分的錯誤。規(guī)則效果與自定義效果分別存儲管理,可對數(shù)據(jù)庫中效果進(jìn)行顯示,每次操作后重新讀入數(shù)據(jù)庫并刷新顯示。
所述數(shù)據(jù)庫模塊的數(shù)據(jù)庫系統(tǒng)使用分布式管理,也是考慮到對于玩家的自定義庫管理,每個(gè)數(shù)據(jù)庫作為一個(gè)文件管理,添加擴(kuò)展包版本編號,游戲時(shí)可定義不同的游戲池,通過版本編號來篩選卡牌。
將卡牌效果編輯器進(jìn)行擴(kuò)展,從已有數(shù)據(jù)庫表中選擇“效果名”、“區(qū)域名”、“屬性名”等信息,采用樹形結(jié)構(gòu)化的方式創(chuàng)建圖形化的遞歸效果編輯器,用以圖形化創(chuàng)建、修改新效果。
通信模塊:
目前核心模塊的設(shè)計(jì)過程使用的容器均沒有考慮線程安全的問題,因此本實(shí)施例在核心模塊中使用單線程,將需要顯示給玩家的信息拷貝到緩存中,在每個(gè)游戲響應(yīng)時(shí)間點(diǎn)由控制模塊讀取并刷新游戲信息,并將游戲信息轉(zhuǎn)化打包為網(wǎng)絡(luò)信息,供多線程玩家客戶端進(jìn)行訪問。
顯然,本發(fā)明的上述實(shí)施例僅僅是為清楚地說明本發(fā)明所作的舉例,而并非是對本發(fā)明的實(shí)施方式的限定。對于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動。這里無需也無法對所有的實(shí)施方式予以窮舉。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。