戴培山 馬凌堯 范敏
摘要: 隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,卡牌游戲的種類和呈現(xiàn)方式變得越來越多樣化。然而,許多極具地方特色的卡牌游戲卻很少有在線娛樂方式。本設(shè)計使用Unity2019作為開發(fā)引擎,結(jié)合Visual Studio 2019開發(fā)工具,運用Socket通信技術(shù)、UI消息框架和相關(guān)C#語言知識實現(xiàn)了一款多人在線卡牌游戲。本游戲從服務(wù)器和客戶端兩個板塊進行設(shè)計,其中服務(wù)器由網(wǎng)絡(luò)通信、游戲邏輯處理和游戲數(shù)據(jù)緩存三部分組成,客戶端則包括用戶注冊登錄模塊、角色信息模塊和戰(zhàn)斗房間模塊。在開發(fā)過程中,本設(shè)計成功實現(xiàn)了多人在線通信、房間分配、卡牌發(fā)放和洗牌等多種算法,并將C#語言中面向?qū)ο蟮奶匦园l(fā)揮到了極致。玩家可以注冊賬號并自定義角色名稱,在閑暇時刻體驗多人實時在線的游戲?qū)Q。本設(shè)計的實現(xiàn)打破了地方性棋牌游戲的局限性,各地區(qū)的玩家都能夠感受到豐富的地方性卡牌游戲帶來的樂趣。
關(guān)鍵詞:Unity;卡牌游戲;多人在線;UI消息框架; Socket通信
中圖分類號:TP311 文獻標識碼:A文章編號:1009-3044(2023)29-0001-05
0 引言
卡牌游戲是一種棋類游戲,自產(chǎn)生以來,就因其具有多樣化的玩法、自由的空間、休閑娛樂、智力挑戰(zhàn)和互動性強等特點而受到各個年齡段和地區(qū)人群的喜愛。撲克牌的傳入在一定程度上統(tǒng)一了中國上一代人的卡牌游戲類型并影響至今。同時,撲克牌的玩法也因中國的地大物博而變得多種多樣,越來越多極具地方性特色的撲克牌游戲都在其發(fā)源地廣受歡迎[1]。
隨著移動互聯(lián)網(wǎng)技術(shù)的高速發(fā)展和智能移動設(shè)備的普及,社會進步得更快。人們將更多時間用于工作,導(dǎo)致閑暇時間變得零碎。這種現(xiàn)象促使移動在線游戲的出現(xiàn),并逐漸取代傳統(tǒng)的線下游戲??ㄅ祁愑螒虻木€上運營也因此引來了熱潮。
由于受眾規(guī)模和開發(fā)效益等因素的影響,目前市場上絕大多數(shù)的卡牌類游戲都以全國性的卡牌游戲為主。而具有地方性特色的卡牌游戲很少有團隊進行開發(fā)。許多在外求學(xué)或是工作的異鄉(xiāng)人很難在休閑時間找到可以和自己一起娛樂的玩家。在線地方特色卡牌游戲可以解除空間上的限制,不論大家在哪里,都可以在線上體驗到全國各地的卡牌玩法??臻g、時間上的自由、玩法的多樣性、娛樂與益智共存等特點將會吸引越來越多的受眾人群。此類游戲的實現(xiàn)將為大家提供一個方便、豐富的交友娛樂平臺。
1 在線牌類游戲研究現(xiàn)狀
20世紀以來,移動互聯(lián)網(wǎng)的出現(xiàn)改變著新世紀人們的生活方式,在廣大的游戲市場中異軍突起的便是網(wǎng)絡(luò)游戲[2]。自此之后,在短短的10年里,國內(nèi)涌現(xiàn)出了一大批游戲公司,從剛開始的盛大、金山到現(xiàn)在的騰訊、網(wǎng)易。國內(nèi)主流的游戲基本上都誕生在這些大游戲公司。廣大的游戲玩家為這些公司帶來了不錯的經(jīng)濟效益,也促使一大批計算機從業(yè)者開始從事游戲開發(fā)工作。作為新興產(chǎn)業(yè),游戲產(chǎn)業(yè)從萌芽走向成熟只用了短短15年的時間[3],并且已經(jīng)成為網(wǎng)絡(luò)經(jīng)濟不可或缺的組成部分。其中棋牌類游戲無疑是屬于元老級的存在,并在歷史的潮流中不停地發(fā)展演變[4]。除全國性游戲平臺外,各種各樣的地方性平臺涌現(xiàn)出來,尤其在北方地區(qū)較為明顯。隨著地方性棋牌游戲火熱程度的加深,游戲平臺的目標受眾也更加細化,出現(xiàn)了專門為溫州市民研發(fā)的“溫州牛?!钡扔螒蚱脚_,游戲內(nèi)的圖片和方言聊天充滿著濃郁的地方特色。在博大精深的中華文化孕育之下,全國各地誕生了不計其數(shù)的卡牌玩法,仍有許多地方游戲沒有得到線上化,這也促進著棋牌游戲的進一步發(fā)展。
2 游戲開發(fā)環(huán)境
本文卡牌游戲采用Unity2019游戲引擎開發(fā),編程工具為Visual Studio 2019,編程語言為C#語言。
3 游戲架構(gòu)設(shè)計
主要包括游戲項目的整體框架、游戲運行流程、游戲規(guī)則設(shè)計、游戲功能實現(xiàn)。
3.1 游戲規(guī)則設(shè)計
此卡牌游戲規(guī)則[5]如下:
① 游戲共有52張卡牌,數(shù)值為3、4、5、6、7、8、9、10、J、Q、K、A、2,每個數(shù)值共有4張,分別為4個不同花色:紅心、黑桃、方片、梅花,沒有大小王。
② 游戲開始時,3名玩家各隨機發(fā)放5張卡牌,系統(tǒng)隨機設(shè)置首位出牌玩家,并多發(fā)給其1張牌。
③ 玩家出牌類型可包括:
單牌:單獨1張卡牌,如:3、5、7等;
對子:兩張數(shù)值相同的卡牌,如44、77、QQ等;
順子:至少3張數(shù)值相連的卡牌,如:456、JQK,但KA2、A23、234不能出牌;
炸彈:至少3張數(shù)值相同的卡牌,如:555、6666、JJJ等。
④ 所有玩家依次選擇是否出牌,合法的出牌如下:出牌類型應(yīng)和場上出牌配型相同,且數(shù)值只能大于1,如:3只能被4壓,不可被5壓,對55只能被66壓,456只能被567壓;單張2 可以壓所有的單牌,對2 可以壓所有的對子;炸彈可以壓所有的非炸彈牌,4張牌的炸彈不論數(shù)值都可以壓3張牌的炸彈,牌數(shù)相同的炸彈,數(shù)值高的炸彈可以壓數(shù)值低的炸彈,場上每打出一套炸彈,場上的倍數(shù)就×2。
⑤ 當(dāng)玩家出的牌使其余兩位玩家都無法出牌管上時,該玩家摸一張牌,繼續(xù)出牌。
⑥ 當(dāng)場上有玩家將手牌出完時,該玩家獲得勝利,其余玩家失敗,勝利玩家獲得100經(jīng)驗和“1 000× 倍數(shù)”的豆子,失敗玩家獲得10經(jīng)驗并失去“1 000×倍數(shù)”的豆子。
3.2 游戲功能架構(gòu)
本游戲?qū)崿F(xiàn)了可多人在線娛樂的唬牌游戲,主要功能如圖1所示。
3.2.1 服務(wù)器功能
服務(wù)器端主要為本設(shè)計提供了網(wǎng)絡(luò)通信、數(shù)據(jù)緩存和邏輯處理三大部分的功能。1) 網(wǎng)絡(luò)通信。多人在線的關(guān)鍵在于不同的客戶端可以同時進入一個房間內(nèi)進行游戲,玩家的操作可以在房間內(nèi)廣播,戰(zhàn)斗的信息會實時地傳遞到房間內(nèi)的每個客戶端,玩家之間可以在房間內(nèi)進行文字聊天,服務(wù)器端的網(wǎng)絡(luò)通信[6]使得這一部分的功能順利實現(xiàn)。2) 數(shù)據(jù)緩存。在整個設(shè)計過程中,有許多信息需要服務(wù)器進行保存,以方便所有的客戶端既可以訪問到這些數(shù)據(jù),又可以節(jié)省存儲空間。本文中,服務(wù)器端存儲了所有玩家的共享信息,如:賬號密碼庫、卡牌庫、房間庫、用戶信息庫等,客戶端可以通過相對應(yīng)的操作碼向服務(wù)器發(fā)起請求來訪問這些數(shù)據(jù)。3) 邏輯處理。邏輯模塊是整個系統(tǒng)順利運行的核心所在。
在服務(wù)器端,實現(xiàn)了賬號密碼的部分合法性判斷、房間匹配機制、戰(zhàn)斗回合制管理、出牌合法邏輯塊、卡牌發(fā)放與回收、戰(zhàn)斗結(jié)算等功能。這些算法的實現(xiàn)在邏輯和內(nèi)存管理上為客戶端的處理提供了方便的接口,統(tǒng)一了客戶端的操作碼。
客戶端功能??蛻舳嗽跒橥婕姨峁┝艘粋€簡潔友好的頁面基礎(chǔ)上,實現(xiàn)了卡牌游戲的各項基本功能,主要包括以下6部分:1) 賬號注冊和登錄。用戶可以自己注冊游戲賬號,設(shè)置賬號登錄密碼,由服務(wù)器端進行密碼是否合法的判斷并給予用戶相關(guān)提示;用戶可以使用自己已注冊的正確的賬號密碼登錄游戲,體驗唬牌游戲世界。2) 用戶信息初始化。當(dāng)注冊的賬號初次登錄時,用戶可以自定義自己的游戲名稱,名稱確認之后,由系統(tǒng)進行用戶信息的初始化,所有用戶初始等級為1級,初始豆子數(shù)量為1 000。3) 房間匹配機制。系統(tǒng)會設(shè)置匹配房間列表,為所有準備進入大廳的玩家分配房間,以供給玩家游戲使用;當(dāng)房間內(nèi)玩家全部退出房間之后,系統(tǒng)會回收該房間,給其他準備進入大廳的玩家使用。4) 游戲戰(zhàn)斗功能。當(dāng)所有玩家進入房間準備之后,戰(zhàn)斗場景開始,系統(tǒng)隨機為玩家發(fā)牌,3名玩家可以按照游戲規(guī)則順利進行游戲;在游戲結(jié)束之后,系統(tǒng)會根據(jù)玩家的勝負情況為玩家增加經(jīng)驗值并獎懲一定數(shù)量的豆子。5) 在線聊天功能。房間內(nèi)的玩家可以通過快捷喊話按鈕,選擇自己想要發(fā)送消息,系統(tǒng)會將文字信息展示在房間內(nèi),并播放相關(guān)語音。6) 設(shè)置功能。在設(shè)置面板,用戶可以開啟/關(guān)閉背景音樂,也可以自由調(diào)節(jié)背景音樂的聲音大小。
4 游戲設(shè)計難點實現(xiàn)
4.1 客戶端和服務(wù)器之間的通信通過Socket 通信實現(xiàn)
在C/S模式中,客戶端和服務(wù)器之間需要進行頻繁的信息傳遞。而這兩者之間的通信方式一般為HTTP通信和Socket通信兩種[7]。這兩個在功能上都可以滿足客戶端與服務(wù)器之間的數(shù)據(jù)傳輸。但是不同于HTTP通信中的“請求響應(yīng)方式”,Socket通信則更為直接,它會在雙方連接成功的基礎(chǔ)上直接進行信息傳遞,不需要請求和響應(yīng)。所以本文用Socket通信實現(xiàn)客戶端和服務(wù)器之間的通信。
1) TCP和UDP協(xié)議
在實現(xiàn)Socket通信時,經(jīng)常使用到運輸層的兩個協(xié)議TCP協(xié)議和UDP協(xié)議[8]。TCP指的是用戶數(shù)據(jù)報協(xié)議,可以提供面向連接和可靠傳輸兩個服務(wù),但是沒有時間保證和最小傳輸速率保證,常見的面向連接服務(wù)就是“三次握手”的過程。雖然可以隨時進行數(shù)據(jù)傳輸,但是由于傳輸過程會消耗一定的時間,所以并不能確保做到實時傳輸。
UDP指的是傳輸控制協(xié)議,它不需要像TCP協(xié)議那樣一定要雙方連接起來,它可以直接發(fā)送,但是并不能確保信息是否被對方接收成功,也不能確保對方收到的報文是否出錯。常用于實時消息的傳輸。
本設(shè)計實現(xiàn)的Socket 通信是基于TCP 協(xié)議[9]設(shè)計的。
2) Socket抽象層
3) C/S模式連接流程圖
4.2 UI 消息框架
UI(User Interface) 是指提供給用戶一個簡潔、美觀的頁面。它包含視覺方面的文字、動畫、圖片,以及聽覺上的音效和BGM,同時還要有常見的人機交互組件,如點擊按鈕和滑動滾動條等。隨著時代的進步,人們對UI界面的需求量和質(zhì)量要求都有所提高,這使得開發(fā)者需要更高的技術(shù)水平來滿足用戶需求。UI 框架為開發(fā)者提供了一套完整的基礎(chǔ)工具。開發(fā)者可以利用這些框架,進行基本的UI設(shè)計。UI可以幫助游戲開發(fā)者進行基本的UI設(shè)計,優(yōu)質(zhì)的UI框架可以在保證系統(tǒng)效率的同時,降低代碼耦合度[10]。本文使用UI消息框架主要作為一個消息傳遞中心,各個邏輯單元發(fā)出來的消息處理都會經(jīng)過MsgCenter 進行轉(zhuǎn)發(fā)。
4.3 洗牌算法
在玩撲克牌時,需要對一副撲克牌進行順序打亂,保證所有玩家獲取到每張卡牌的概率是相等的,從而增加整個游戲的隨機性[11],常見的洗牌方法有兩種:全局洗牌法和局部洗牌法[12]。
這2種洗牌法都是基于一個數(shù)組實現(xiàn)的。
全局洗牌法會按照數(shù)組的索引,從1~54依次生成一個余數(shù)value,value = rand % 54,其中rand為系統(tǒng)產(chǎn)生的隨機數(shù),將當(dāng)前索引的值和余數(shù)對應(yīng)索引的卡牌進行交換,直到遍歷到最后一個結(jié)束,以此達到洗牌的目的。然而,這樣實現(xiàn)的話就會導(dǎo)致前面洗過的牌可能會再次被遍歷到,所以可以將余數(shù)value的計算方式進行改進,令value = index + rand % (54 - in?dex),這樣就可以保證索引牌和之前沒有交換過的牌進行交換,更高效地洗牌。
在本設(shè)計中,仍然采用數(shù)組的形式,每個數(shù)組元素都是一個卡牌模型,通過打亂索引實現(xiàn)了洗牌算法,具體實現(xiàn)在如下。
包含52張基本卡牌,并實現(xiàn)了對這些卡牌的基本算法。
1) 創(chuàng)建卡牌庫。
通過兩層for循環(huán),第一層循環(huán)花色,第二層循環(huán)點數(shù),依次將52 張卡牌模型添加到CardQueue 隊列中,對每張卡牌命名為“花色+點數(shù)”,如:“紅桃3”為“Heart Three”。
2) 洗牌算法
通過for循環(huán)創(chuàng)建的卡牌隊列一定是一個花色和點數(shù)成規(guī)律的隊列,為了方便發(fā)牌時隨機出隊列的復(fù)雜,這里直接實現(xiàn)洗牌算法,發(fā)牌時選擇洗過之后的卡牌庫,依次出隊列發(fā)牌得到的就是隨機分發(fā)的卡牌了。
算法實現(xiàn):創(chuàng)建一個新的卡牌隊列newList,通過foreach方法依次讀取CardQueue隊列中的卡牌。每次都在0到newList.count+1中隨機生成一個整數(shù)索引in?dex,并在newList列表的index位置處插入讀取到的卡牌,直到CardQueue中的卡牌全部被讀取過。由于in?dex索引的位置是通過Random隨機生成的,所以即使讀取的卡牌有順序,但卡牌的插入位置是無序的,結(jié)果仍然可以得到一個無序的卡牌列表。清空原有的CardQueue隊列,將newList列表中的卡牌依次拿出并添加到CardQueue隊列中,這樣就完成了對52張卡牌的洗牌。
4.4 房間傳輸對象
房間傳輸對象是一個DTO (Data Transfer Objects,數(shù)據(jù)傳輸對象)模型。它包括了用戶id與用戶模型的映射列表、已準備的玩家列表、玩家進入房間的順序列表UIdList。除了基本的進入、離開、準備的初始化外,還實現(xiàn)了對房間內(nèi)玩家座次的定位。對于每個客戶端而言,由于其進入房間的順序不同,在UidList列表中的位置也不一樣。但是要求每個客戶端都將自身放在最下方的位置,這就要求每個客戶端根據(jù)自己在UidList列表中的序號來顯示自己左右兩邊分別是幾號玩家。如圖7所示。
5 游戲效果演示
圖8是設(shè)計的在線地方特色卡牌游戲的開始界面。包括注冊賬號和開始游戲的功能。點擊注冊賬號,會進行一些合法性判斷。
若兩次輸入密碼不匹配或者注冊賬號已經(jīng)存在就會導(dǎo)致注冊失敗。登錄成功后可以創(chuàng)建玩家角色,如圖9所示。開始游戲后,會首先尋找可進入的游戲房間,如圖10所示。游戲過程中還可以設(shè)置背景音樂,還設(shè)有玩家進入游戲玩家等待,準備開始游戲等功能。所有玩家準備好后,游戲開始,隨機選出一名玩家作為第一個出牌者。出牌之后,在其他玩家的頁面可以看到桌面卡牌信息。圖10為三人在線玩游戲的畫面。出牌結(jié)束后,顯示勝利和失敗,其中勝利結(jié)果如圖12所示,退出游戲后,服務(wù)器收到反饋。
參考文獻:
[1] 于振璽,齊江華.地方性網(wǎng)絡(luò)棋牌游戲發(fā)展前景初探[J].電影
評介,2013(11):111-112.
[2] 靖亮.中國網(wǎng)絡(luò)游戲發(fā)展現(xiàn)狀淺析[J].大眾文藝,2013(19):
196-197.
[3] 程彬彬,王明鑫,商楠.淺談游戲開發(fā)平臺Unity3D的應(yīng)用與
發(fā)展前景[J].通訊世界,2016(14):236.
[4] RANGANATHAN D V,Vishal R,Krishnamurthy V,et al.Design
patterns for multiplayer card games[C]//2017 International Con?
ference on Computer, Communication and Signal Processing
(ICCCSP).January 10-11,2017,Chennai,India.IEEE,2017:1-3.
[5] 吳汀兒.桌面游戲的設(shè)計與開發(fā)研究[D].南京:南京師范大
學(xué),2011.
[6] JIA W J,JIANG T.Information-defined networks:a communica?
tion network approach for network studies[J].China Communica?
tions,2021,18(7):197-210.
[7] 倪建新.基于Socket協(xié)議的移動數(shù)據(jù)交互研究及實現(xiàn)[J].電
腦知識與技術(shù),2017,13(30):17-18,43.
[8] LEE S H,SEOK S J,Kang C G,et al.The two markers system for
TCP and UDP flows in a differentiated services network[J].Com?
puter Communications,2003,26(4):338-350.
[9] BRETT J,Simons A.Implementation of the unity engine for de?
veloping 2D mobile games in consideration of start-up/student
developers[M]//E-Learning and Games.Cham:Springer Interna?
tional Publishing,2017:271-278.
[10] 莊兒,劉喜昂,龔婷.基于面向?qū)ο蟮腢I框架體系[J].福建電
腦,2007,23(4):156-157.
[11] JONASSON J,Morris B.Rapid mixing of dealer shuffles and
clumpy shuffles[J]. Electronic Communications in Probability,
2015, (20):1-11.
[12] 張子健.某卡牌游戲系統(tǒng)設(shè)計與開發(fā)[D].成都:電子科技大
學(xué),2019.
【通聯(lián)編輯:唐一東】