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
- 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 minions[][2],char c,int number,int steps,int size);
- char** generateInvisibleLabyrinth(int n);
- char** createLab(int size_lab,int clients);
- void freeMemory(char** lab,int n);
- int main(int argc,char* argv[])
- {
- printf("\n\tDUNGEON and cakes and mushroms v.1.4\n\n");
- char *end;
- char *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;
- 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 minions[clients_count][2];
- int steps=size_lab*10;
- srand(time(NULL));
- char **true_labyrinth=NULL;
- size=(2*size_lab)+(size_lab/3)+1;
- true_labyrinth=createLab(size_lab,clients_count);
- showTrueLabyrinth(true_labyrinth,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);
- }
- int fdTab[10];
- 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;
- }
- 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));
- 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[i], SHUT_RDWR );
- }
- freeMemory(true_labyrinth,size);
- close(sockfd);
- return 0;
- }
- void deadChildHandler(int s)
- {
- while( wait( NULL ) > 0 );
- }
- int generatePosition(int n)
- {
- int x;
- 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");
- }
- printf("\n");
- }
- void freeMemory(char** lab,int n)
- {
- for(int i=0;i<n;i++)
- {
- free(lab[i]);
- }
- free (lab);
- }
- 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** createLab(int size_lab,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+1+(size_lab/3);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 minions[][2],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':
- switch(true_labyrinth[xn][yn-1])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- true_labyrinth[xn][yn-1]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- minions[number][1]=yn-1;
- break;
- default:
- if(send( sockfd,"Pion",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- case 's':
- switch(true_labyrinth[xn][yn+1])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- true_labyrinth[xn][yn+1]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- minions[number][1]=yn+1;
- break;
- default:
- if(send( sockfd,"Pion",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- case 'a':
- switch(true_labyrinth[xn-1][yn])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- true_labyrinth[xn-1][yn]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- minions[number][0]=xn-1;
- break;
- default:
- if(send( sockfd,"Pion",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- case 'd':
- switch(true_labyrinth[xn+1][yn])
- {
- case '1':
- if(send( sockfd,"Wall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- case '0':
- if(send( sockfd,"Hall",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- true_labyrinth[xn+1][yn]=true_labyrinth[xn][yn];
- true_labyrinth[xn][yn]='0';
- minions[number][0]=xn+1;
- break;
- default:
- if(send( sockfd,"Pion",14,MSG_DONTWAIT)==-1)
- printf("Error - send\n");
- break;
- }
- showInvisibleDungeon(true_labyrinth,size);
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement