编写C程序,使用Linux中的消息队列机制,完成 “石头、剪子、布”的游戏。要求: 回合数:接收用户输入 打印结果: 每回合的结果,最终的结果 代码
时间: 2024-03-04 20:49:27 浏览: 60
好的,下面是一个简单的 C 语言程序,使用 Linux 中的消息队列机制,实现了“石头、剪子、布”的游戏:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define CHOICE_ROCK 0
#define CHOICE_SCISSORS 1
#define CHOICE_PAPER 2
struct msgbuf {
long mtype;
char mtext[100];
};
int get_computer_choice() {
return rand() % 3;
}
int get_user_choice() {
int choice;
printf("请输入你的选择(0 表示石头,1 表示剪子,2 表示布):");
scanf("%d", &choice);
return choice;
}
void print_result(int user_choice, int computer_choice) {
printf("你的选择是 %d,计算机的选择是 %d,", user_choice, computer_choice);
if ((user_choice == CHOICE_ROCK && computer_choice == CHOICE_SCISSORS) ||
(user_choice == CHOICE_SCISSORS && computer_choice == CHOICE_PAPER) ||
(user_choice == CHOICE_PAPER && computer_choice == CHOICE_ROCK)) {
printf("你赢了!\n");
} else if (user_choice == computer_choice) {
printf("平局!\n");
} else {
printf("你输了!\n");
}
}
int main() {
int msgid, user_choice, computer_choice, user_score = 0, computer_score = 0;
struct msgbuf message;
// 创建消息队列
key_t key = 1234;
msgid = msgget(key, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 进行游戏
for (int i = 1; i <= 3; i++) {
// 接收用户输入并发送到消息队列中
user_choice = get_user_choice();
sprintf(message.mtext, "%d", user_choice);
message.mtype = 1;
if (msgsnd(msgid, &message, sizeof(message), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
// 处理用户输入并返回结果
if (fork() == 0) {
struct msgbuf message;
int user_choice, computer_choice;
// 从消息队列中接收用户输入
if (msgrcv(msgid, &message, sizeof(message), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
user_choice = atoi(message.mtext);
// 处理用户输入并返回结果
computer_choice = get_computer_choice();
print_result(user_choice, computer_choice);
exit(EXIT_SUCCESS);
}
// 等待子进程结束
wait(NULL);
}
// 统计最终的结果
for (int i = 1; i <= 3; i++) {
struct msgbuf message;
int user_choice, computer_choice;
// 从消息队列中接收用户输入
if (msgrcv(msgid, &message, sizeof(message), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
user_choice = atoi(message.mtext);
// 处理用户输入并返回结果
computer_choice = get_computer_choice();
print_result(user_choice, computer_choice);
// 统计得分
if ((user_choice == CHOICE_ROCK && computer_choice == CHOICE_SCISSORS) ||
(user_choice == CHOICE_SCISSORS && computer_choice == CHOICE_PAPER) ||
(user_choice == CHOICE_PAPER && computer_choice == CHOICE_ROCK)) {
user_score++;
} else if (user_choice != computer_choice) {
computer_score++;
}
}
// 打印最终结果
printf("最终结果:你的得分是 %d,计算机的得分是 %d,", user_score, computer_score);
if (user_score > computer_score) {
printf("你赢了!\n");
} else if (user_score < computer_score) {
printf("你输了!\n");
} else {
printf("平局!\n");
}
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
return 0;
}
```
在这个程序中,我们使用 `msgget` 函数创建了一个消息队列,并且使用 `msgrcv` 和 `msgsnd` 函数进行消息的接收和发送。在每个回合中,我们使用 `fork` 函数创建了一个子进程,用于接收消息队列中的数据,并进行处理。在处理完所有回合后,我们统计了用户和计算机的得分,并打印了最终结果。最后,我们使用 `msgctl` 函数删除了消息队列。
阅读全文