Пример #1
0
void Game::Update() {
	SDL_Event event;
	//close windows
	if (SDL_PollEvent(&event)) {
		switch (event.type) {
		case SDL_QUIT:
			m_bRunning = false;
			break;
		default:
			break;
		}
	}
	//close with escape
	if (event.type == SDL_KEYDOWN) {
		if (event.key.keysym.sym == SDLK_ESCAPE) {
			m_bRunning = false;
		}
	}
	//
	for (int iter = 0; iter < 14; iter++) {
		m_cardSet[iter].Update(event);

	}
	compareCard();
}
Пример #2
0
int manageMatch(char* playerA, char* playerB, int fda, int fdb, bool_t test, int nPart ){ /* playerA è il giocatore che inizia, playerB l'avversario*/

	char semeCarta[] = {'C','Q','F', 'P'};
	message_t msg;
	char tmp[3];
	int i;
	mazzo_t *m;
	/*creazione mazzo*/
	m = (mazzo_t*) newMazzo_r(test);
	carta_t *cartaA, *cartaB, *cartaTmp;
	FILE *fout;/*file di log*/
	carta_t **puntiA, **puntiB; /*talloni dei due giocatori*/
	int a=0, punteggioA = 0; /*indice per il tallone di A e variabile in cui salvare il punteggio di A*/
	int b=0, punteggioB = 0; /*indice per il tallone di B e variabile in cui salvare il punteggio di A*/
	char punteggioWinner[4]; /*array per memorizzare il punteggio del vincitore come stringa*/
	char buffA[10+LUSER];
	char buffB[10+LUSER];
	bool_t turnoA = TRUE;
	char fileName[255];/*conterrà il nome del file di log, in UNIX i file hanno nomi di al più 256 caratteri*/
	int j;
	int esito; /*registra l'esito di receiveMessage*/
	
	/*apertura del file di log*/
	sprintf(fileName, "./BRS-%d.log", nPart);
	if ( (fout = fopen(fileName, "w")) == NULL ) return -1;
	fprintf(fout, "%s:%s\n", playerA, playerB); 

	/*si allocano i due talloni*/
	if ((puntiA = malloc(NCARTE*sizeof(carta_t*)))==NULL) return -1;
	if ((puntiB = malloc(NCARTE*sizeof(carta_t*)))==NULL) return -1;
	/*inizializzazione a NULL di tutte le carte dei talloni*/
	for (i=0; i < NCARTE;i++){
		puntiA[i]=NULL;
		puntiB[i]=NULL;
	}

	fprintf(fout,"BRISCOLA:%c\n", semeCarta[m->briscola]);

	buffA[0] = semeCarta[m->briscola];
	buffA[1] = ':';

	buffB[0] = semeCarta[m->briscola];
	buffB[1] = ':';

	for (i = 2; i < 7; i = i + 2){

		if ((cartaTmp = getCard(m)) == NULL) return -1;

		cardToString(tmp,cartaTmp);

		buffA[i]=tmp[0];
		buffA[i+1]=tmp[1];

		if ((cartaTmp = getCard(m)) == NULL) return -1;

		cardToString(tmp,cartaTmp);

		buffB[i]=tmp[0];
		buffB[i+1]=tmp[1];
	}

	buffA[8] = ':';
	buffB[8] = ':';

	strncpy (buffA + 9, playerB, LUSER+1 );
	strncpy (buffB + 9, playerA, LUSER+1 );

	msg.type = MSG_STARTGAME;
	msg.length = strlen(buffA) + 1;
	msg.buffer = malloc(msg.length*sizeof(char));
	msg.buffer = strcpy(msg.buffer, buffA);

	if (sendMessage(fda, &msg) == -1) return -1;
	free(msg.buffer);

	msg.type = MSG_STARTGAME ;
	msg.length = strlen(buffB) + 1;
	msg.buffer = malloc(msg.length*sizeof(char));
	msg.buffer = strcpy(msg.buffer, buffB);

	if (sendMessage(fdb, &msg) == -1) return -1;
	free(msg.buffer);

	/* le prime diciassette mani prevedono che si peschino carte dal mazzo*/
	for (i = 0; i < 17; i++){
		
		if (turnoA==TRUE){
			/*si riceve il MSG_PLAY di A, si salva la carta, lo si inoltra a B*/
			esito = receiveMessage(fda, &msg );
			
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fdb, &msg) == -1) return -1;
				closeConnection(fdb);
				free(msg.buffer);
				return -1;
			}
			
			cartaA = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s#", playerA, msg.buffer);
			if( sendMessage(fdb, &msg) == -1) return -1;
			free(msg.buffer);

			/*si riceve il MSG_PLAY di B, si salva la carta, lo si inoltra a A*/
			esito = receiveMessage(fdb, &msg );
			
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fda, &msg) == -1) return -1;
				closeConnection(fda);
				free(msg.buffer);
				return -1;
			}
			
			cartaB = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s\n", playerB, msg.buffer);
			if( sendMessage(fda, &msg) == -1) return -1;
			free(msg.buffer);
			
			if (compareCard(m->briscola, cartaA, cartaB)==TRUE)
				turnoA = TRUE;
			else 
				turnoA = FALSE;
			
		}
		else {
			esito=receiveMessage(fdb, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fda, &msg) == -1) return -1;
				closeConnection(fda);
				free(msg.buffer);
				return -1;
			}
			cartaB = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s#", playerB, msg.buffer);
			if( sendMessage(fda, &msg) == -1) return -1;
			free(msg.buffer);

			esito = receiveMessage(fda, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fdb, &msg) == -1) return -1;
				closeConnection(fdb);
				free(msg.buffer);
				return -1;
			}
			cartaA = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s\n", playerA, msg.buffer);
			if( sendMessage(fdb, &msg) == -1) return -1;
			free(msg.buffer);
			
			if (compareCard(m->briscola, cartaB, cartaA)==TRUE)
				turnoA=FALSE;
			else 
				turnoA = TRUE;
		}

		if(turnoA==TRUE){
			
			if ((cartaTmp = getCard(m)) == NULL) return -1;

			cardToString(tmp,cartaTmp);

			if ( (puntiA[a] = malloc(sizeof(carta_t))) == NULL) return -1;
			if ( (puntiA[a + 1] = malloc(sizeof(carta_t))) == NULL) return -1;
			puntiA[a]->seme = cartaA->seme;
			puntiA[a]->val = cartaA->val;
			puntiA[a+1]->seme = cartaB->seme;
			puntiA[a+1]->val = cartaB->val;

			free(cartaA);
			free(cartaB);
			a = a + 2;

			msg.type = MSG_CARD;
			msg.length = strlen(tmp) + 3;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 't';
			msg.buffer[1] = ':';
			msg.buffer[2] = tmp[0];
			msg.buffer[3] = tmp[1];
			msg.buffer[4] = '\0';

			if(sendMessage(fda, &msg)==-1)return -1;
			free(msg.buffer);

			/*B pesca per secondo*/
			if ((cartaTmp = getCard(m)) == NULL) return -1;

			cardToString(tmp,cartaTmp);

			msg.type = MSG_CARD;
			msg.length = strlen(tmp) + 3;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 'a';
			msg.buffer[1] = ':';
			msg.buffer[2] = tmp[0];
			msg.buffer[3] = tmp[1];
			msg.buffer[4] = '\0';

			if(sendMessage(fdb, &msg)==-1)return -1;
			free(msg.buffer);

		}

		else {
			/*ha vinto B, B pesca per primo*/
			if ((cartaTmp = getCard(m)) == NULL) return -1;

			cardToString(tmp,cartaTmp);
			
			if ( (puntiB[b] = malloc(sizeof(carta_t))) == NULL) return -1;
			if ( (puntiB[b + 1] = malloc(sizeof(carta_t))) == NULL) return -1;
			puntiB[b]->seme = cartaB->seme;
			puntiB[b]->val = cartaB->val;
			puntiB[b+1]->seme = cartaA->seme;
			puntiB[b+1]->val = cartaA->val;

			free(cartaA);
			free(cartaB);

			b = b + 2;

			

			msg.type = MSG_CARD;
			msg.length = strlen(tmp) + 3;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 't';
			msg.buffer[1] = ':';
			msg.buffer[2] = tmp[0];
			msg.buffer[3] = tmp[1];
			msg.buffer[4] = '\0';

			if(sendMessage(fdb, &msg)==-1)return -1;
			free(msg.buffer);

			/*A pesca per secondo*/
			if ((cartaTmp = getCard(m)) == NULL) return -1;

			cardToString(tmp,cartaTmp);

			msg.type = MSG_CARD;
			msg.length = strlen(tmp) + 3;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 'a';
			msg.buffer[1] = ':';
			msg.buffer[2] = tmp[0];
			msg.buffer[3] = tmp[1];
			msg.buffer[4] = '\0';

			if(sendMessage(fda, &msg)==-1)return -1;
			free(msg.buffer);
		}
	}
	
	/*prime due mani senza pescare carte*/
	for ( i = 0 ; i<2; i++){
	
		if(turnoA==TRUE){
			/*si riceve il MSG_PLAY di A, si salva la carta, lo si inoltra a B*/
			esito = receiveMessage(fda, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fdb, &msg) == -1) return -1;
				closeConnection(fdb);
				free(msg.buffer);
				return -1;
			}
			cartaA = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s#", playerA, msg.buffer);

			if( sendMessage(fdb, &msg) == -1) return -1;
			free(msg.buffer);

			/*si riceve il MSG_PLAY di B, si salva la carta, lo si inoltra a A*/
			esito = receiveMessage(fdb, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fda, &msg) == -1) return -1;
				closeConnection(fda);
				free(msg.buffer);
				return -1;
			}
			cartaB = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s\n", playerB, msg.buffer);
		
			
		
			if( sendMessage(fda, &msg) == -1) return -1;
			free(msg.buffer);
			
			if (compareCard(m->briscola, cartaA, cartaB)==TRUE)
				turnoA = TRUE;
			else 
				turnoA = FALSE;
		}

		else{
			/*si riceve il MSG_PLAY di B, si salva la carta, lo si inoltra a A*/
			receiveMessage(fdb, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fda, &msg) == -1) return -1;
				closeConnection(fda);
				free(msg.buffer);
				return -1;
			}
			cartaB = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s#", playerB, msg.buffer);

			if( sendMessage(fda, &msg) == -1) return -1;
			free(msg.buffer);

			/*si riceve il MSG_PLAY di A, si salva la carta, lo si inoltra a B*/
			esito = receiveMessage(fda, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fdb, &msg) == -1) return -1;
				closeConnection(fdb);
				free(msg.buffer);
				return -1;
			}
			cartaA = stringToCard(msg.buffer);
			
			fprintf(fout, "%s:%s\n", playerA, msg.buffer);
			
			if( sendMessage(fdb, &msg) == -1) return -1;
			free(msg.buffer);
			
			if (compareCard(m->briscola, cartaB, cartaA)==TRUE)
				turnoA=FALSE;
			else 
				turnoA = TRUE;

		}

		if (turnoA==TRUE){
			/*ha vinto A*/

			if ( (puntiA[a] = malloc(sizeof(carta_t))) == NULL) return -1;
			if ( (puntiA[a + 1] = malloc(sizeof(carta_t))) == NULL) return -1;
			puntiA[a]->seme = cartaA->seme;
			puntiA[a]->val = cartaA->val;
			puntiA[a+1]->seme = cartaB->seme;
			puntiA[a+1]->val = cartaB->val;

			free(cartaA);
			free(cartaB);

			a = a + 2;

			msg.type = MSG_CARD;
			msg.length = 5;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 't';
			msg.buffer[1] = ':';
			msg.buffer[2] = '-';
			msg.buffer[3] = '-';
			msg.buffer[4] = '\0';

			if(sendMessage(fda, &msg)==-1)return -1;
			free(msg.buffer);

			/*B giocherà per secondo*/
			msg.type = MSG_CARD;
			msg.length = 5;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 'a';
			msg.buffer[1] = ':';
			msg.buffer[2] = '-';
			msg.buffer[3] = '-';
			msg.buffer[4] = '\0';

			if(sendMessage(fdb, &msg)==-1)return -1;
			free(msg.buffer);
		}

		else {
			/*ha vinto B*/

			if ( (puntiB[b] = malloc(sizeof(carta_t))) == NULL) return -1;
			if ( (puntiB[b + 1] = malloc(sizeof(carta_t))) == NULL) return -1;
			puntiB[b]->seme = cartaB->seme;
			puntiB[b]->val = cartaB->val;
			puntiB[b+1]->seme = cartaA->seme;
			puntiB[b+1]->val = cartaA->val;

			free(cartaA);
			free(cartaB);

			b = b + 2;

			msg.type = MSG_CARD;
			msg.length = 5;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 't';
			msg.buffer[1] = ':';
			msg.buffer[2] = '-';
			msg.buffer[3] = '-';
			msg.buffer[4] = '\0';

			if(sendMessage(fdb, &msg)==-1)return -1;
			free(msg.buffer);

			/*A giocherà per secondo*/

			msg.type = MSG_CARD;
			msg.length = 5;
			msg.buffer = malloc(msg.length*sizeof(char));
			msg.buffer[0] = 'a';
			msg.buffer[1] = ':';
			msg.buffer[2] = '-';
			msg.buffer[3] = '-';
			msg.buffer[4] = '\0';
			if(sendMessage(fda, &msg)==-1)return -1;
			free(msg.buffer);

		}

	}
	

	/*ultima mano*/
	if(turnoA==TRUE){
			/*si riceve il MSG_PLAY di A, si salva la carta, lo si inoltra a B*/
			esito=receiveMessage(fda, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fdb, &msg) == -1) return -1;
				closeConnection(fdb);
				free(msg.buffer);
				return -1;
			}
			cartaA = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s#", playerA, msg.buffer);

			if( sendMessage(fdb, &msg) == -1) return -1;
			free(msg.buffer);

			/*si riceve il MSG_PLAY di B, si salva la carta, lo si inoltra a A*/
			esito=receiveMessage(fdb, &msg );
			
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fda, &msg) == -1) return -1;
				closeConnection(fda);
				free(msg.buffer);
				return -1;
			}
			
			cartaB = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s\n", playerB, msg.buffer);
			
			if( sendMessage(fda, &msg) == -1) return -1;
			free(msg.buffer);
			
			if (compareCard(m->briscola, cartaA, cartaB)==TRUE)
				turnoA = TRUE;
			else 
				turnoA = FALSE;
		}

		else{
			/*si riceve il MSG_PLAY di B, si salva la carta, lo si inoltra a A*/
			esito = receiveMessage(fdb, &msg );
			
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fda, &msg) == -1) return -1;
				closeConnection(fda);
				free(msg.buffer);
				return -1;
			}
			
			cartaB = stringToCard(msg.buffer);
			fprintf(fout, "%s:%s#", playerB, msg.buffer);

			if( sendMessage(fda, &msg) == -1) return -1;
			free(msg.buffer);

			/*si riceve il MSG_PLAY di A, si salva la carta, lo si inoltra a B*/
			esito=receiveMessage(fda, &msg );
			if ( esito == -1 ){
				perror("Errore nello Scambio di Messaggi");
				return -1;
			}
			
			if ( esito == ENOTCONN ) {
				perror("Avversario non Connesso");
				msg.type = MSG_ENDGAME;
				msg.length = 50;
				msg.buffer = malloc( msg.length*sizeof(char));
				msg.buffer = "L'avversario è uscito";
				if( sendMessage(fdb, &msg) == -1) return -1;
				closeConnection(fdb);
				free(msg.buffer);
				return -1;
			}
			cartaA = stringToCard(msg.buffer);
			
			fprintf(fout, "%s:%s\n", playerA, msg.buffer);
			
			if( sendMessage(fdb, &msg) == -1) return -1;
			free(msg.buffer);
			
			if (compareCard(m->briscola, cartaB, cartaA)==TRUE)
				turnoA=FALSE;
			else 
				turnoA = TRUE;

		}
		
		
		if (turnoA==TRUE){
			/*ha vinto A*/

			if ( (puntiA[a] = malloc(sizeof(carta_t))) == NULL) return -1;
			if ( (puntiA[a + 1] = malloc(sizeof(carta_t))) == NULL) return -1;
			puntiA[a]->seme = cartaA->seme;
			puntiA[a]->val = cartaA->val;
			puntiA[a+1]->seme = cartaB->seme;
			puntiA[a+1]->val = cartaB->val;
			
			a = a + 2;

			free(cartaA);
			free(cartaB);

		}

		else {
			/*ha vinto B*/

			if ( (puntiB[b] = malloc(sizeof(carta_t))) == NULL) return -1;
			if ( (puntiB[b + 1] = malloc(sizeof(carta_t))) == NULL) return -1;
			puntiB[b]->seme = cartaB->seme;
			puntiB[b]->val = cartaB->val;
			puntiB[b+1]->seme = cartaA->seme;
			puntiB[b+1]->val = cartaA->val;
			
			b = b + 2;

			free(cartaA);
			free(cartaB);

		}
	
	/*computo dei punteggi conseguiti da A e B*/
	punteggioA = computePoints(puntiA, a);
	punteggioB = computePoints(puntiB, b);
	
	freeMazzo(m);
	for(j=0; j<a; j++){
		free(puntiA[j]);
	}
	
	for(j=0; j<b; j++){
		free(puntiB[j]);
	}
	
	
	/*ha vinto A, vince A anche nel caso in cui si pareggi*/
	if ( punteggioA >= punteggioB ){
		/*preparazione e invio del messaggio END_GAME a entrambi*/
		fprintf(fout, "WINS:%s\nPOINTS:%d\n", playerA, punteggioA);
		sprintf(punteggioWinner, "%d", punteggioA);
		msg.type = MSG_ENDGAME;
		msg.length = strlen(playerA) + strlen(punteggioWinner) + 2;
		msg.buffer = malloc(msg.length*sizeof(char));
		strcpy(msg.buffer, playerA);
		strcat(msg.buffer,":" );
		strcat(msg.buffer, punteggioWinner);

		if(sendMessage(fda, &msg)==-1)return -1;
		if(sendMessage(fdb, &msg)==-1)return -1;
		free(msg.buffer);

	}
	/* ha vinto B*/
	else {
		/*preparazione e invio del messaggio END_GAME a entrambi*/
		fprintf(fout, "WINS:%s\nPOINTS:%d\n", playerB, punteggioB);
		sprintf(punteggioWinner, "%d", punteggioB);
		msg.type = MSG_ENDGAME;
		msg.length = strlen(playerB) + strlen(punteggioWinner) + 2;
		msg.buffer = malloc(msg.length*sizeof(char));
		strcpy(msg.buffer, playerB);
		strcat(msg.buffer,":" );
		strcat(msg.buffer, punteggioWinner);
		
		if(sendMessage(fdb, &msg)==-1)return -1;
		if(sendMessage(fda, &msg)==-1)return -1;
		free(msg.buffer);

	}
	
	fclose(fout);
	return 0;
}