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