999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于多進程的抗擊生物病毒游戲的設計與實現

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

曾雨陽 趙建喆

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

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

中圖分類號: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 背景

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

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

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

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

2 系統設計

2.1 架構設計

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

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

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

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

2.2 server服務器端的邏輯

2.2.1 main()主運行進程

初始化內存,給服務器網絡地址結構體sockaddr_in設置TCP協議,設置為可以連接任意的IP地址,服務器端口號設置為8888。按照socket()、bind()、listen()和accept()的順序監聽端口。

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

2.2.2 調用father_listen()函數

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

2.2.3 main_client()主客戶端進程

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

3 關鍵部分程序實現

3.1 Socket通信

本游戲采用了Java Swing作為客戶端,利用Socket在兩種語言間發送消息[5]。在連接client和server的過程中,Java與C發送接收數據時應該將String類型的字符串中包含的字符轉換成byte類型,存入到一個byte[]數組中,且應該指定編碼形式,否則會出現亂碼的現象(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,并在父進程中,把調用進程掛起pause(),直至捕獲到一個SIGUSR1的信號。

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

3.2 多線程

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

3.3 多路復用

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

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()函數實現障礙物的移動。通過隨機數發生器的初始化函數srand(),使用系統時間作為種子,以隨機產生障礙物的種類。不同種類障礙物設置不同的移動步長,產生不同的移動速度效果。

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

3.5 相遇檢測

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

4 總結

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

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

參考文獻:

[1] 呂佳歡,蔣富,金易.基于Java的炸彈人游戲設計[J].電腦知識與技術,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網絡編程-基于TCP協議或UDP協議[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引擎下多人在線網絡游戲的設計與開發[J].計算機系統應用,2020,29(5):103-109.

【通聯編輯:謝媛媛】

主站蜘蛛池模板: 亚洲精品在线91| 久久综合九色综合97网| 91久久夜色精品国产网站| 亚洲国产AV无码综合原创| 国产97视频在线| 午夜欧美理论2019理论| 99久久免费精品特色大片| 小说区 亚洲 自拍 另类| 亚洲欧美在线综合图区| 制服丝袜 91视频| 91精品专区| av天堂最新版在线| 国产在线拍偷自揄观看视频网站| 欧美亚洲国产日韩电影在线| 亚洲妓女综合网995久久| 精品福利视频导航| 国产亚洲精品自在线| 亚洲资源站av无码网址| 国产精品开放后亚洲| 亚洲综合第一区| 国产精品视频导航| 99精品久久精品| 国产a网站| 青草视频久久| 色综合日本| 欧美日韩在线成人| 波多野结衣无码中文字幕在线观看一区二区 | 中字无码av在线电影| 青青草原偷拍视频| 57pao国产成视频免费播放| 欧美国产日韩在线观看| 2019年国产精品自拍不卡| 国内精自视频品线一二区| 久久精品人人做人人爽电影蜜月 | 巨熟乳波霸若妻中文观看免费| 亚洲视屏在线观看| 国产毛片高清一级国语| 国产精品无码久久久久AV| AV网站中文| 久久性视频| 色综合天天综合中文网| 热热久久狠狠偷偷色男同| 国产性爱网站| 国产AV无码专区亚洲精品网站| 又猛又黄又爽无遮挡的视频网站 | 精品国产亚洲人成在线| 日韩欧美网址| 成人91在线| 欧美一级夜夜爽www| 日韩成人在线视频| 99视频在线看| 性色一区| 精品国产aⅴ一区二区三区| 国产福利观看| 99久久国产自偷自偷免费一区| 亚洲欧洲自拍拍偷午夜色无码| 色综合婷婷| 亚洲精品777| 看国产一级毛片| 欧美日韩免费在线视频| 欧美日韩国产在线播放| 国产乱人视频免费观看| 性喷潮久久久久久久久| 国产青青草视频| 欧美综合成人| 亚洲第一成年网| 免费A∨中文乱码专区| 色视频国产| 国产精品人成在线播放| 精品精品国产高清A毛片| 国产日韩欧美成人| аⅴ资源中文在线天堂| 婷婷午夜天| 日本精品αv中文字幕| 午夜福利视频一区| 国产高清在线丝袜精品一区 | 国产男人的天堂| 久操中文在线| 日本手机在线视频| 国产男人的天堂| 日本午夜在线视频| 中文字幕亚洲乱码熟女1区2区|