0

コネクト フォー ゲームを作成しています。複数のプロセスとパイプを使用したいと考えていますが、どこから始めればよいかわかりません。フォークとパイプを使用する必要があることはわかっていますが、ゲームの開始直前にフォークすると、各ゲームで同じ結果が得られます。ここからどこへ行こうか迷っています。どんな提案でも大歓迎です。以下は私のコードの一部です。表示する必要がないため、勝利を確認するための部分を削除します。

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

}
4

1 に答える 1

0

ここにはパイプがありません。親プロセスがその移動を子プロセスに書き込み、子プロセスがその移動を親プロセスに書き込むようにする場合、各方向に 1 つずつ、合計 2 つのパイプが必要です (一部のシステムには双方向パイプがあります)。

分岐する前に両方のパイプを作成する必要があります。分岐後、親は書き込み先のパイプの読み取り側を閉じ、読み取り元のパイプの書き込み側を閉じます。同様に、子はパイプの未使用の端を閉じます (ただし、親とは異なるファイル記述子を閉じます)。

次に、2 つのプレーヤー (プロセス) をそれぞれ 1 つのパイプから読み取り、もう 1 つのパイプに書き込むように設定できます。誰が最初に書いているかを彼らが知っている限り、何の問題もないはずです。長さゼロの読み取りに注意する必要があります。それらはEOFを示します(他のプロセスはもう存在しません)。

fork();の後、2 つのプロセスは同じデータを共有しなくなることに注意してください。それらは独自のプライベート変数で自律的です。移動情報は、受信プロセスがそのボードを正しく更新できるように、移動元/移動先を特定する必要があります。極端な場合を除いて、ボード全体をネットワークに送信することはありません。

ボードを送信する必要があると判断した場合は、文字の配列でボードのテキスト表現を作成し、それを 1 回の書き込み操作でパートナー プロセスに送信する必要があります。

于 2013-03-03T20:38:08.977 に答える