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); } }
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(); }
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; }
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); } } }