编写C程序,使用Linux中的IPC的消息队列机制,完成 “石头、剪子、布”的游戏。
时间: 2024-03-10 08:44:58 浏览: 350
好的,我可以帮您解答这个问题。
首先,消息队列是一种进程间通信(IPC)机制,它允许多个进程通过在队列中发送和接收消息来进行通信。在Linux中,可以使用System V IPC或POSIX IPC来创建消息队列。
下面是一个简单的石头、剪子、布游戏的C程序,使用System V IPC的消息队列机制,其中包含两个进程:一个进程接收玩家输入,另一个进程生成随机的游戏选择并进行比较。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#define MSG_SIZE 128
#define MSG_TYPE 1
struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
};
int main() {
int msqid;
struct msgbuf msg;
key_t key;
// 创建一个唯一的键值,用于访问消息队列
if ((key = ftok(".", 'R')) == -1) {
perror("ftok");
exit(1);
}
// 创建消息队列,如果已经存在则直接获取它的ID
if ((msqid = msgget(key, 0666 | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
// 游戏循环
while (1) {
// 等待玩家输入
printf("请输入石头、剪子或布:\n");
fgets(msg.mtext, MSG_SIZE, stdin);
// 将消息类型设置为1,表示这是玩家输入的消息
msg.mtype = MSG_TYPE;
msgsnd(msqid, &msg, strlen(msg.mtext) + 1, 0);
// 等待另一个进程的响应
msgrcv(msqid, &msg, MSG_SIZE, MSG_TYPE + 1, 0);
printf("电脑出了:%s", msg.mtext);
// 判断胜负
if (strcmp(msg.mtext, "石头\n") == 0) {
printf("平局!\n");
} else if (strcmp(msg.mtext, "剪子\n") == 0) {
printf("你胜利了!\n");
} else if (strcmp(msg.mtext, "布\n") == 0) {
printf("电脑胜利了!\n");
}
}
// 删除消息队列
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
```
下面是另一个进程,它生成随机的游戏选择并将其发送到消息队列中,等待另一个进程的响应。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#define MSG_SIZE 128
#define MSG_TYPE 1
struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
};
int main() {
int msqid;
struct msgbuf msg;
key_t key;
// 创建一个唯一的键值,用于访问消息队列
if ((key = ftok(".", 'R')) == -1) {
perror("ftok");
exit(1);
}
// 获取消息队列ID
if ((msqid = msgget(key, 0666)) == -1) {
perror("msgget");
exit(1);
}
// 游戏循环
while (1) {
// 等待玩家输入
msgrcv(msqid, &msg, MSG_SIZE, MSG_TYPE, 0);
// 生成游戏选择
srand(time(NULL));
int choice = rand() % 3;
if (choice == 0) {
strcpy(msg.mtext, "石头\n");
} else if (choice == 1) {
strcpy(msg.mtext, "剪子\n");
} else {
strcpy(msg.mtext, "布\n");
}
// 将消息类型设置为2,表示这是电脑的响应消息
msg.mtype = MSG_TYPE + 1;
msgsnd(msqid, &msg, strlen(msg.mtext) + 1, 0);
}
return 0;
}
```
这个程序使用了两个进程来实现石头、剪子、布游戏,它们通过消息队列进行通信。玩家输入的消息被发送到消息队列中,另一个进程接收该消息并生成随机的游戏选择,将其发送到消息队列中,等待另一个进程的响应。比较选择,判断胜负,并输出结果。
这是一个简单的例子,仅用于演示如何使用消息队列进行进程间通信。实际上,还有其他更好的IPC机制,如管道、信号和共享内存。
阅读全文