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.

【通聯編輯:謝媛媛】

主站蜘蛛池模板: 波多野结衣视频一区二区| 熟女日韩精品2区| 一级黄色片网| 99精品久久精品| 久青草网站| 婷婷六月综合网| 国产啪在线91| 亚洲伦理一区二区| 国产91麻豆免费观看| 欧美在线天堂| 无码中文字幕精品推荐| 呦女精品网站| 日韩成人在线一区二区| 在线人成精品免费视频| 精品视频一区二区观看| 五月婷婷综合色| 毛片大全免费观看| 日韩毛片免费视频| 国产精品理论片| 色亚洲成人| 狼友视频一区二区三区| 99爱视频精品免视看| 国产情精品嫩草影院88av| 色婷婷成人| 99伊人精品| 欧美日韩免费观看| 真实国产精品vr专区| 国产美女精品在线| 欧美成人免费一区在线播放| 国产精品白浆在线播放| 曰韩人妻一区二区三区| 亚洲国产成熟视频在线多多| 国产精品天干天干在线观看| 久久久久88色偷偷| 亚洲综合网在线观看| 久久精品亚洲中文字幕乱码| 国产永久无码观看在线| 欧美日韩91| 狠狠色狠狠色综合久久第一次| 国产精品亚洲专区一区| 亚洲男人天堂网址| 日韩AV无码一区| 成人91在线| 亚洲三级片在线看| 亚洲精品在线影院| 久久夜色精品国产嚕嚕亚洲av| 国产激爽大片在线播放| 欧美性爱精品一区二区三区 | 色成人亚洲| 国产不卡国语在线| 久无码久无码av无码| 亚洲码一区二区三区| 国产高清无码第一十页在线观看| 久久综合激情网| 欧美国产精品不卡在线观看| 精品综合久久久久久97| 亚洲精品福利网站| 亚洲,国产,日韩,综合一区| 2021国产乱人伦在线播放| 日韩在线第三页| 成人免费视频一区二区三区| 亚洲第一页在线观看| 天天干天天色综合网| 欧美一级特黄aaaaaa在线看片| 又粗又硬又大又爽免费视频播放| 国产福利小视频在线播放观看| 国产一区二区精品福利| 亚洲人成网站色7777| 999精品视频在线| 国产视频 第一页| 久久女人网| 色综合综合网| 亚洲国产成熟视频在线多多| 亚洲婷婷丁香| 精品人妻一区无码视频| 亚洲天堂2014| 全免费a级毛片免费看不卡| 1769国产精品免费视频| 综合久久五月天| 深夜福利视频一区二区| 欧美精品亚洲日韩a| 狠狠做深爱婷婷久久一区|