Beispiel #1
0
void jakieKarty(char* wynik, int* tab){
	char str123[4];
	clearTab(str123, 4);
	clearTab(wynik, MAX);
	int i=0;
	for(i;i<25;i++){
		if(tab[i]==1) sprintf(str123,"%d ",i);
		strcat(wynik, str123);
		clearTab(str123,4);
	}
}
Beispiel #2
0
void updateDb(struct gracze* gr, struct stoliki* st, int msgSend){
	int i=0;
	int j=0;
	int k=0;
	for(i;i<liczS;i++){
		int zaj=0;
			for(j=0;j<liczG;j++){
				if(gr[j].stolik == (i+1)){
					st[i].gracze[zaj] = gr[j].login;
					zaj++;
				}
			}
			if(zaj<3){
					int pom=zaj;
					for(pom;pom<3;pom++){
						st[i].gracze[pom] = "";
					}
					st[i].gra=0;
			}
			if(zaj==3 && st[i].gra!=1){
				printf("Pokoj %d zapelniony!\n",(i+1));
				clearTab(buf->val, MAX);
				strcpy(buf->val, "Pokoj zapelniony!\nGracze:\n");
				for(k=0;k<zaj;k++){
					strcat(buf->val, "\t");
					strcat(buf->val, st[i].gracze[k]);
					strcat(buf->val, "\n");
				}
				for(k=0;k<zaj;k++){
					buf->mtype=1000*(i+1);
					buf->nr=k+1;
					if(msgsnd(msgSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
						perror("Powiad. o zapel. pokoju");
					}
				}
				st[i].gra=1;
				int rozpGre = fork();
				if(rozpGre == 0) {
					printf("Rozpoczynam gre dla stolika %d.\n",(i+1));
					gra(i+1);
					exit(0);
				}
			}
			st[i].zajete=zaj;
		}
}
/**
 * Set-up additional ui elements
 * @brief MainWindow::initializeUiElements
 */
void MainWindow::initializeUiElements()
{
    ui->txtMessage->installEventFilter(this);

    //Hide close button from the first tab, which should always be visible.
    ui->tabgrpConversations->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);

    //Connect filemenu actions
    connect(ui->actionScan_Lan, SIGNAL(triggered()), controller, SLOT(scanLan()));
    connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(close()));
    connect(ui->actionSet_nickname, SIGNAL(triggered()), this, SLOT(setNickname()));
    connect(ui->actionClear_current_window, SIGNAL(triggered()), this, SLOT(clearTab()));

    //Create list of smileys and add to current ui-list.
    smileys = new QList<QListWidgetItem*>;
    for (int i = 0; i < 40; ++i)
    {
        QListWidgetItem* qlwi = new QListWidgetItem(QIcon(RES_SMILEYS + QString::number(i) + ".png"), "");
        smileys->append(qlwi);
        ui->lstSmileys->addItem(qlwi);
    }

    createTray();
}
Beispiel #4
0
int main(){
	printf("Serwer uruchomiony pomyslnie!\n");
	buf = malloc(sizeof(struct mybuf));
	stolik = malloc(TBLS * sizeof(struct stoliki));
	gracz = malloc(MAX_PLYRS * sizeof(struct gracze));

	czyscPoczatek(gracz, stolik);


	int k;
	for(k=0;k<TBLS;k++){
		stolik[k].zajete=0;
	}
	for(k=0;k<MAX_PLYRS;k++){
		gracz[k].stolik=0;
	}

	int N = MAX_PLYRS;

	int msgSend = msgget(1234, IPC_CREAT|0600);
	if(msgSend==-1){
		perror("Utworzenie kol. kom. wych.");
		exit(1);
	}

	int msgRcv = msgget(4321, IPC_CREAT|0600);
	if(msgRcv==-1){
		perror("Utworzenie kol. kom. przych.");
		exit(1);
	}

	int quit=0;
	while(1)
	{

		//dodawanie uzytkownika do tymczasowej bazy danych
		if(msgrcv(msgRcv, buf, (sizeof(struct mybuf)-sizeof(long)), LOGIN ,IPC_NOWAIT) != -1){ //dodawanie graczy; IPC_NOWAIT sprawia ze nie nie ma zawiechy na komunikat
			buf->mtype = P_INFO;
			if(liczG < N){
				int pom = getSize(buf->val);
				if(pom>30){
					printf("%s ma wiecej niz 30 znakow\n");
					clearTab(buf->val, MAX);
					strcpy(buf->val, "Login ma miec max 30 znakow!\n");
				}
				else{
					strcpy(gracz[liczG].login, buf->val);
					gracz[liczG].stolik = 0;
					printf("%s dopisany do bazy banych\n", buf->val);
					liczG++;
					clearTab(buf->val, MAX);
					strcpy(buf->val, "Witamy na serwerze!\n");
					if(liczS == 0) strcat(buf->val, "Nie ma jeszcze stolikow, jezeli chcesz go utworzyc wpisz \"nowy\"\n");
					else{
						int i = 0;
						for(i;i<liczS;i++){
							char str[3];
							strcat(buf->val, "Stolik ");
							if((i+1)<10)strcat(buf->val, "0");
							sprintf(str, "%d", (i+1));
							strcat(buf->val, str);
							strcat(buf->val, ":\tzajete ");
							sprintf(str, "%d", stolik[i].zajete);
							strcat(buf->val, str);
							strcat(buf->val, "\n");
						}
					}
				}
				if(msgsnd(msgSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
					perror("Wyslanie odp na login");
					exit(1);
				}
				usleep(10);
			}
			else{
				printf("Nie ma juz miejsca na serwerze dla %s.\n", buf->val);
				clearTab(buf->val, MAX);
				strcpy(buf->val, "Serwer zapelniony. Przepraszamy.\n");
				buf->nr = -1;
				if(msgsnd(msgSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
					perror("Wyslanie odp na login");
				}
			}
		}

		//wykonywanie komend
		else if(msgrcv(msgRcv, buf, (sizeof(struct mybuf)-sizeof(long)), CMD, IPC_NOWAIT) != -1){
				printf("Wykonuje polecenie:%s\n", buf->val);
				buf->mtype = INFO;
				//wyslanie info o statusie serwera (stanie pokoi)
				if(checkToN(buf->val, "ping", 4)==1){
					updateDb(gracz, stolik, msgSend);

					clearTab(buf->val, MAX);
					strcat(buf->val, "Dolacz/stworz nowy pokoj");
					int i = 0;
					for(i;i<liczS;i++){
						char str[3];
						strcat(buf->val, "\nStolik ");
						if((i+1)<10)strcat(buf->val, "0");
						sprintf(str, "%d", (i+1));
						strcat(buf->val, str);
						strcat(buf->val, ":\tzajete ");
						sprintf(str, "%d", stolik[i].zajete);
						strcat(buf->val, str);
						strcat(buf->val, "\n");
						buf->st=0;
					}
				}
			//tworzenie nowego pokoju
				else if(checkToN(buf->val, "nowy", 4)==1){
					char* tmp = malloc(sizeof(char) * 30);
					copyFromPoint(tmp, buf->val, 6, 36);
					printf("\nLogin:%s\n",tmp);
					int id = getId(gracz, liczG, tmp);
					if(gracz[id].stolik != 0){
						printf("Operacja niedozwolona\n");
						clearTab(buf->val,MAX);
						strcpy(buf->val,"Nie mozesz utworzyc nowego pokoju bedac juz w jednym!");
					}
					else{
						if(liczS<TBLS){
							if(id==-1){
								printf("Nie znaleziono %s w bazie danych\n",tmp);
								clearTab(buf->val, MAX);
								strcat(buf->val,"Nie ma cie w bazie danych, zaloguj sie ponownie.");
							}
							else{
								stolik[liczS].zajete = 1;
								stolik[liczS].gracze[0] = tmp;
								liczS++;
								printf("nowy Id: %d\n",id+1);
								gracz[id].stolik = liczS;

								clearTab(buf->val, MAX);
								if(liczS<10){
									strcpy(buf->val,"Utworzono pokoj nr 0");
								}
								else{
									strcpy(buf->val, "Utworzono pokoj nr ");
								}

								char str[3];
								sprintf(str, "%d", (liczS));
								strcat(buf->val, str);
								strcat(buf->val, " i dolaczono do niego.");
								buf->st=liczS;
							}
						}
						else{
							clearTab(buf->val,MAX);
							strcpy(buf->val, "Istnieje juz maksymalna liczba pokoi!");
						}
					}
					free(tmp);
				}
			//dolaczanie do istniejacego pokoju
				else if(checkToN(buf->val, "dolacz ", 7)==1){
					char* tmp = malloc(sizeof(char) * 30);
					copyFromPoint(tmp, buf->val, 7, 10); //wyciecie numeru pokoju
					int st = atoi(tmp);
					printf("Pokoj %d\n", st);
					if(liczS<st){
						printf("Nie istnieje pokoj %s\n", tmp);
						clearTab(buf->val, MAX);
						strcpy(buf->val, "Nie istnieje taki pokoj");
					}
					else{
						if(stolik[st-1].zajete==3){
							printf("Pokoj %d jest zajety\n", st);
							clearTab(buf->val, MAX);
							strcpy(buf->val, "Ten pokoj jest juz zapelniony");

						}
						else{
							copyFromPoint(tmp, buf->val, 11, 42);
							printf("Login:%s\n",tmp);
							int id = getId(gracz, liczG, tmp);
							if(id==-1)printf("Nie znaleziono %s w bazie danych\n",tmp);
							else{
								printf("Id: %d\n",id+1);
								gracz[id].stolik = st;
								stolik[st-1].zajete++;
								clearTab(buf->val,MAX);
								if(st<10){
									strcpy(buf->val,"Dolaczono do pokoju nr 0");
								}
								else{
									strcpy(buf->val, "Dolaczono do pokoju nr ");
								}
								int pom=0;
								char str[11];
								sprintf(str, "%d", (st));
								strcat(buf->val, str);
								buf->st=st;

								printf("Status pokoju %d\n", st);
								strcpy(buf->val, "Gracze w twoim pokoju");
								clearTab(str, 11);
								sprintf(str, "(%d):\n", stolik[st-1].zajete);
								strcat(buf->val, str);
								while(pom<stolik[st-1].zajete){
									strcat(buf->val, stolik[st-1].gracze[pom++]);
									strcat(buf->val, "\n");
								}
							}
						}
					}
					free(tmp);
				}
			//wychodzenie z aktualnego pokoju
				else if(checkToN(buf->val, "wyjdz", 5)==1){
					char* tmp = malloc(sizeof(char) * 30);
					copyFromPoint(tmp, buf->val, 7, 37);
					printf("\nLogin:%s\n",tmp);
					int id = getId(gracz, liczG, tmp);
					if(id==-1)
						printf("Nie znaleziono %s w bazie danych\n",tmp);
					else{
						int stol = gracz[id].stolik;
						gracz[id].stolik = 0;
						stolik[stol-1].zajete--;
						updateDb(gracz, stolik, msgSend);

						clearTab(buf->val, MAX);

						printf("Wychodze z pokoju\n");
						int i = 0;
						for(i;i<liczS;i++){
							char str[3];
							strcat(buf->val, "Stolik ");
							if((i+1)<10)strcat(buf->val, "0");
							sprintf(str, "%d", (i+1));
							strcat(buf->val, str);
							strcat(buf->val, ":\tzajete ");
							sprintf(str, "%d", stolik[i].zajete);
							strcat(buf->val, str);
							strcat(buf->val, "\n");
							buf->st=0;
						}
					}
						printf("Id: %d\n",id+1);
					free(tmp);
				}
				else if(checkToN(buf->val, "status", 6)==1){
					char* tmp = malloc(sizeof(char) * 30);
					copyFromPoint(tmp, buf->val, 7, 37);
					printf("\nLogin:%s\n",tmp);
					int id = getId(gracz, liczG, tmp);
					if(id==-1)
						printf("Nie znaleziono %s w bazie danych\n",tmp);
					else{
						int stol = gracz[id].stolik;

						clearTab(buf->val, MAX);
						updateDb(gracz, stolik, msgSend);
						if(stol>0){
							int pom=0;
							printf("Status pokoju %d\n", stol);
							strcpy(buf->val, "Gracze w twoim pokoju");
							char str[11];
							sprintf(str, "(%d):\n", stolik[stol-1].zajete);
							strcat(buf->val, str);
							while(pom<stolik[stol-1].zajete){
								strcat(buf->val, stolik[stol-1].gracze[pom++]);
								strcat(buf->val, "\n");
							}
						}
						else{
							strcpy(buf->val, "Jestes w lobby, przejdz do jednego z pokojow (np. \"dolacz 01\")\n");
							buf->st=0;
						}
					}
					free(tmp);
				}
				else if(checkToN(buf->val, "shutdown", 8)==1){
					char* tmp = malloc(sizeof(char) * 30);
					copyFromPoint(tmp, buf->val, 10, 37);
					printf("\nLogin:%s\n",tmp);
					int id = getId(gracz, liczG, tmp);
					if(id==-1)
						printf("Nie znaleziono %s w bazie danych\n",tmp);
					clearTab(buf->val, MAX);
					if(checkToN(tmp, "serv_admin", 10)==1){
						strcat(buf->val, "Koncze dzialanie serwera");
						printf("WYLACZAM SERWER(rozpoczete gry bd przesylac komunikaty, az sie nie skoncza)\n");
						if(msgsnd(msgSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
							perror("Wyslanie odp na komende");
						}
						clearTab(buf->val, MAX);
						buf->st=-1;
						strcat(buf->val,"SERWER ZOSTAL WYLACZONY!!!");
						int pl=liczG-1;
						while(pl>0){
							if(msgsnd(msgSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
								perror("Wyslanie odp na komende");
							}
							pl--;
						}
						//zwalnianie struktur przed zakonczeniem
						free(buf);
						free(stolik);
						free(gracze);
						exit(0);
					}
					else{
						strcat(buf->val, "Nie posiadasz uprawnien administratora!");
					}
				}
				else{
					printf("NIE MA TAKIEJ KOMENDY!\n");
					clearTab(buf->val, MAX);
					strcpy(buf->val, "NIE MA TAKIEJ KOMENDY!");
				}
				if(msgsnd(msgSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
					perror("Wyslanie odp na komende");
				}
			updateDb(gracz, stolik, msgSend);
		}
	}
	return 0;
}
Beispiel #5
0
void gra(int pokoj){

	int gameSend = msgget(pokoj*100, IPC_CREAT|0600);
	if(gameSend==-1){
		perror("Utworzenie kol. kom. wych. dla gry");
		exit(1);
	}


	int gameRcv = msgget(pokoj*100+10, IPC_CREAT|0600);
	if(gameRcv==-1){
		perror("Utworzenie kol. kom. przych. dla gry");
		exit(1);
	}

	srand(getpid()); //seedowanie liczb losowych wg id procesu

	int koniec=0;
	int tab[25];
	int gr[3][25]; //jakie karty ma jaki gracz
	int zdobyte[3][25]; //karty wygrane
	int kg[3]; //ile kart ma ktory gracz
	int i=0;
	int j=0;
	int pkty[3];
	for(i=0;i<3;i++)
			pkty[i]=0;
	int oferty[3];
	int pierwszy=0;
	while(!koniec){
		int koniecRozd=0;
		//rozdanie kart
		for(i=0;i<25;i++)tab[i]=1;
		for(i=0;i<25;i++)
			for(j=0;j<3;j++){
				zdobyte[j][i]=0;
				gr[j][i]=0;
		}
		for(i=0;i<3;i++)
			kg[i]=0;
		int rozdane=0;
		while(!koniecRozd){
			int karta=rand()%24 + 1;
			while(tab[karta]==0)karta=rand()%24 + 1;
			int ktory=rand()%3;
			if(kg[ktory]<7){
				gr[ktory][karta]=1;
				kg[ktory]+=1;
				tab[karta]=0;
				rozdane++;
			}
			if(rozdane==21)koniecRozd=1;
		}
		int musik[3];
		j=0;
		for(i=1;i<25;i++){
			if(tab[i]==1)musik[j++]=i;
		}
		//przesłanie info do graczy

		for(i=0;i<3;i++){
			buf->mtype=10+i+1;

			clearTab(buf->val, MAX);

			strcat(buf->val, "****************************************************************************************\nRozklad pkt:\nGracz 1: ");
			char* tmpS = malloc(sizeof(char)*4);
			clearTab(tmpS,4);
			sprintf(tmpS, "%d", pkty[0]);
			strcat(buf->val, tmpS);
			strcat(buf->val, "\nGracz 2: ");
			clearTab(tmpS,4);
			sprintf(tmpS, "%d", pkty[1]);
			strcat(buf->val, tmpS);
			strcat(buf->val, "\nGracz 3: ");
			clearTab(tmpS,4);
			sprintf(tmpS, "%d", pkty[2]);
			strcat(buf->val, tmpS);
			free(tmpS);
			char* tmp = malloc(sizeof(char)*MAX);
			jakieKarty(tmp,gr[i]);
			strcat(buf->val,"\n\nTwoje karty: ");
			strcat(buf->val, tmp);
			free(tmp);
			if(i==pierwszy)strcat(buf->val, "\nRozpoczynam licytacje, jako gracz na musiku, licytujesz 100");
			else strcat(buf->val,"\nRozpoczynam licytacje, czekam na oferty innych graczy...");
			buf->nr=buf->mtype-10;
			if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){
				perror("Wysylanie polecenia.");
				exit(1);
			}

		}
		//licytacja-----------------------------------------------------------------------------------------------------------------------------------
		printf("Pokoj %d: Licytacja\n",pokoj);
		oferty[0]=1;
		oferty[1]=1;
		oferty[2]=1;

			if(oferty[pierwszy]==1){
				char str[2];
				clearTab(str, 2);
				clearTab(buf->val, MAX);
				buf->mtype=11+(pierwszy+1)%3;
				buf->nr=buf->mtype-10;
				oferty[pierwszy]=100;
				strcat(buf->val, "\nRozpoczynam licytacje, podaj ilosc pktow. (0 == pas)\n\tGracz ");
				sprintf(str, "%d", (pierwszy+1));
				strcat(buf->val, str);
				strcat(buf->val, ": 100");
				if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wysłanie oferty do drugiego gracza
					perror("Wysylanie polecenia.");
					exit(1);
				}
			}

			if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), 101+(pierwszy+1)%3, 0) != -1){ //odebranie od drugiego gracza
				char str[4];
				char str2[4];
				strcpy(str, buf->val);
				clearTab(buf->val, MAX);
				oferty[(pierwszy+1)%3]=atoi(str);
				if(oferty[(pierwszy+1)%3] > 360){
					oferty[(pierwszy+1)%3]=360;
				}
				buf->mtype=11+(pierwszy+2)%3;
				buf->nr=buf->mtype-10;
				strcat(buf->val, "\nRozpoczynam licytacje, podaj ilosc pktow. (0 == pas)\n\tGracz ");
				sprintf(str2, "%d", (pierwszy+1));
				strcat(buf->val, str2);
				strcat(buf->val, ": 100");
				strcat(buf->val, "\n\tGracz ");
				sprintf(str2, "%d", (pierwszy+1)%3 + 1);
				strcat(buf->val, str2);
				strcat(buf->val, ": ");
				strcat(buf->val, str);
				if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wysłanie ofert do ostatneigo gracza
					perror("Wysylanie polecenia.");
					exit(1);
				}
			}

			if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), 101+(pierwszy+2)%3, 0) != -1){ //odebranie od ostatniego gracza
				char str[4];
				strcpy(str, buf->val);
				oferty[(pierwszy+2)%3]=atoi(str);
				if(oferty[(pierwszy+2)%3] > 360){
					oferty[(pierwszy+2)%3]=0;
				}
			}

		int wygryw=0;
		for(i=1;i<3;i++){
			if(oferty[i]>oferty[wygryw])wygryw=i;

		}
		int koniecLic=0;
		if(oferty[(wygryw+1)%3]<=0 && oferty[(wygryw+2)%3]<=0)koniecLic=1; //jezeli tylko jedna osoba nie spasowala
		int kto=pierwszy;

		while(!koniecLic){
			clearTab(buf->val, MAX);
			if(oferty[kto]!=0){
				char str[4];
				sprintf(str, "%d",oferty[wygryw]);
				strcat(buf->val,"Max oferta: ");
				strcat(buf->val, str);
				strcat(buf->val, " (Gracz ");
				clearTab(str,4);
				sprintf(str, "%d", (wygryw+1));
				strcat(buf->val, str);
				strcat(buf->val, ")\nPodaj wyzsza oferte (lub 0 by spasowac): ");

				buf->mtype=10+kto+1;
				buf->nr=buf->mtype-10;
				if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wysłanie informacji
					perror("Wysylanie polecenia.");
					exit(1);
				}
				if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), (100+kto+1), 0) != -1){ //odebranie od trzeciego gracza
					char str[4];
					strcpy(str, buf->val);
					oferty[kto]=atoi(str);
					if(oferty[kto] > 360 || oferty[kto] == oferty[wygryw]){
						oferty[kto]=0;
					}
					if(oferty[kto]>oferty[wygryw])wygryw=kto;
					else if(oferty[(wygryw+1)%3]<=0 && oferty[(wygryw+2)%3]<=0)koniecLic=1;
				}
			}
			kto=(kto+1)%3;

		}
		printf("Pokoj %d: Licytacje wygral Gracz %d\n",pokoj, (wygryw+1));

		for(i=0;i<3;i++) //dodanie kart z musika do puli gracza, kt wygral licytacje
			gr[wygryw][musik[i]]=1;

		clearTab(buf->val, MAX);
		buf->mtype=11+wygryw;
		buf->nr=buf->mtype-10;
		strcat(buf->val, "Wygrales licytacje! Musik: ");
		char str[11];
		sprintf(str, "%d %d %d", musik[0], musik[1], musik[2]);
		strcat(buf->val, str);
		char* tmp = malloc(sizeof(char)*MAX);
		jakieKarty(tmp,gr[wygryw]);
		strcat(buf->val,"\nTwoje karty: ");
		strcat(buf->val, tmp);
		free(tmp);//
		strcat(buf->val, "\nPodaj dwie karty do oddania i ostateczna kwote ktora planujesz ugrac(x y z): ");
		if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wysłanie informacji do wygranego
				perror("Wysylanie polecenia.");
				exit(1);
		}
		if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), (101+wygryw), 0) != -1){
			char str2[4];
			char str3[10];
			char str4[4];
			clearTab(str2,4);
			clearTab(str3,11);
			clearTab(str4,4);
			strcpy(str3, str);
			strcpy(str, buf->val);
			clearTab(buf->val, MAX);
			strcat(buf->val, "Musik: ");
			strcat(buf->val, str3);
			copyNthNumber(str2, str, 1, 11); //kopiuj pierwsza podana liczbe
			gr[wygryw][atoi(str2)]=0;
			strcat(buf->val,"\nOtrzymana karta: ");
			strcat(buf->val, str2);
			copyNthNumber(str4, str, 3, 11); //kopiuj ewentualnie podana kwote do licytacji
			int przebita = atoi(str4);
			strcat(buf->val, "\nLiczba pktow zadeklarowana do ugrania przez Gracza ");

			if(przebita<oferty[wygryw] || przebita > 360){
				clearTab(str4, 4);
				sprintf(str4, "%d", oferty[wygryw]);
			}
			strcat(buf->val, str4);

			buf->mtype=11+(wygryw+1)%3;
			gr[(wygryw+1)%3][atoi(str2)]=1;


			buf->nr=buf->mtype-10;
			if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wysłanie informacji do pozostalych graczy
				perror("Wysylanie polecenia.");
				exit(1);
			}

			clearTab(buf->val, MAX);
			clearTab(str2, 4);
			strcat(buf->val, "Musik: ");
			strcat(buf->val, str3);
			copyNthNumber(str2, str, 2, 11); //kopiuj druga z podanych liczb
			gr[wygryw][atoi(str2)]=0;
			strcat(buf->val,"\nOtrzymana karta: ");
			strcat(buf->val, str2);
			strcat(buf->val, "\nLiczba pktow zadeklarowana do ugrania przez Gracza ");
			if(przebita<oferty[wygryw]){
				clearTab(str4, 4);
				sprintf(str4, "%d", oferty[wygryw]);
			}
			strcat(buf->val, str4);

			buf->mtype=11+(wygryw+2)%3;
			gr[(wygryw+2)%3][atoi(str2)]=1;

			buf->nr=buf->mtype-10;
			if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wysłanie informacji do pozostalych graczy
				perror("Wysylanie polecenia.");
				exit(1);
			}
		}

		//rozgrywka----------------------------------------------------------------------------------------------------------------------------
		printf("Pokoj %d: Rozgrywka\n", pokoj);
		int rozp=wygryw;
		int odbior;
		int meld[3];
		meld[0]=0;
		meld[1]=0;
		meld[2]=0;
		int atut=-1;

		for(i=0;i<8;i++){ //8 tur

			printf("Pokoj %d: %d tura\n",pokoj, (i+1));
			int kar=0, kar2=0, kar3=0, kolor=-1, m=0, najwiek=0;

			char str123[4];
			clearTab(buf->val, MAX);
			char* tmp = malloc(sizeof(char)*MAX);
			jakieKarty(tmp,gr[rozp]);
			strcat(buf->val,"--------------------------------------------\nKarty: ");
			strcat(buf->val, tmp);
			if(atut==-1)strcat(buf->val, "\nPodaj numer karty do zagrania (mozna meldowac, jezeli ma sie pare na rece): ");
			else{
				strcat(buf->val, "\nPodaj numer karty do zagrania (mozna meldowac, jezeli ma sie pare na rece; atut: X%4==");
				char st[2];
				sprintf(st, "%d", atut);
				strcat(buf->val, st);
				strcat(buf->val, "): ");
			}

			buf->mtype=10+rozp+1;
			buf->nr=buf->mtype-10;
			printf("Pokoj %d: wysylam na %d\n",pokoj,buf->mtype);
			if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), IPC_NOWAIT) == -1){ //wys. info. o kartach i prosba o karte
				perror("Wysylanie polecenia.");
				exit(1);
			}

			sleep(1);
			clearTab(buf->val, MAX);
			printf("Pokoj %d: czekam na karte gracza %d\n",pokoj, (rozp+1));
			if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), (100+rozp+1), 0) != -1){
				if(buf->val[0]=='m' && buf->val[1]!=NULL && buf->val[1]!='\n'){ //jezeli byl meldunek
					char kol[3];
					clearTab(kol,3);
					kol[0]=buf->val[1];
					kol[1]=buf->val[2];
					printf("Pokoj %d: gracz %d zagrywa %s\n",pokoj, rozp, kol);
					kar = atoi(kol);
					if(kar<1 || kar>24 gr[odbior-101][kar3]==0) kar = najwKarta(gr[rozp]);
					gr[rozp][kar]=0;
					kolor = kar%4;
					if(kar>8 && kar<13 && gr[rozp][kar+4]==1){
						switch(kolor){
							case 0:
								printf("Pokoj %d: Gracz %d zameldowal 40\n",pokoj, (rozp+1));
								meld[rozp]+=40;
								atut=0;
								break;
							case 1:
								printf("Pokoj %d: Gracz %d zameldowal 60\n",pokoj, (rozp+1));
								meld[rozp]+=60;
								atut=1;
								break;
							case 2:
								printf("Pokoj %d: Gracz %d zameldowal 80\n",pokoj, (rozp+1));
								meld[rozp]+=80;
								atut=2;
								break;
							default:
								printf("Pokoj %d: Gracz %d zameldowal 100\n",pokoj, (rozp+1));
								meld[rozp]+=100;
								atut=3;
								break;
						}
						clearTab(str123, 4);
						strcat(str123, kol);

						m=1;
					}
					else {
						kar=0; //jak ktos probuje meldowac niemajac pary, karta jest bezuzyteczna
						printf("\t\tbufor: %s\n", buf->val);
					}
					usleep(10);
				}
				else{
					usleep(10);
					clearTab(str123,4);
					strcat(str123, buf->val);
					printf("Pokoj %d: gracz %d zagrywa %s\n",pokoj, rozp, str123);
					kar = atoi(str123);
					if(kar<1 || kar>24 gr[rozp][kar]==0) kar = najwKarta(gr[rozp]);
					gr[rozp][kar]=0;
					kolor = kar%4;
				}

				najwiek=rozp;
			}

			buf->mtype=11+(rozp+1)%3;
			odbior = 101+(rozp+1)%3;

			clearTab(buf->val, MAX);
			clearTab(tmp, MAX);
			jakieKarty(tmp,gr[odbior-101]);
			strcat(buf->val,"--------------------------------------------\nKarty: ");
			strcat(buf->val, tmp);
			strcat(buf->val, "\nKarta zagrana: ");


			if(m==1)strcat(buf->val, "m");
			strcat(buf->val, str123);
			if(atut==-1)strcat(buf->val, "\nPodaj numer karty do zagrania: ");
			else{
				strcat(buf->val, "\nPodaj numer karty do zagrania (atut: X%4==");
				char st[2];
				sprintf(st, "%d", atut);
				strcat(buf->val, st);
				strcat(buf->val, "): ");
			}

			//wys. info. o kartach i prosba o karte do gracza po lewej
			printf("Pokoj %d: wysylam na %d\n",pokoj,buf->mtype);
			buf->nr=buf->mtype-10;
			if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), IPC_NOWAIT) == -1){
				perror("Wysylanie polecenia.");
				exit(1);
			}

			sleep(1);
			clearTab(buf->val,MAX);
			printf("Pokoj %d: czekam na karte gracza %d\n", pokoj,(odbior-100));
			if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), odbior, 0) != -1){
				clearTab(str123,4);
				strcat(str123, buf->val);
				printf("Pokoj %d: gracz %d zagrywa %s\n",pokoj, odbior-101, str123);
				kar2 = atoi(str123);
				if(kar2<1 || kar2>24 || gr[odbior-101][kar2]==0) {
					printf("Pokoj %d: gracz %d - proba oszustwa\n",pokoj, odbior-101);
					kar2 = najwKarta(gr[odbior-101]);
				}
				gr[odbior-101][kar2]=0;
				if((kolor==(kar2%4) && kar2>kar) || (kolor!=atut && atut==(kar2%4)))
					najwiek = odbior-101;
				if(kolor!=atut && atut==(kar2%4))
					kolor=atut;
			}

			buf->mtype=11+(rozp+2)%3;
			odbior = 101+(rozp+2)%3;


			clearTab(buf->val, MAX);
			clearTab(tmp, MAX);
			jakieKarty(tmp,gr[odbior-101]);
			strcat(buf->val,"--------------------------------------------\nKarty: ");
			strcat(buf->val, tmp);
			strcat(buf->val, "\nKarty zagrane: ");


			if(m==1)strcat(buf->val, "m");
			clearTab(str123, 4);
			sprintf(str123, "%d ", kar);
			strcat(buf->val, str123);
			sprintf(str123, "%d ", kar2);
			strcat(buf->val, str123);
			if(atut==-1)strcat(buf->val, "\nPodaj numer karty do zagrania: ");
			else{
				strcat(buf->val, "\nPodaj numer karty do zagrania (atut: X%4==");
				char st[2];
				sprintf(st, "%d", atut);
				strcat(buf->val, st);
				strcat(buf->val, "): ");
			}

			//wys. info. o kartach i prosba o karte do ostatniego gracza
			printf("Pokoj %d: wysylam na %d\n",pokoj,buf->mtype);
			buf->nr=buf->mtype-10;
			if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wys. info. o kartach i prosba o karte
				perror("Wysylanie polecenia.");
				exit(1);
			}

			sleep(1);

			printf("Pokoj %d: czekam na karte gracza %d\n",pokoj, (odbior-100));
			if(msgrcv(gameRcv, buf, (sizeof(struct mybuf)-sizeof(long)), odbior, 0) != -1){
				clearTab(str123,4);
				strcat(str123, buf->val);
				printf("Pokoj %d: gracz %d zagrywa %s\n",pokoj, odbior-101, str123);
				kar3 = atoi(str123);
				if(kar3<1 || kar3>24 || gr[odbior-101][kar3]==0) {
					printf("Pokoj %d: gracz %d - proba oszustwa\n",pokoj, odbior-101);
					kar3 = najwKarta(gr[odbior-101]);
				}
				gr[odbior-101][kar3]=0;
				//wygrana jeśli: karty tego samego koloru a ta najwieksza; jedyna karta atutowa; wieksza z kart atutowych
				if((kolor==(kar3%4) && ((najwiek==rozp && kar3>kar) || (najwiek!=rozp && kar3>kar2))) ||
				  	(atut==(kar3%4) && kolor!=atut) ||
				    (atut==(kar3%4) && ((najwiek==rozp && kolor==atut && kar3>kar) || (najwiek!=rozp && kar2%4==atut && kar3>kar2)))){
					najwiek = odbior-101;
				}
			}

			clearTab(buf->val, MAX);
			clearTab(str123, 4);
			strcat(buf->val, "Wygrywa gracz ");
			sprintf(str123, "%d ",(najwiek+1));
			strcat(buf->val, str123);
			clearTab(str123, 4);
			strcat(buf->val, "\nKarty zagrane w tej turze: ");
			sprintf(str123, "%d ", kar);
			strcat(buf->val, str123);
			sprintf(str123, "%d ", kar2);
			strcat(buf->val, str123);
			sprintf(str123, "%d ", kar3);
			strcat(buf->val, str123);
			if(i<7)strcat(buf->val, "\n\nKolejna tura!");
			else strcat(buf->val, "\n\nPodliczanie pktow!");

			for(j=0;j<3;j++){
				buf->mtype=10+j+1;
				buf->nr=buf->mtype-10;
				if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wys. info. o rezultacie
					perror("Wysylanie polecenia.");
					exit(1);
				}
			}

			zdobyte[najwiek][kar]=1;
			zdobyte[najwiek][kar2]=1;
			zdobyte[najwiek][kar3]=1;
			free(tmp);
			rozp=najwiek;
		}
		for(i=0;i<3;i++){
			int tmpPkt=liczPkt(zdobyte[i]) + meld[i];
			if(i!=wygryw){
				int przyb = tmpPkt/5;
				if(przyb%2 == 1) przyb++;
				pkty[i]+=przyb*5;
			}
			else if(i==wygryw && tmpPkt >= oferty[wygryw])
				pkty[i]+=oferty[wygryw];
			else if(i==wygryw && tmpPkt < oferty[wygryw])
				pkty[i]-=oferty[wygryw];
			printf("Pokoj %d: Gracz %d: %d\n", pokoj, (i+1), (tmpPkt));
			if(pkty[i]>=WYGRANA)koniec=1;
		}
		pierwszy=(pierwszy+1)%3;
	}
	printf("Pokoj %d: Podsumanie zakonczonej gry\n", pokoj);
	clearTab(buf->val, MAX);
	strcat(buf->val, "Koniec gry!\n");
	strcat(buf->val, "Ostateczny rozklad pkt:\nGracz 1: ");
	char* tmpS = malloc(sizeof(char)*4);
	clearTab(tmpS,4);
	sprintf(tmpS, "%d", pkty[0]);
	strcat(buf->val, tmpS);
	strcat(buf->val, "\nGracz 2: ");
	clearTab(tmpS,4);
	sprintf(tmpS, "%d", pkty[1]);
	strcat(buf->val, tmpS);
	strcat(buf->val, "\nGracz 3: ");
	clearTab(tmpS,4);
	sprintf(tmpS, "%d", pkty[2]);
	strcat(buf->val, tmpS);
	free(tmpS);

	for(i=0;i<3;i++){
		buf->mtype=10+i+1;
		printf("Pokoj %d: koniec dla %d\n", pokoj,(i+1));
		buf->nr=0;
		if(msgsnd(gameSend, buf, (sizeof(struct mybuf)-sizeof(long)), 0) == -1){ //wys. info. o rezultacie
			perror("Wysylanie polecenia.");
			exit(1);
		}
	}
}