gpt4 book ai didi

c - 多进程和管道

转载 作者:行者123 更新时间:2023-11-30 17:54:04 25 4
gpt4 key购买 nike

我正在制作一个连接四的游戏,我想要多个进程和管道,但我不知道从哪里开始。我知道你必须使用 fork 和管道,但是当我在游戏开始前进行 fork 时,每场游戏都会得到相同的结果。我只是很困惑从这里该去哪里。任何建议将不胜感激。下面是我的一些代码,我删除了用于检查胜利的部分,因为我没有必要查看。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

int *moves;
//int **Board;
int w;

void display(int ** Board,int rows, int columns);
int** build_board(int N);
int makeMove(int** Board, int player);
int checkVictory(int** Board);
int checkHorr(int** Board);
void AI_move(int** Board,int player, int player2);
void play(int **Board);


int main(){

srand((int) time(NULL));

int width= 8;
w=8-1;

int** Board=build_board(width);
int **Board2=build_board(width);

//display(width, length);

int i, check;

if(fork()==0){
play(Board);
}else{
puts("In Else");
play(Board2);
}

return 0;
}

void play(int **Board){

int i, check;

for (i=0; i<((w+1)*(w+1)/2); i++) {

AI_move(Board,1,2);

// makeMove(Board, 1);
// display(width, width);

check=checkVictory(Board);

if (check==1 || check==2) {
puts("Winning Board");
display(Board,w+1, w+1);
break;
}

// AI_move(Board,2,1);
makeMove(Board,2);

check=checkVictory(Board);

if (check==1 || check==2) {
puts("Winning Board");
display(Board, w+1, w+1);
break;
}

}
}


int** build_board(int N){

int i,j;

int **Board = (int**) malloc(N*sizeof(int*));
for (i = 0; i < N; i++)
Board[i] = (int*) malloc(N*sizeof(int));
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
Board[i][j] = 0;
}
}

return Board;
}

void AI_move(int**Board,int player, int player2){

int i,j;


for (j=0; j<=w; j++) {
for (i=w; i>=0; i--) {
// printf("I: %d\n", i);
if ( j < w && Board[j][i]==0 && Board[j+1][i]!=0) {
Board[j][i]=player;
if(checkVictory(Board)==1){
puts("Found Winning Move");
display(Board,w+1, w+1);
return;
}
else
Board[j][i]=0;
}
}
}

makeMove(Board,player);
}

int makeMove(int** Board,int player){

int a;
start:a= rand()%(w+1);
int i;
for (i=w; i>=0; i--) {
if ((Board[i][a])==0) {
Board[i][a]=player;
return 1;
}
}

goto start;
}

void display(int** Board,int rows, int columns){

int i,j;

for (i=0; i <= w;i++){
for (j=0;j <=w;j++){
if (Board[i][j]==1) {
printf(" R ");
}
else if(Board[i][j]==2)
printf(" B ");
//printf(" %d ",Board[i][j]);
else
printf(" - ");
}
printf("\n");
}

}

最佳答案

你这里没有任何管道。如果您希望父进程将其移动写入子进程,而子进程将其移动写入父进程,那么您确实需要两个管道,每个方向一个(尽管有些系统具有双向管道)。

您必须在 fork 之前创建两个管道。 fork 后,父级将关闭它将写入的管道的读取端以及将从中读取的管道的写入端。类似地,子进程将关闭管道未使用的一端(但它将关闭与父进程不同的文件描述符)。

然后,两个参与者(进程)可以分别设置为从一个管道读取数据并写入另一个管道。只要他们知道谁先写,就不会有任何问题。您确实需要留意零长度读取;这些指示 EOF(其他进程不再存在)。

请记住,在fork()之后,两个进程将不再共享相同的数据;它们具有自己的私有(private)变量,是自治的。移动信息必须标识移动的起点/终点,以便接收进程可以正确更新其棋盘。除非在极端情况下,否则您不会将整个董事会发送出去。

如果您决定必须通过线路发送该板,那么您可能应该在字符数组中创建该板的文本表示形式,然后通过单个写入操作将其发送到合作伙伴进程。

关于c - 多进程和管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com