1

LinuxターミナルでCでゲームを作成しようとしています。

2 つの C ファイルで構成されるテトリス ゲームを作成する必要があります。最初のプログラムは子プロセスを作成し、もう一方を実行します。

他のプログラムにシグナルを送信する必要がありますが、難しいことがわかりました。

ソースコードは次のとおりです。

最初のファイル

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <termios.h>
#include <signal.h>

char getch();

int main()
{
    int fd[2],pid;
    char *args[] = { "./draw.out", NULL },tav;
    pipe(fd);
    pid=fork();
    if(pid==0)
    {
        execve("draw.out", args, NULL);

    }
    else
    {

        while(true)
            kill(0,SIGUSR2);
    }

    return 1;
    //getchar();

}

char getch() {
        char buf = 0;
        struct termios old = {0};
        if (tcgetattr(0, &old) < 0)
                perror("tcsetattr()");
        old.c_lflag &= ~ICANON;
        old.c_lflag &= ~ECHO;
        old.c_cc[VMIN] = 1;
        old.c_cc[VTIME] = 0;
        if (tcsetattr(0, TCSANOW, &old) < 0)
                perror("tcsetattr ICANON");
        if (read(0, &buf, 1) < 0)
                perror ("read()");
        old.c_lflag |= ICANON;
        old.c_lflag |= ECHO;
        if (tcsetattr(0, TCSADRAIN, &old) < 0)
                perror ("tcsetattr ~ICANON");
        return (buf);
}

2番目のファイル-

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <signal.h>


typedef struct
{
    int x;
    int y;
}Point;

typedef struct
{
    Point dots[3];
}Tool;

void drawBoard(int array[][20]);
void initBoard(int array[][20]);
Tool retrieveTool();
bool changeLocation(int array[][20],Tool* tool);
void my_handler(int signum);

int main()
{
    bool nextTool=true;
    Tool temp=retrieveTool();
    int gameBoard[20][20];
    signal(SIGUSR2, my_handler);
    initBoard(gameBoard);
    changeLocation(gameBoard,&temp);
    drawBoard(gameBoard);
    while(true)
    {
        signal(SIGUSR2, my_handler);
        sleep(1);
        system("clear");
        if(!changeLocation(gameBoard,&temp))
            temp=retrieveTool();
        drawBoard(gameBoard);
    }
    return 1;
    //getchar();

}

void initBoard(int array[][20])
{
    bool isLast=false;
    int i=0,j=0;
    for(i=0;i<20;i++)
    {
        if(i==19)
            isLast=true;
        for(j=0;j<20;j++)
        {
            if((j==0)||(j==19)||(isLast))
                array[i][j]=1;
            else
                array[i][j]=0;
        }
    }
}

void drawBoard(int symbols[][20])
{
    int i=0,j=0;
    for(i=0;i<20;i++)
    {
        for(j=0;j<20;j++)
            if(symbols[i][j]==1)
                printf("*");
            else
                if(symbols[i][j]==2)
                    printf("-");
                else
                    printf(" ");
        printf("\n");
    }
}

Tool retrieveTool()
{
    Tool temp;
    int startX=0,startY=8,i=0;
    for(i=0;i<3;i++)
    {
        temp.dots[i].x=startX;
        temp.dots[i].y=startY;
        startY++;
    }
    return temp;
}

bool changeLocation(int array[][20],Tool* tool)
{
    int i=0;
    for(i=0;i<3;i++)
    {
        if(array[tool->dots[i].x+1][tool->dots[i].y]!=0)
            return false;
    }
    i=0;
    for(i=0;i<3;i++)
    {
        array[tool->dots[i].x][tool->dots[i].y]=0;
        if((tool->dots[i].x+1)==19)
            tool->dots[i].x=-1;
        tool->dots[i].x++;
        array[tool->dots[i].x][tool->dots[i].y]=2;
    }
    return true;
}

void my_handler(int signum)
{
    if (signum == SIGUSR2)
    {
        printf("Received SIGUSR1!\n");
    }
}

draw.out は、2 番目のファイルの出力ファイルです。

2 番目のファイルでシグナル ハンドラーを作成しましたが、プログラムはまだシグナルを受信しません。何が間違っていますか?

4

1 に答える 1