Linux程序開發(十一):進程與進程間通信設計之趣味貓咪抓老鼠游戲

Tips:"分享是快樂的源泉💧,在我的博客里,不僅有知識的海洋🌊,還有滿滿的正能量加持💪,快來和我一起分享這份快樂吧😊!

喜歡我的博客的話,記得點個紅心??和小關小注哦!您的支持是我創作的動力!數據源存放在我的資源下載區啦!

Linux程序開發(十一):進程與進程間通信設計之趣味貓咪抓老鼠游戲

目錄

  • Linux程序開發(十一):進程與進程間通信設計之趣味貓咪抓老鼠游戲
    • 題目:貓咪抓老鼠游戲
    • 題目描述:
    • 示例輸入:
    • 示例輸出:
    • 提示:
    • 解答:
    • 截圖:

題目:貓咪抓老鼠游戲

題目描述:

小明有一只貓咪和幾只老鼠,他想編寫一個Linux下的C程序來實現貓咪捉老鼠的游戲。具體來說,程序中需要啟動兩個進程,一個進程代表貓咪,另一個進程代表老鼠。貓咪和老鼠在一個二維平面上移動,貓咪的初始位置隨機生成,老鼠的初始位置也隨機生成。貓咪和老鼠每次移動時,會隨機選擇上下左右四個方向之一,然后向該方向移動一個單位距離。如果貓咪和老鼠的位置重合,則貓咪抓住老鼠,游戲結束。
請你編寫一個C程序,實現貓咪抓老鼠的游戲。程序需要滿足以下要求:
1、貓咪和老鼠的初始位置、移動速度等參數需要在程序運行時由用戶輸入。
2、程序需要啟動兩個進程,分別代表貓咪和老鼠。
3、進程間需要通過消息隊列進行通信,貓咪和老鼠每次移動后需要將自己的位置信息發送給對方進程。
4、程序需要使用信號量和互斥鎖等機制來實現進程間同步和互斥訪問共享資源(如二維平面上的位置信息)。
5、程序需在貓咪抓住老鼠或一定時間內未能抓住老鼠時結束,并輸出游戲結果。

示例輸入:

請輸入貓咪和老鼠的移動速度:10
請輸入游戲時間(秒):30

示例輸出:

貓咪和老鼠的初始位置為:(3, 5) 和 (7, 9)
游戲結束,貓咪抓住了老鼠!

提示:

可使用Linux系統函數fork()來創建進程。
可使用Linux系統函數msgget()、msgsnd()和msgrcv()來創建和使用消息隊列。
可使用Linux系統函數sem_init()、sem_wait()、sem_post()和sem_destroy()來創建和使用信號量。
可使用Linux系統函數pthread_mutex_init()、pthread_mutex_lock()、pthread_mutex_unlock()和pthread_mutex_destroy()來創建和使用互斥鎖。

解答:

# pthread.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/msg.h>
#include <pthread.h>
#include <semaphore.h> // 添加頭文件#define MSG_TYPE_CAT 1
#define MSG_TYPE_MOUSE 2// 定義消息結構體
struct Message {long type;int x;int y;
};// 定義互斥鎖和信號量
pthread_mutex_t mutex;
sem_t sem;// 定義全局變量
int catX, catY, mouseX, mouseY;
int gameResult = 0;void* catThread(void* arg) {key_t* pMsgId = (key_t*)arg; // 修改參數類型為 key_t*struct Message msg;while (!gameResult) {// 貓咪向隨機方向移動pthread_mutex_lock(&mutex);int dx = rand() % 3 - 1;int dy = rand() % 3 - 1;catX += dx;catY += dy;if (catX < 0) catX = 0;if (catX > 20) catX = 20;if (catY < 0) catY = 0;if (catY > 20) catY = 20;pthread_mutex_unlock(&mutex);// 發送貓咪的位置消息給老鼠msg.type = MSG_TYPE_CAT;msg.x = catX;msg.y = catY;msgsnd(*pMsgId, &msg, sizeof(msg), 0); // 使用間接尋址操作獲取 msgId// 等待老鼠的位置消息msgrcv(*pMsgId, &msg, sizeof(msg), MSG_TYPE_MOUSE, 0);// 判斷是否抓住老鼠if (msg.x == catX && msg.y == catY) {gameResult = 1;printf("游戲結束,貓咪抓住了老鼠!\n");}// 等待一段時間usleep(1000000 / *(int*)arg);}return NULL;
}void* mouseThread(void* arg) {key_t* pMsgId = (key_t*)arg; // 修改參數類型為 key_t*struct Message msg;while (!gameResult) {// 老鼠向隨機方向移動pthread_mutex_lock(&mutex);int dx = rand() % 3 - 1;int dy = rand() % 3 - 1;mouseX += dx;mouseY += dy;if (mouseX < 0) mouseX = 0;if (mouseX > 20) mouseX = 20;if (mouseY < 0) mouseY = 0;if (mouseY > 20) mouseY = 20;pthread_mutex_unlock(&mutex);// 發送老鼠的位置消息給貓咪msg.type = MSG_TYPE_MOUSE;msg.x = mouseX;msg.y = mouseY;msgsnd(*pMsgId, &msg, sizeof(msg), 0); // 使用間接尋址操作獲取 msgId// 等待貓咪的位置消息msgrcv(*pMsgId, &msg, sizeof(msg), MSG_TYPE_CAT, 0);// 判斷是否被貓咪抓住if (msg.x == mouseX && msg.y == mouseY) {gameResult = 2;printf("游戲結束,老鼠被貓咪抓住了!\n");}// 等待一段時間usleep(1000000 / *(int*)arg);}return NULL;
}int main() {int speed, gameTime;pid_t pid;key_t msgId;pthread_t catTid, mouseTid;srand(time(NULL));// 獲取輸入參數printf("請輸入貓咪和老鼠的移動速度:");scanf("%d", &speed);printf("請輸入游戲時間(秒):");scanf("%d", &gameTime);// 初始化互斥鎖和信號量pthread_mutex_init(&mutex, NULL);sem_init(&sem, 0, 1);// 隨機生成貓咪和老鼠的初始位置catX = rand() % 21;catY = rand() % 21;mouseX = rand() % 21;mouseY = rand() % 21;// 輸出初始位置printf("貓咪和老鼠的初始位置為:(%d, %d) 和 (%d, %d)\n", catX, catY, mouseX, mouseY);// 創建消息隊列msgId = msgget(IPC_PRIVATE, IPC_CREAT | 0666);if (msgId < 0) {printf("Failed to create message queue!\n");return 1;}// 創建貓咪進程pid = fork();if (pid == 0) {catThread(&msgId); // 修改函數調用,傳遞 msgId 變量的指針return 0;} else if (pid < 0) {printf("Failed to create cat process!\n");return 1;}// 創建老鼠進程pid = fork();if (pid == 0) {mouseThread(&msgId); // 修改函數調用,傳遞 msgId 變量的指針return 0;} else if (pid < 0) {printf("Failed to create mouse process!\n");return 1;}// 等待一段時間sleep(gameTime);// 結束游戲gameResult = 3;// 銷毀互斥鎖和信號量pthread_mutex_destroy(&mutex);sem_destroy(&sem);return 0;
}

截圖:

在這里插入圖片描述
圖 2.1 運行結果圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15211.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

他用AI,抄襲了我的AI作品

《大話西游》里面有一句經典臺詞&#xff1a;每個人都有一個媽&#xff0c;但是“你媽就一定是你媽嗎&#xff1f;” 用AI創作的藝術作品&#xff0c;也走進類似的困境&#xff1a;如何證明你用AI生成的作品&#xff0c;就是你的作品&#xff1f; 近日&#xff0c;騰訊科技獨…

Google手機連接wifi后提示“無法連接互聯網“解決方法

1.原因分析 谷歌手機聯網前會先訪問谷歌的服務器:http://clients3.google.com/generate_204來探測網絡是否連通&#xff0c;由于國內網絡防火墻的原因訪問不了&#xff0c;所以就提示"無網絡連接"。 2.解決方法 可以通過adb命令修改驗證網絡是否連通的服務器地址&…

SpringCloudAlibaba:6.3SpringBoot接入RocketMQ

依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…

【C++提高編程-04】----C++之Vector容器實戰

&#x1f3a9; 歡迎來到技術探索的奇幻世界&#x1f468;?&#x1f4bb; &#x1f4dc; 個人主頁&#xff1a;一倫明悅-CSDN博客 ?&#x1f3fb; 作者簡介&#xff1a; C軟件開發、Python機器學習愛好者 &#x1f5e3;? 互動與支持&#xff1a;&#x1f4ac;評論 &…

STM32+CubeMX移植SPI協議驅動W25Q16FLash存儲器

STM32CubeMX移植SPI協議驅動W25Q16FLash存儲器 SPI簡介拓撲結構時鐘相位&#xff08;CPHA&#xff09;和時鐘極性&#xff08; CPOL&#xff09; W25Q16簡介什么是Flash&#xff0c;有什么特點&#xff1f;W25Q16內部塊、扇區、頁的劃分引腳定義通訊方式控制指令原理圖 CubeMX配…

iBarcoder for Mac v3.15.1中文激活版:讓條形碼生成變得如此簡單

在現代社會&#xff0c;條形碼無處不在&#xff0c;從超市商品到物流包裹&#xff0c;都離不開它的身影。iBarcoder for Mac作為一款簡單易用的條形碼生成軟件&#xff0c;讓條形碼的生成變得如此簡單。 iBarcoder for Mac v3.15.1中文激活版下載 無論你是需要為商品添加條形碼…

Scrapy框架簡單介紹及Scrapy項目編寫詳細步驟

引言 Scrapy是一個用Python編寫的開源、功能強大的網絡爬蟲框架&#xff0c;專為網頁抓取和數據提取設計。它允許開發者高效地從網站上抓取所需的數據&#xff0c;并通過一系列可擴展和可配置的組件來處理這些數據。Scrapy框架的核心組成部分包括&#xff1a; Scrapy Engine&…

aws glue配置讀取本地kafka數據源

創建連接時填寫本地私有ip地址&#xff0c;選擇網絡配置 配置任務選擇kafka作為數據源 但是執行任務時日志顯示連接失敗 文檔提到只能用加密通信 如果您希望與 Kafka 數據源建立安全連接&#xff0c;請選擇 Require SSL connection (需要 SSL 連接)&#xff0c;并在 Kafka priv…

python批發模塊的調試之旅:從新手到專家的蛻變

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、調試技巧的重要性 二、批發模塊調試的實戰演練 1. 設置斷點 2. 逐行執行代碼 3. 觀察…

Android+SQLiteOpenHelper實現登錄記住密碼小案例

實現自動登錄&#xff0c;在數據庫中存 注冊的賬號信息 package com.example.databases_text;import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import andro…

運維行業中的堆疊交換機監控與配置管理策略

隨著信息技術的迅猛發展&#xff0c;企業網絡架構日趨復雜&#xff0c;交換機作為網絡基礎設施的核心設備&#xff0c;其穩定性和安全性對于企業業務的運行至關重要。在運維實踐中&#xff0c;堆疊交換機&#xff08;Stacked Switches&#xff09;因其高可靠性、靈活擴展性等特…

SM2258G專用SSD開卡工具(三星閃存),后附工具下載

工具下載&#xff1a; https://download.csdn.net/download/weixin_43097956/89354302

「貪心算法」檸檬水找零

力扣原題鏈接&#xff0c;點擊跳轉。 假設你的手里沒有錢。你要賣檸檬水&#xff0c;每杯5塊錢。每個顧客有可能會給你5塊錢、10塊錢或20塊錢&#xff0c;你要拿手中的錢找零。如何判斷你能否成功找零呢&#xff1f; 如果一上來就有顧客花10塊錢或20塊錢&#xff0c;你手中沒…

python中特殊的靜態方法__new__

一、關于new方法 在Python中&#xff0c;__new__方法是一個特殊的靜態方法&#xff0c;用于實例化對象。通常不需要直接調用__new__方法&#xff0c;Python會自動調用它來分配內存空間并返回一個新對象&#xff08;或者更具體地說&#xff0c;是對象的引用&#xff09;。然而&…

視頻怎么轉換成二維碼圖片?視頻做成二維碼播放的方法

怎樣在電腦上制作可以播放視頻的二維碼呢&#xff1f;很多日常生活中&#xff0c;很多的場景或者物品都會有自己的二維碼&#xff0c;其他人通過掃碼就可以獲取對應的內容。有很多場景下會把視頻轉換二維碼&#xff0c;通過掃碼在手機上查看視頻內容&#xff0c;比如產品介紹、…

水表電表遠程抄表是什么?

1.簡述&#xff1a;水表電表遠程抄表技術性 隨著時代的發展&#xff0c;傳統式手動抄表方法早已被更為高效、智能化的遠程抄表系統所替代。水表電表遠程抄表&#xff0c;說白了&#xff0c;就是利用互聯網技術完成對水表和電表讀數的遠程數據采集管理方法&#xff0c;大大提升…

效果炸裂!使用 GPT-4o 快速實現LLM OS

▼最近直播超級多&#xff0c;預約保你有收獲 —1— 什么是 LLM OS&#xff1f; 關于 LLM OS 的最初構想源自karpathy 在2023年11月11日發布的一條Twitter 動態&#xff0c;這是 LLM OS 概念的最早出處&#xff0c;如下圖所示&#xff1a; LLM OS 主要有以下5個部分組成&#x…

基于SA模擬退火優化算法的TSP問題求解matlab仿真,并對比ACO蟻群優化算法

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模擬退火優化算法的TSP問題求解matlab仿真,并對比ACO蟻群優化算法,對比兩個算法的仿真時間&#xff0c;收斂曲線&#xff0c;以及路徑規劃的結果&#xff0…

中間件的概念及示例

什么是中間件&#xff1f; 中間件是一種軟件技術&#xff0c;它在分布式系統中起著至關重要的作用。以下是關于中間件的詳細解釋&#xff1a; 定義與位置&#xff1a; 中間件是位于應用系統和系統軟件之間的一類軟件。它使用系統軟件提供的基礎服務&#xff08;功能&#xff0…

Flask+Vue+MySQL天水麻辣燙管理系統設計與實現(附源碼 配置 文檔)

背景&#xff1a; 同學找到我期望做一個天水麻辣燙的網頁&#xff0c;想復用以前做過的課設&#xff0c;結合他的實際需求&#xff0c;讓我們來看看這個系統吧~ 項目功能與使用技術概述&#xff1a; 里面嵌入了6個子系統&#xff0c;其中餐飲系統可以進行餐館信息添加、修改…