首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在基于Linux的系统中使用C语言创建一个有两个玩家和裁判(进程)的“游戏”

在基于Linux的系统中使用C语言创建一个有两个玩家和裁判(进程)的“游戏”
EN

Stack Overflow用户
提问于 2016-03-27 04:45:28
回答 3查看 899关注 0票数 0

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

  1. 裁判-主进程
  2. 蓝色玩家-第一个子进程
  3. 红色玩家-第二个子进程

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

现在一切都创建好了,我正在使用共享内存来存储电路板和更多的变量,这些变量对于三个进程来说是通用的。

我的问题是,当我试图思考如何实现基于回合的游戏时-我创建了一个通用的布尔变量,它指出游戏是否仍在进行或结束,并决定谁轮到它。

现在我们进入共享部分,我暂停了两个子进程,并向第一个子进程发送了一个信号来“唤醒他”,但从现在开始,我如何保持所有三个进程一起并同步(裁判首先唤醒进程,它完成轮换并暂停,然后再唤醒第二个进程,依此类推……)

我想我不得不将这部分放在某种while(game_finished == FALSE)循环中,但从那里我就卡住了。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-27 05:06:43

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

只需在裁判进程和每个球员进程之间的每个方向上创建管道。在每个回合中,每个玩家进程都试图从裁判那里读取一个字节。它不会继续,直到裁判在它的管道末端写了一些东西。作为额外的好处,所写入的字节可以传送附加的数据/指令,以便例如在“进行游戏”和“游戏结束”之间进行区分。当然,同样的同步在另一个方向也是有效的。

票数 2
EN

Stack Overflow用户

发布于 2016-03-27 05:05:47

由于您希望使用单独的进程,因此实现您想要的一种方法是使用屏障。你已经有了一个“控制器”进程,玩家有一个简单的状态行为(等待一轮,玩一轮)。控制器进程(您称之为裁判)可以向子进程发出游戏状态的信号,并在障碍处同步所有内容。

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

代码语言:javascript
复制
// 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

票数 1
EN

Stack Overflow用户

发布于 2019-03-21 09:10:47

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

代码语言:javascript
复制
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);
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36240686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档