/***
* +-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
* |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);
}
Post Views: 484