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