Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <time.h>
- #include <arpa/inet.h>
- #include <sys/wait.h>
- #include <signal.h>
- #include <fcntl.h>
- #include <sys/poll.h>
- #define MYPORT 6666
- #define BACKLOG 5
- //int size_lab=10;
- int xMax = 24;
- int yMax = 24;
- int x,y,ret;
- //int minions[5][2];
- //char true_labyrinth [24][24]; //z racji tego, ze operuje na zmiennych globalnych, chcac zwiekszyc rozmiar labiryntu nie wystarczy zwiekszyc size_lab,
- //char invisible_lab[24][24]; //tylko trzeba recznie tutaj podac rozmiar tablic
- //int steps=xMax*2;
- void deadChildHandler(int s);
- void showTrueLabyrinth(char** lab,int n);
- void showInvisibleDungeon(char** lab, int n);
- int generatePosition(int n);
- void move(int sockfd,char** true_labyrinth,int[][2] minions,char c,int number,int steps,int size);
- char** generateInvisibleLabyrinth(int n);
- char** createLab(int n,int clients);
- int main(int argc,char* argv[])
- {
- printf("\n\tDUNGEON and cakes and mushroms v.1.4\n\n");
- char *end,*end1;
- if(argc!=3)
- {
- printf("usage: ilosc_klientow rozmiar_lab\n\n");
- exit(1);
- }
- else if(strtol(argv[1],&end,10)<=0)
- {
- printf("Niepoprawny 1 parametr - ilosc klientow!\nLiczba ma byc nieujemna i wieksza od 0\n");
- exit(1);
- }
- else if(strtol(argv[2],&end1,10)<=0)
- {
- printf("Niepoprawny 2 parametr - rozmiar labiryntu!\nLiczba ma byc nieujemna i wieksza od 0\n");
- exit(1);
- }
- int clients_count,size_lab,size;
- int minions[clients_count][2];
- size_lab= strtol(argv[2],&end1,10);
- printf("size_lab = %d\n",size_lab);
- clients_count = strtol(argv[1],&end,10);
- printf("clients_count = %d\n",clients_count);
- int steps=size_lab*4;
- srand(time(NULL));
- char **true_labyrinth=NULL;
- //char **invisible_lab=NULL;
- size=2*size_lab+1+(size_lab/3);
- true_labyrinth=createLab(size_lab,clients_count);
- showTrueLabyrinth(true_labyrinth,size);
- printf("inv1\n\n");
- //invisible_lab=generateInvisibleLabyrinth(size);
- //printf("inv2\n\n");
- //showTrueLabyrinth(invisible_lab,size);
- //showInvisibleDungeon(invisible_lab,size);
- char minionsChar[5] = {'-','^','V','!','+'};
- int xx,yy;
- printf("Generuje pozycje pionkow:");
- for(int i=0;i<clients_count;i++)
- {
- xx=0;
- yy=0;
- while(true_labyrinth[xx][yy]!='0')
- {
- xx=generatePosition(size);
- yy=generatePosition(size);
- }
- true_labyrinth[xx][yy]=minionsChar[i];
- minions[i][0] = xx;
- minions[i][1] = yy;
- }
- printf("\nWygenerowalem:\n");
- showTrueLabyrinth(true_labyrinth,size);
- showInvisibleDungeon(true_labyrinth,size);
- int sockfd,sin_size;
- int tru = 1;
- struct sockaddr_in my_addr;
- struct sockaddr_in their_addr;
- struct sigaction sa;
- if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
- {
- perror("Error - socket");
- exit(1);
- }
- if(fcntl(sockfd,F_SETFL,O_NONBLOCK)==-1)
- {
- perror( "Error - fcntl - nie nastawilem nieblokowania" );
- exit(1);
- }
- if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&tru,sizeof(int))==-1)
- {
- perror("Error - setsockopt");
- exit(1);
- }
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(MYPORT);
- my_addr.sin_addr.s_addr = INADDR_ANY;
- memset(&(my_addr.sin_zero), '\0', 8 );
- if(bind(sockfd,(struct sockaddr *) &my_addr,sizeof(struct sockaddr))==-1)
- {
- perror("Error - bind\n");
- exit(1);
- }
- if(listen(sockfd,BACKLOG)==-1)
- {
- perror("Error - listen\n");
- exit(1);
- }
- sa.sa_handler = deadChildHandler;
- sigemptyset( & sa.sa_mask );
- sa.sa_flags = SA_RESTART;
- if(sigaction(SIGCHLD,& sa,NULL)==-1)
- {
- perror("Error - sigaction");
- exit(1);
- }
- //showTrueLabyrinth();
- //generateInvisibleLabyrinth(clients_count);
- //showInvisibleDungeon();
- int fdTab[10];
- int m = 0,i;
- sin_size = sizeof( struct sockaddr_in );
- int rc, socket_number = 0, max_socket = 5;
- fd_set fds, readfds;
- FD_ZERO(&fds);
- FD_SET(sockfd, &fds);
- while(1)
- {
- readfds = fds;
- rc = select(FD_SETSIZE, &readfds, NULL, NULL, NULL);
- if (rc == -1)
- {
- perror("Error - select\n");
- break;
- }
- //printf("wszedł do while\n\n");
- int i=0;
- while(i<FD_SETSIZE)
- {
- if (FD_ISSET(i, &readfds))
- {
- if (i == sockfd)
- {
- if (socket_number < max_socket)
- {
- if((fdTab[socket_number] = accept(sockfd,( struct sockaddr *) &their_addr,(socklen_t *) &sin_size))==-1)
- {
- //printf( "Error - accept" ); //wylaczona notyfikacja, poniewaz polaczenia nie sa blokujace i bylby niezly span na ekranie
- continue;
- }
- printf("And we have a client from: %s\n",inet_ntoa(their_addr.sin_addr));
- //x = minions[socket_number][0];
- //y = minions[socket_number][1];
- printf("_____%d %d______\n",i,socket_number);
- move(fdTab[socket_number],true_labyrinth,minions,minionsChar[socket_number],socket_number,steps,size);
- FD_SET(fdTab[socket_number], &fds);
- socket_number++;
- }
- }
- }
- i++;
- }
- shutdown( fdTab[m], SHUT_RDWR );
- }
- close(sockfd);
- return 0;
- }
- void deadChildHandler(int s)
- {
- while( wait( NULL ) > 0 );
- }
- int generatePosition(int n)
- {
- srand(time(NULL));
- x = rand()%(n-2)+1;
- return x;
- }
- void showTrueLabyrinth(char** lab,int n)
- {
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<n;j++)
- {
- printf("%c",lab[j][i]);
- }
- printf("\n");
- }
- }
- void showInvisibleDungeon(char** lab, int n)
- {
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<n;j++)
- {
- if (lab[j][i]=='0')
- printf(" ");
- else if (lab[j][i]=='1')
- printf("X");
- else
- printf("%c",lab[j][i]);
- }
- printf("\n");
- }
- }
- /*char** generateInvisibleLabyrinth(int n)
- {
- char ** invisible_lab = NULL;
- invisible_lab=(char**)calloc(2*n+2, sizeof(char*));
- for(int i=0;i<2*n+2;i++)
- {
- invisible_lab[i]=(char*)calloc(2*n+2,sizeof(char));
- }
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<n;j++)
- {
- invisible_lab[i][j] = ' ';
- invisible_lab[0][j] = '1';
- invisible_lab[n-1][j] = '1';
- }
- invisible_lab[i][0] = '1';
- invisible_lab[i][n-1] = '1';
- }
- return invisible_lab;
- }*/
- char** createLab(int n,int clients)
- {
- struct room
- {
- bool left_wall;
- bool top_wall;
- bool visited;
- };
- int size_lab=n;
- bool rand_start=0;
- room labyrinth[size_lab][size_lab];
- int i,j;
- for(i=0;i<size_lab;i++)
- {
- for(j=0;j<size_lab;j++)
- {
- labyrinth[i][j].left_wall=1;
- labyrinth[i][j].top_wall=1;
- labyrinth[i][j].visited=0;
- }
- }
- int x_hall,y_hall,hall_size,max_hall_size;
- int x_start=0;
- int y_start=0;
- if (!rand_start)
- {
- x_start=(rand() % size_lab)+0;
- y_start=(rand() % size_lab)+0;
- rand_start=1;
- }
- int direction=0;
- bool koniec=1;
- while(koniec==1)
- {
- if(labyrinth[x_start][y_start].visited==0)
- labyrinth[x_start][y_start].visited=1;
- direction=(rand()%4)+0;
- if (direction==0)
- {
- if (y_start<size_lab-1){
- if (labyrinth[x_start][y_start+1].visited==0)
- labyrinth[x_start][y_start+1].top_wall=0;
- y_start++;
- }
- }
- else if (direction==1)
- {
- if (y_start>0)
- {
- if (labyrinth[x_start][y_start-1].visited==0)
- labyrinth[x_start][y_start].top_wall=0;
- y_start--;
- }
- }
- else if (direction==2)
- {
- if (x_start>0)
- {
- if (labyrinth[x_start-1][y_start].visited==0)
- labyrinth[x_start][y_start].left_wall=0;
- x_start--;
- }
- }
- else if(direction==3)
- {
- if (x_start<size_lab-1)
- {
- if (labyrinth[x_start+1][y_start].visited==0)
- labyrinth[x_start+1][y_start].left_wall=0;
- x_start++;
- }
- }
- for(int i=0;i<size_lab;i++)
- {
- for(int j=0;j<size_lab;j++)
- {
- if (labyrinth[i][j].visited==0)
- {
- koniec=1;
- break;
- }
- else
- koniec=0;
- }
- if(koniec==1)
- break;
- }
- }
- char perfect [2*size_lab+1][2*size_lab+1];
- for(int i=0;i<2*size_lab+1;i++)
- {
- for(int j=0;j<2*size_lab+1;j++)
- {
- if ((i==2*size_lab))
- perfect[j][i]='1';
- else if ((j==2*size_lab))
- perfect[j][i]='1';
- else if ((i%2==1)&&(j%2==1))
- perfect[j][i]='0';
- else if ((i%2==0)&&(j%2==1))
- {
- if (labyrinth[j/2][i/2].top_wall==0)
- perfect[j][i]='0';
- else
- perfect[j][i]='1';
- }
- else if ((i%2==1)&&(j%2==0))
- {
- if (labyrinth[j/2][i/2].left_wall==0)
- perfect[j][i]='0';
- else
- perfect[j][i]='1';
- }
- else if ((i%2==0)&&(j%2==0))
- perfect[j][i]='1';
- }
- }
- max_hall_size=size_lab/3;
- int copies_count=size_lab/3;
- for (int k=0;k<copies_count;k++)
- {
- x_hall=(rand() % (2*size_lab-max_hall_size)) + (max_hall_size/2+1);
- y_hall=(rand() % (2*size_lab-max_hall_size)) + (max_hall_size/2+1);
- hall_size=(rand() % (max_hall_size-1)) + 2;
- for( i=(x_hall-(hall_size/2));i<(x_hall+hall_size/2+1);i++)
- {
- for(j=(y_hall-(hall_size/2));j<(y_hall+hall_size/2+1);j++)
- perfect[i][j]='0';
- }
- }
- int row[copies_count];
- int column[copies_count];
- for(int k=0;k<copies_count;k++)
- {
- row[k]=(rand() % (2*size_lab-1)) + 1;
- column[k]=(rand() % (2*size_lab-1)) + 1;
- }
- char perfect_with_halls [2*size_lab+1][2*size_lab+1+copies_count];
- int displacement=0;
- int copies;
- for(int j=0;j<2*size_lab+1;j++)
- {
- copies=1;
- for(int k=0;k<copies_count;k++)
- if (column[k]==j)
- copies++;
- for(int l=0;l<copies;l++)
- {
- if (l>0)
- displacement++;
- for(int i=0;i<2*size_lab+1;i++)
- perfect_with_halls[i][j+displacement]=perfect[i][j];
- }
- }
- displacement=0;
- copies=1;
- char ** true_labyrinth = NULL;
- true_labyrinth=(char**)calloc(2*size_lab+1+(size_lab/3), sizeof(char*));
- for(int i=0;i<2*size_lab+2;i++)
- {
- true_labyrinth[i]=(char*)calloc(2*size_lab+1+(size_lab/3),sizeof(char));
- }
- for(int i=0;i<2*size_lab+1+copies_count;i++)
- {
- copies=1;
- for(int k=0;k<copies_count;k++)
- {
- if (row[k]==i)
- copies++;
- }
- for(int l=0;l<copies;l++)
- {
- if (l>0)
- displacement++;
- for(int j=0;j<2*size_lab+1+copies_count;j++)
- true_labyrinth[i+displacement][j]=perfect_with_halls[i][j];
- }
- }
- for(int i=0;i<2*size_lab+1+copies_count;i++)
- {
- for(int j=0;j<2*size_lab+1+copies_count;j++)
- {
- if (true_labyrinth[j][i]=='0')
- printf(" ");
- if (true_labyrinth[j][i]=='1')
- printf("X");
- }
- printf("\n");
- }
- printf("\n");
- return true_labyrinth;
- }
- void move(int sockfd,char** true_labyrinth,int[][2] minions,char c,int number,int steps,int size)
- {
- char znak;
- int xn = minions[number][0];
- int yn = minions[number][1];
- int i;
- for(i=0;i<steps;i++)
- {
- char buf[1];
- if((recv(sockfd,buf,sizeof(buf),0))==-1)
- {
- sleep(1);
- }
- znak = buf[0];
- if(znak=='w' || znak=='s' || znak=='a' || znak=='d')
- {
- printf("%c\n",znak);
- switch(znak)
- {
- case 'w':
- //yn--;
- switch(true_labyrinth[xn][yn-1])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn][yn] = '1';
- //yn++;
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn][yn+1] = '0';
- //invisible_lab[xn][yn] = c;
- true_labyrinth[xn][yn-1]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- case 's':
- //yn++;
- switch(true_labyrinth[xn][yn+1])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn][yn] = '1';
- //yn--;
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn][yn-1] = '0';
- //invisible_lab[xn][yn] = c;
- true_labyrinth[xn][yn+1]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- case 'a':
- //xn--;
- switch(true_labyrinth[xn-1][yn])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn][yn] = '1';
- //xn++;
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn+1][yn] = '0';
- //invisible_lab[xn][yn] = c;
- true_labyrinth[xn-1][yn]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- case 'd':
- //xn++;
- switch(true_labyrinth[xn+1][yn])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn][yn] = '1';
- //xn--;
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- //invisible_lab[xn-1][yn] = '0';
- //invisible_lab[xn][yn] = c;
- true_labyrinth[xn+1][yn]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement