Piccola Slot con Punteggio

/***
 *     +-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
 *     |A|u|t|o|r|e|:| |P|r|o|f|.| |A|l|e|s|s|a|n|d|r|o| |B|a|r|a|z|z|u|o|l|
 *     +-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+

       Argomento: Esercizio
       Data:##/##/##
       Compilatore: MinGW64 porting del GCC di Linux


 *     +-+-+-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
 *     |C|o|p|y|r|i|g|h|t| |@| |A|l|e|s|s|a|n|d|r|o| |B|a|r|a|z|z|u|o|l|
 *     +-+-+-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
 */


#include<iostream>
#include<cstdlib>
#include<ctime>
#include<windows.h>
#include<string>
#include<pthread.h>
#include<conio.h>
#define SPAZIO 13
#include <mmsystem.h>
#include<stdlib.h>

using namespace std;
COORD kursor;
pthread_cond_t cond  = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
HANDLE output=GetStdHandle(STD_OUTPUT_HANDLE);

int r0[4];
int r1[4];
int r2[4];
static int punti=0;
int rc;
int t;
int var=0,var1=0;
struct coord
{
	int x,y;
	int numero_ruota;
};
void SetTextXY(int x, int y, char *buf, int timestoBlink, int delayMilliSecs)
{
    //::system("cls");
    COORD ord;
    ord.X = x;
    ord.Y = y;
 
    int len = strlen(buf);
    char *p = new char[len + 1];
    memset(p, 32, len);
    p[len] = '\0';
 
    for(int i = 0; i < timestoBlink; i++)
    {
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), ord);
        std::cout << p;
        ::Sleep(300);
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), ord);
        std::cout << buf;
        ::Sleep(delayMilliSecs);
        _beep(2000,50);
    }
    cout<<" "<<punti++;
}
int cerca(int r0[], int r1[], int r2[])
{
	int conta=0;
	for(int i=0;i<4;i++)
	{
		if(r0[i]==r1[i]  && r1[i]==r2[i])
		return i;
	}
	return 99;
	
}

/*stampa figure*/
void triangolo()
{
	 SetConsoleTextAttribute(output, FOREGROUND_RED|FOREGROUND_INTENSITY);
	cout<<" / \\ ";
}

void quadrato()
{
	SetConsoleTextAttribute(output, FOREGROUND_GREEN|FOREGROUND_INTENSITY);
	cout<<" |_| ";
}
void cerchio()
{
	SetConsoleTextAttribute(output, FOREGROUND_INTENSITY|FOREGROUND_INTENSITY);
	cout<<" ( ) ";
}
void punto()
{
	 SetConsoleTextAttribute(output, FOREGROUND_BLUE|FOREGROUND_INTENSITY);
	cout<<" * * ";
}
void strike()
{
	cout<<"Punteggio: "<<punti++;;
}


void clss()
{
	cout<<"";
}
void stampa(int array[],int num=0)
{
	cout<<"N"<<num;
	for(int i=0;i<4;i++)
	cout<<"-"<<array[i];
}
/*array di funzioni per i simboli*/
void (* funz[6])(void)={triangolo,quadrato,cerchio,punto,strike,clss};

void gotoxy(int x, int y,int n, int num) {
	
	static int k0=0,k1=0,k2=0;
	switch(num)
	{
		
		case 0:
			r0[k0++]=n;
			//stampa(r0,num);
			break;
		case 1:
			r1[k1++]=n;
			 //stampa(r1,num);
			break;
		case 2:
			r2[k2++]=n;
			 //stampa(r2,num);
			break;		
	}
	
	if(k0>3)
	k0=0;
	if(k1>3)
	k1=0;
	if(k2>3)
	k2=0;
	
	 
	
	
    if (x >= 0 && y >= 0) {
        //getch();        
     
        kursor.X = x;
        kursor.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), kursor);
       
		switch(n)
		{
			
			case 0:
		funz[0]();
	    
    
     
			break;
			case 1:
	    funz[1]();
	    
     
    
			break;
			case 2:
		funz[2]();

     
	
			break;
			case 3:
		funz[3]();
	
    
	
			break;
			
			case 4:
				funz[4]();
			break;
				case 5:
				funz[5]();
			break;
		}
		
        
	}



}

/*ascoltatore di tastiera*/
void *listner(void *)
{
 
	int c = 0;
    while(1)
    {
    	
    
        c = 0;

        switch((c=getch())) {
        case SPAZIO:
       
        	if(var)
        	{
         
         	pthread_mutex_lock(&mutex);  
            var=0;
            t=0;
			}
			else
			{
			pthread_mutex_unlock(&mutex);
			pthread_cond_signal( &cond ); 
			var=1;
			t=0;
			
			}
		
            break;
        
        
        }

    }
	
}

/*funzione ruota associata ai thread*/
void *ruota(void *arg)
{
	
	
	int k=5;
    t=0;
    static int punti=0;

	coord *y=(coord *)arg;
	while(true)
	{
		
	t+=20;
    pthread_mutex_lock(&mutex);
   //_beep(80-t/100,80);
    _beep(200-t/100,70);
   

	
	while(!var)
	{
		 rc = pthread_cond_wait(&cond, &mutex);
		
	}
   
	
    if(t==400)
    {
    	
         /*stampa(r0,0);
		 cout<<endl;
		 stampa(r1,1);
		 cout<<endl;
		 stampa(r2,2);
		 cout<<endl;*/
		 int y=cerca(r0,r1,r2);
		 if(y!=99)
		 {
		 	
		 	//gotoxy(25,15,4,9);
		 	SetConsoleTextAttribute(output, COMMON_LVB_REVERSE_VIDEO|FOREGROUND_INTENSITY);
			 SetTextXY(0, y*2+5, "WINNER", 5, 2);
			  
		 }
		 else
		 {
		   
		 }
		 	
    rc = pthread_cond_wait(&cond, &mutex);	
    	
	}
    
 

 
 
 
	gotoxy(y->x+k*(y->numero_ruota),y->y,rand()%4,y->numero_ruota);
	gotoxy(y->x+k*(y->numero_ruota),(y->y)+2,rand()%4,y->numero_ruota);
    gotoxy(y->x+k*(y->numero_ruota),(y->y)+4,rand()%4,y->numero_ruota);
	gotoxy(y->x+k*(y->numero_ruota),(y->y)+6,rand()%4,y->numero_ruota);

	Sleep(10+t);


pthread_mutex_unlock(&mutex);

	
}
	
}
int main(int argc, char *argv[])
{
cout<<"***********************Piccola Slot*********************\n";
cout<<"          ***Premi invio piu volte per girare***\n";
cout<<"           ***Copyright@ Alessandro Barazzuol***\n";
	
srand(time(0));
coord **p;
p=new coord*[3];
for(int i=0;i<3;i++)
p[i]=new coord;

p[0]->x=10;
p[0]->numero_ruota=0;
p[0]->y=5;
p[1]->x=25;
p[1]->numero_ruota=1;
p[1]->y=5;
p[2]->x=40;
p[2]->numero_ruota=2;
p[2]->y=5;
pthread_t t1,t2,t3,list;

pthread_create(&t1,NULL,&ruota,(void *)p[0]);
pthread_create(&t2,NULL,&ruota,(void *)p[1]);
pthread_create(&t3,NULL,&ruota,(void *)p[2]);
pthread_create(&list,NULL,&listner,NULL);
Sleep(1);

pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(list,NULL);

	
}