Piccola Slot

/***
 *     +-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
 *     |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 rc;
int t;
int var=0,var1=0;
struct coord
{
	int x,y;
	int numero_ruota;
};



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

void quadrato()
{
SetConsoleTextAttribute(output, FOREGROUND_GREEN|FOREGROUND_INTENSITY);
	cout<<" |"<<(char)147<<"| ";
}
void cerchio()
{
SetConsoleTextAttribute(output,FOREGROUND_INTENSITY|FOREGROUND_INTENSITY);
	  cout<<" ("<<(char)184<<") ";
}
void punto()
{
SetConsoleTextAttribute(output, FOREGROUND_BLUE|FOREGROUND_INTENSITY);
	 cout<<" *"<<(char)36<<"* ";
}


/*array di funzioni per i simboli*/
void (* funz[4])(void)={triangolo,quadrato,cerchio,punto};

void gotoxy(int x, int y,int n) {
	
    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;
			
		}
	
	}

}
/*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;
    

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

	
	while(!var)
        rc = pthread_cond_wait(&cond, &mutex);
	
        if(t==500)
        rc = pthread_cond_wait(&cond, &mutex);
 
	gotoxy(y->x+k*(y->numero_ruota),y->y,rand()%4);
	gotoxy(y->x+k*(y->numero_ruota),(y->y)+2,rand()%4);
        gotoxy(y->x+k*(y->numero_ruota),(y->y)+4,rand()%4);
	gotoxy(y->x+k*(y->numero_ruota),(y->y)+6,rand()%4);

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

	
}