在基于Linux的系统中使用C创建一个包含2个玩家和裁判(进程)的“游戏”

问题描述 投票:0回答:3

我现在正在尝试为基于Linux的系统创建一个游戏,其中有三个过程:

  1. 裁判 - 主要进程
  2. Blue Player - 第一个子进程
  3. 红色球员 - 第二个孩子的过程

当然,使用fork()函数创建了两个子进程。

现在一切都已创建,我正在使用共享内存来存储电路板以及一些常见于三个进程的变量。

我的问题是当我试图思考如何实现基于回合制的游戏时 - 我创建了一个常见的布尔变量,指出游戏是否仍在运行或完成,以及决定轮到谁的问题。

现在我们正在进入共享部分,我暂停了两个子进程并向第一个子进程发送信号以“唤醒他”,但是从现在开始我如何将所有三个进程保持在一起并同步(裁判先唤醒进程,它完成转弯和暂停,比裁判唤醒第二个,依此类推...)

我想我必须将这部分保留在某种while(game_finished == FALSE)循环中,但从那里我被卡住了。

我如何以我刚才解释的方式实现该游戏?谢谢。

c linux process signals fork
3个回答
2
投票

有几种选择,但忙碌等待是最糟糕的。你可以考虑一个基于共享信号量的解决方案,但我会选择一个基于管道的解决方案。进程将阻止对当前没有数据的打开文件描述符执行读取,因此这是使各种进程彼此等待以便轮流进行的简单方法。

只需在裁判过程和每个玩家进程之间的每个方向创建管道。每回合,每个玩家进程都会尝试从裁判中读取一个字节。直到裁判将一些东西写到管道的末端才能继续进行。作为奖励,写入的字节可以传达附加数据/指令,以便例如区分“制作游戏”和“游戏结束”。当然,同样的同步也适用于另一个方向。


1
投票

既然您想使用单独的流程,那么实现您想要的一种方法就是使用障碍。你已经拥有了一个“控制器”进程并且玩家有一个简单的状态行为(等待一回合,转一圈)。控制器进程(裁判,就像你所说的那样)可以通知孩子进程游戏的状态,并同步障碍的一切。

下面是一个简单版本的伪代码:

// Controller
while (game_running) {
    barrier 1
    // wait for player1
    barrier 2
    // wait for player2
}

// Player 1
while (game_running) {
    barrier 1 // Sinchronize with controller
    // do stuff
    barrier 2
}

// Player2
while (game_running) {
    barrier 1 // Wait for player1
    barrier 2
    // do stuff  
}

可能需要一些额外的障碍来允许控制器处理来自玩家的数据然后同步玩家,但这是控制多个玩家的基本机制。

有关linux API提供的屏障功能的更多详细信息,请查看以下链接:http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_wait.html


0
投票

我有2人游戏代码。这是使用管道实现的。希望这对你有用。

int main(int argc, char *argv[]){
int fd1[2], fd2[2], fd3[2], fd4[2];
char turn='T';
printf("This is a 2-player game with a referee\n");
pipe(fd1);
pipe(fd2);
if(!fork())
player("TOTO", fd1, fd2);
close(fd1[0]); // parent only write to pipe 1
close(fd2[1]); // parent only reads from pipe 2
pipe(fd3);
pipe(fd4);
if(!fork())
player("TITI", fd3, fd4);
close(fd3[0]); // parent only write to pipe 3
close(fd4[1]); // parent only reads from pipe 4
while(1){
printf("\nReferee: TOTO plays\n\n");
write(fd1[1], &turn, 1);
read(fd2[0], &turn, 1);
printf("\nReferee: TITI plays\n\n");
write(fd3[1], &turn, 1);
read(fd4[0], &turn, 1);
}
}

void player(char *s, int *fd1, int *fd2){
int points=0;
int dice;
long int ss=0;
char turn;
while(1){
read(fd1[0], &turn, 1);
printf("%s: playing my dice\n", s);
dice =(int) time(&ss)%10 + 1;
printf("%s: got %d points\n", s, dice);
points+=dice;
printf("%s: Total so far %d\n\n", s, points);
if(points >= 50){
printf("%s: game over I won\n", s);
kill(0, SIGTERM);
}
sleep(5); // to slow down the execution
write(fd2[1], &turn, 1);
}
}
© www.soinside.com 2019 - 2024. All rights reserved.