C 多种工艺和管道

C 多种工艺和管道,c,fork,pipe,C,Fork,Pipe,我正在制作一个连接4游戏,我希望有多个进程和管道,但我不确定从哪里开始。我知道你必须使用叉子和烟斗,但是当我在游戏开始前叉子时,我得到的结果是相同的。我只是不知道接下来该怎么办。如有任何建议,将不胜感激。下面是我的一些代码,我删除了用于检查wins的部分,因为我没有必要查看 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> int *moves

我正在制作一个连接4游戏,我希望有多个进程和管道,但我不确定从哪里开始。我知道你必须使用叉子和烟斗,但是当我在游戏开始前叉子时,我得到的结果是相同的。我只是不知道接下来该怎么办。如有任何建议,将不胜感激。下面是我的一些代码,我删除了用于检查wins的部分,因为我没有必要查看

#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");
    }

}
#包括
#包括
#包括
#包括
int*移动;
//int**板;
int w;
无效显示(int**板、int行、int列);
int**build_板(int N);
int makeMove(int**Board,int player);
内部检查胜利(内部**板);
int checkHorr(int**板);
无效AI_移动(智力**板,智力玩家,智力玩家2);
无效播放(int**板);
int main(){
srand((int)time(NULL));
整数宽度=8;
w=8-1;
int**BOUND=构建板(宽度);
int**Board2=构建板(宽度);
//显示(宽度、长度);
int i,检查;
如果(fork()==0){
游戏(棋盘);
}否则{
放入(“其他”);
游戏(2);
}
返回0;
}
无效播放(内部**板){
int i,检查;
对于(i=0;i=0;i--){
如果((董事会[i][a])==0){
董事会[i][a]=球员;
返回1;
}
}
转到开始;
}
无效显示(整数**板、整数行、整数列){
int i,j;

对于(i=0;i这里没有任何管道。如果希望父进程将其移动写入子进程,而子进程将其移动写入父进程,则确实需要两个管道,每个方向一个(尽管某些系统具有双向管道)

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

然后,可以将两个播放器(进程)分别设置为从一个管道读取和写入另一个管道。只要它们知道谁先写入,就不会有任何问题。您确实需要注意零长度读取;这表示EOF(另一个进程不再存在)

请记住,在
fork()
之后,这两个进程将不再共享相同的数据;它们通过各自的私有变量进行自治。移动信息必须标识移动从何处开始/到何处,以便接收进程能够正确地更新其线路板。除极端情况外,您不会发送整个线路板


如果您决定必须发送棋盘,那么您可能应该创建一个字符数组中的棋盘文本表示,并在一次写入操作中将其发送给合作进程。

您能否澄清为什么要有多个进程和管道?我正在尝试一次运行多个游戏,因为我我想用父母人工智能和孩子人工智能模拟多个游戏这里的问题是什么?是“管道是如何工作的?”。我不确定如何使用管道传递2D阵列,因为我的板是这样。我知道基本知识,只是不知道如何正确使用它们。从阅读文档和教程开始。具体的编程问题也是如此,而不是广泛的说明。