编写C程序,使用Linux中的IPC机制,完成 “石头、剪子、布”的游戏;
时间: 2024-05-10 19:17:09 浏览: 81
以下是一个使用共享内存和信号量实现石头剪子布游戏的示例程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#include <time.h>
#define SHM_KEY 0x1234
#define SEM_KEY 0x5678
#define GAME_START 0
#define PLAYER1_READY 1
#define PLAYER2_READY 2
#define GAME_OVER 3
#define ROCK 0
#define PAPER 1
#define SCISSORS 2
struct game_status {
int state;
int player1_choice;
int player2_choice;
};
int main() {
struct game_status *status;
int shm_id, sem_id;
void *shm_ptr;
struct sembuf sem_buf;
// 创建共享内存
shm_id = shmget(SHM_KEY, sizeof(struct game_status), IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget");
exit(1);
}
// 连接共享内存
shm_ptr = shmat(shm_id, NULL, 0);
if (shm_ptr == (void *) -1) {
perror("shmat");
exit(1);
}
status = (struct game_status *) shm_ptr;
// 创建信号量
sem_id = semget(SEM_KEY, 2, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(1);
}
// 初始化信号量
semctl(sem_id, 0, SETVAL, 0);
semctl(sem_id, 1, SETVAL, 0);
// 游戏循环
while (1) {
printf("石头、剪子、布游戏\n");
printf("选择你的出拳(0=石头,1=剪子,2=布):");
scanf("%d", &status->player1_choice);
// 等待另一个玩家
printf("等待另一个玩家...\n");
sem_buf.sem_num = 0;
sem_buf.sem_op = -1;
sem_buf.sem_flg = 0;
semop(sem_id, &sem_buf, 1);
// 判断游戏状态
if (status->state == GAME_START) {
// 第一个玩家准备好了
status->state = PLAYER1_READY;
} else if (status->state == PLAYER1_READY) {
// 第二个玩家准备好了
status->player2_choice = rand() % 3;
printf("另一个玩家出了:%d\n", status->player2_choice);
// 判断胜负
if (status->player1_choice == status->player2_choice) {
printf("平局!\n");
} else if ((status->player1_choice == ROCK && status->player2_choice == SCISSORS) ||
(status->player1_choice == PAPER && status->player2_choice == ROCK) ||
(status->player1_choice == SCISSORS && status->player2_choice == PAPER)) {
printf("你赢了!\n");
} else {
printf("你输了!\n");
}
// 游戏结束
status->state = GAME_OVER;
}
// 通知另一个玩家
sem_buf.sem_num = 1;
sem_buf.sem_op = 1;
sem_buf.sem_flg = 0;
semop(sem_id, &sem_buf, 1);
// 判断游戏是否结束
if (status->state == GAME_OVER) {
break;
}
}
// 断开连接共享内存
shmdt(shm_ptr);
// 删除共享内存和信号量
shmctl(shm_id, IPC_RMID, NULL);
semctl(sem_id, 0, IPC_RMID);
semctl(sem_id, 1, IPC_RMID);
return 0;
}
```
该程序创建了一个共享内存和两个信号量,其中一个信号量用于通知另一个玩家,另一个信号量用于等待另一个玩家。当一个玩家做出选择后,程序会等待另一个玩家做出选择,然后判断胜负,最后通知另一个玩家。如果游戏结束,程序会删除共享内存和信号量。
阅读全文