亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于多進程的抗擊生物病毒游戲的設計與實現(xiàn)

        2021-07-19 21:25:19曾雨陽趙建喆
        電腦知識與技術(shù) 2021年14期

        曾雨陽 趙建喆

        摘要:隨著網(wǎng)絡的迅速發(fā)展,多人在線游戲備受歡迎。選取抗擊生物病毒的主題,通過多線程等技術(shù)開發(fā)了游戲,多個客戶端可以通過socket連接服務器,實現(xiàn)通信與交互。旨在借助多人在線游戲的特點,傳遞抗擊生物病毒的精神力量。

        關鍵詞:多進程;多線程;多人在線游戲

        中圖分類號:TP311? ? ? 文獻標識碼:A

        文章編號:1009-3044(2021)14-0047-02

        Abstract: With the rapid development of the Internet, multiplayer online games are very popular. Fighting biological virus is selected as the topic of the game. Through multi-threading technology, the game is developed. To achieve communication and interaction, multiple clients can be connected to the server via socket. The spirit of fighting biological virus is transferred using the characteristics of multiplayer online games.

        Key words: multi-process; multi-threading; multiplayer online game

        1 背景

        本文設計并實現(xiàn)了一個基于多進程、多人在線操作的抗擊生物病毒游戲。

        玩家可以自由控制自己的“醫(yī)生”角色,當與對面來的病毒相遇時,玩家醫(yī)生血量減少;當與對面來的疫苗或口罩道具相遇時,玩家會獲得積分。

        游戲?qū)崿F(xiàn)了以下功能:上下左右按鍵自由控制“醫(yī)生”角色的移動。隨機生成病毒、疫苗和口罩道具,這些障礙物會以不同的速度勻速自上而下移動。玩家血量減少、玩家積分、失敗和重新開始等。界面顯示生命值和得分。

        游戲具有多人聯(lián)機協(xié)同的功能。客戶端使用Java與Swing實現(xiàn),服務端使用C/C++混合編程,實現(xiàn)了多進程、多線程、進程間通信和多路復用等技術(shù)[1-2]。

        2 系統(tǒng)設計

        2.1 架構(gòu)設計

        游戲客戶端使用Java Swing作為前端GUI,使用Java作為客戶端邏輯,服務端使用C/C++混合編程實現(xiàn),客戶端與服務端使用Socket TCP協(xié)議連接[3]。架構(gòu)設計如圖1所示。

        客戶端不負責進行關鍵邏輯判斷,只負責接收消息并將處理后的消息展示到GUI界面,服務端負責實現(xiàn)病毒、口罩和疫苗道具等障礙物對象的生成、相遇判斷等,有效地避免了客戶端可能發(fā)生的作弊現(xiàn)象,保證了游戲的公平性與安全性。

        服務端使用多進程、多線程、進程間通信和多路復用技術(shù),實現(xiàn)思路如圖2所示。

        子進程用于運行游戲,異常退出等對于主進程的影響小。父子進程之間使用信號機制進行通信,子進程使用多線程同時處理數(shù)據(jù),使用多路復用輪詢所有客戶端[4]。

        2.2 server服務器端的邏輯

        2.2.1 main()主運行進程

        初始化內(nèi)存,給服務器網(wǎng)絡地址結(jié)構(gòu)體sockaddr_in設置TCP協(xié)議,設置為可以連接任意的IP地址,服務器端口號設置為8888。按照socket()、bind()、listen()和accept()的順序監(jiān)聽端口。

        socket()獲取服務器端socket的文件描述符,采用IPv4和TCP協(xié)議。bind()將服務器端socket綁定到服務器的地址和端口上(服務器網(wǎng)絡地址結(jié)構(gòu)體sockaddr_in)。listen()監(jiān)聽8888端口號上的連接請求,進入的連接請求在使用系統(tǒng)調(diào)用accept()應答之前要在進入隊列中等待。signal(SIGUSR1, father_listen)設置信號的處理函數(shù)。

        2.2.2 調(diào)用father_listen()函數(shù)

        父進程監(jiān)控為father_listen()。accept()處理連接8888端口的請求,獲取客戶端的socket文件描述符(用來調(diào)用send()和recv()),并放入玩家列表player_list中。對該客戶端連接,fork()創(chuàng)建子進程,子進程中啟動主客戶端進程main_client。掛起父進程,直到收到SIGUSR1的信號。

        2.2.3 main_client()主客戶端進程

        創(chuàng)建兩個線程,分別用于調(diào)整障礙物移動obstacle_run和獲取新客戶端get_new_client。初始化障礙物列表,包括其種類和初始位置。服務器主進程通過多路復用以監(jiān)聽客戶端。多路分離函數(shù)select()實現(xiàn)多路復用,在同一個線程內(nèi)同時處理多個請求,不斷輪詢所負責的socket。監(jiān)視fd文件描述符是否可讀取,是否有數(shù)據(jù)到來。當可讀取時,用recv()函數(shù)從TCP連接的另一端接收數(shù)據(jù),存放在長度為1024的buff緩沖區(qū)中。以逗號為分界,切割客戶端發(fā)來的數(shù)據(jù)字符串,處理數(shù)據(jù)。根據(jù)這些數(shù)據(jù),在服務器中更新對應ID的玩家數(shù)據(jù)。連接成功后為客戶端創(chuàng)建玩家控制對象,初始坐標隨機。并用sendData()將數(shù)據(jù)發(fā)回客戶端,通知連接成功。

        3 關鍵部分程序?qū)崿F(xiàn)

        3.1 Socket通信

        本游戲采用了Java Swing作為客戶端,利用Socket在兩種語言間發(fā)送消息[5]。在連接client和server的過程中,Java與C發(fā)送接收數(shù)據(jù)時應該將String類型的字符串中包含的字符轉(zhuǎn)換成byte類型,存入到一個byte[]數(shù)組中,且應該指定編碼形式,否則會出現(xiàn)亂碼的現(xiàn)象(Java默認使用UTF-8,C++默認使用GBK),例如,使用語句toServer.write((ID + ",connected,").getBytes("GB2312"))。

        在服務端,獲取客戶端的socket文件描述符作為客戶端新的連接,其中包含客戶端ip和port,具體語句如下:

        client_socket = accept(server_socket, (struct sockaddr *)&remote_addr, (socklen_t *)&client_len);

        服務端將這個請求的新文件描述符放到player_list中,視為一個新的玩家對象。如果客戶端沒有新的連接,則關閉客戶端socket,并在父進程中,把調(diào)用進程掛起pause(),直至捕獲到一個SIGUSR1的信號。

        在客戶端,通過while(true)循環(huán)讀取服務器傳來的數(shù)據(jù),通過String(readBuff).trim()去除數(shù)據(jù)中的空白符,處理并判斷服務器返回的數(shù)據(jù),如果判斷游戲結(jié)束,則顯示“再來一次”按鈕,并結(jié)束游戲,否則繼續(xù)顯示游戲操作提示信息和玩家當前坐標。

        3.2 多線程

        通過pthread_create()創(chuàng)建服務器全局障礙物調(diào)整的線程,如果創(chuàng)建成功,該函數(shù)返回值為零。同樣方法創(chuàng)建第二個用于監(jiān)聽是否有新的客戶端傳入的線程。多線程以實現(xiàn)病毒、疫苗和口罩道具的勻速自上而下移動,以及多人在線操作的功能。

        3.3 多路復用

        使用select()函數(shù)實現(xiàn)多路復用,以監(jiān)視fd文件描述符是否可以讀取。select()函數(shù)會不斷輪詢所負責的socket,監(jiān)測是否有數(shù)據(jù)到來。用recv()函數(shù)從TCP連接的另一端接收數(shù)據(jù),存放在長度為1024的buf緩沖區(qū)中。具體實現(xiàn)方法如下:

        ret_val = select( nfds: player_list[client_num - 1] +1, &rfds, writefds: NULL, exceptfds: NULL, stv);

        recv(player_list[i], buf, n:1024, flags: 0)。

        3.4 病毒、口罩和疫苗道具等障礙物的位置移動

        使用obstacle_run()函數(shù)實現(xiàn)障礙物的移動。通過隨機數(shù)發(fā)生器的初始化函數(shù)srand(),使用系統(tǒng)時間作為種子,以隨機產(chǎn)生障礙物的種類。不同種類障礙物設置不同的移動步長,產(chǎn)生不同的移動速度效果。

        遍歷所有的障礙物對象,將障礙物所有服務端處理后的數(shù)據(jù)(如ID、位置、種類等)發(fā)送給玩家列表里所有的玩家客戶端,以實現(xiàn)所有病毒、口罩和疫苗道具等障礙物的位置移動。

        3.5 相遇檢測

        假設兩個移動對象中心點的距離為變量a,兩個移動對象的邊緣矩形中心點對角線的距離為變量b,只要a小于b,那么就判定兩者相遇。

        4 總結(jié)

        利用Java Swing構(gòu)建界面,利用Java和C兩種語言分別搭建客戶端與服務端并進行交互,趣味性強。游戲為實時網(wǎng)絡游戲,多個玩家連接服務器進行游戲,合理有效地使用了多進程、多線程、信號機制和多路復用等技術(shù),數(shù)據(jù)交互具有較好的實時性和準確性。游戲的業(yè)務部分都在服務器端處理,而客戶端主要用于接收用戶的輸入及顯示,保證了游戲的公平性和安全性。

        服務端具有一定的健壯性,具有較好的性能,游戲邏輯較為復雜(隨機生成障礙物移動對象、鍵盤控制玩家對象、障礙物相遇檢測等)。選擇抗疫題材,玩家通過此游戲可以獲得積極向上,共克時艱的昂揚精神力量,這樣的游戲可以為抗擊疫情貢獻一份精神力量。

        參考文獻:

        [1] 呂佳歡,蔣富,金易.基于Java的炸彈人游戲設計[J].電腦知識與技術(shù),2020,16(25):97-98.

        [2] Fang W J,Wang C L,Lau F C M.On the design of global object space for efficient multi-threading Java computing on clusters[J].Parallel Computing,2003,29(11/12):1563-1587.

        [3] 傅玥,蔡興富.Socket網(wǎng)絡編程-基于TCP協(xié)議或UDP協(xié)議[J].中國新通信,2020,22(8):57-58.

        [4] Himang M M,Himang C M,Ceniza A M,et al.Using an extended technology acceptance model for online strategic video games[J].International Journal of Technology and Human Interaction,2021,17(1):32-58.

        [5] 劉賢梅,劉俊,賈迪.Unity引擎下多人在線網(wǎng)絡游戲的設計與開發(fā)[J].計算機系統(tǒng)應用,2020,29(5):103-109.

        【通聯(lián)編輯:謝媛媛】

        一本一道久久综合久久| 久久综合加勒比东京热| 揄拍成人国产精品视频| 久久国产成人亚洲精品影院老金| 亚洲男人在线无码视频| 久久久人妻精品一区bav| 国产亚洲视频在线播放| 亚洲一区二区三区播放| 色先锋资源久久综合5566| 国产成人一区二区三区高清| 黄色潮片三级三级三级免费| 亚洲av区,一区二区三区色婷婷| 蜜桃av抽搐高潮一区二区| 中文字幕一区二区三区精彩视频| 青草热久精品视频在线观看| 亚洲精品精品日本日本| 大香焦av一区二区三区| 久久久久国产一区二区| av无码av在线a∨天堂app| 91国产自拍视频在线| 国产91色综合久久高清| 极品少妇被猛的白浆直喷白浆| 亚洲暴爽av天天爽日日碰| 亚洲精品国产福利在线观看 | 97欧美在线| 亚洲中文字幕巨乳人妻| 国产精品av免费网站| 水蜜桃在线观看一区二区| 亚洲色丰满少妇高潮18p| 伊人22综合| 精品亚洲人伦一区二区三区| 99久久婷婷国产精品综合| 少妇人妻综合久久中文字幕| 欧美色欧美亚洲另类二区不卡| 一道本中文字幕在线播放| 边添小泬边狠狠躁视频| 国产自偷亚洲精品页65页| 日韩啪啪精品一区二区亚洲av| 国产亚洲中文字幕久久网| 在线中文字幕乱码英文字幕正常 | 美利坚日韩av手机在线|