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.mzph.cn/bicheng/15211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

《大话西游》里面有一句经典台词&#xff1a;每个人都有一个妈&#xff0c;但是“你妈就一定是你妈吗&#xff1f;” 用AI创作的艺术作品&#xff0c;也走进类似的困境&#xff1a;如何证明你用AI生成的作品&#xff0c;就是你的作品&#xff1f; 近日&#xff0c;腾讯科技独…

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. 观察…

SM2258G专用SSD开卡工具(三星闪存),后附工具下载

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

视频怎么转换成二维码图片?视频做成二维码播放的方法

怎样在电脑上制作可以播放视频的二维码呢&#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…

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景&#xff1a; 同学找到我期望做一个天水麻辣烫的网页&#xff0c;想复用以前做过的课设&#xff0c;结合他的实际需求&#xff0c;让我们来看看这个系统吧~ 项目功能与使用技术概述&#xff1a; 里面嵌入了6个子系统&#xff0c;其中餐饮系统可以进行餐馆信息添加、修改…

Influence blocking maximization on networks: Models, methods and applications

abstract 由于各种社会和贸易网络的不断出现&#xff0c;网络影响力分析引起了研究者的极大兴趣。基于不同的影响力传播模型&#xff0c;人们提出了许多网络影响力最大化的新模型和方法。作为传统影响力最大化问题的延伸和扩展&#xff0c;影响力封锁最大化问题已成为研究热点&…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…

【图论】单源最短路

前言 今天&#xff0c;我们来讲最短路&#xff0c;首先看只有一个起点&#xff08;单源&#xff09;的情况。 为了书写方便&#xff0c;我们约定以下内容&#xff1a; template<class W> using Graph vector<vector<pair<int, W>>>; // 邻接表(ve…

集中抄表电表是什么?

1.集中抄表电表&#xff1a;简述 集中抄表电表&#xff0c;又称为远程抄表系统&#xff0c;是一种现代化电力计量技术&#xff0c;为提升电力行业的经营效率和客户服务质量。它通过自动化的形式&#xff0c;取代了传统人工抄水表&#xff0c;完成了数据信息实时、精确、高效率…

进制转换【野路子改造】

非科班&#xff0c;一直都是自己的野路子&#xff0c;现在要回炉重造 十进制->二进制 基本思想&#xff1a; 开始写的&#xff08;80%&#xff09;&#xff1a; #include<stdio.h> using namespace std; int main(){ int n; scanf("%d",&n); int a[1…

以太坊钱包

以太坊钱包是你通往以太坊系统的门户。它拥有你的密钥&#xff0c;并且可以代表你创建和广播交易。选择一个以太坊钱包可能很困难&#xff0c;因为有很多不同功能和设计选择。有些更适合初学者&#xff0c;有些更适合专家。即使你现在选择一个你喜欢的&#xff0c;你可能会决定…